diff options
| author | Emile Joubert <emile@rabbitmq.com> | 2013-11-12 11:01:56 +0000 |
|---|---|---|
| committer | Emile Joubert <emile@rabbitmq.com> | 2013-11-12 11:01:56 +0000 |
| commit | a9b1019b8819ab83a27d331f5b36298ed77695b3 (patch) | |
| tree | 5dd24d5519f85c48ddd78fe1d50d8b9bf1adeb6b /src | |
| parent | 2fb7fa971adc6df8d816d2a3bcffdfcabbe7129d (diff) | |
| parent | e95bab1372a58ca24b231f9abdfac253bf0686c4 (diff) | |
| download | rabbitmq-server-git-a9b1019b8819ab83a27d331f5b36298ed77695b3.tar.gz | |
Merged bug25860 into default
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_binary_parser.erl | 18 | ||||
| -rw-r--r-- | src/rabbit_control_main.erl | 9 |
2 files changed, 26 insertions, 1 deletions
diff --git a/src/rabbit_binary_parser.erl b/src/rabbit_binary_parser.erl index dc6d090ff0..088ad0e52e 100644 --- a/src/rabbit_binary_parser.erl +++ b/src/rabbit_binary_parser.erl @@ -20,6 +20,7 @@ -export([parse_table/1]). -export([ensure_content_decoded/1, clear_decoded_content/1]). +-export([validate_utf8/1, assert_utf8/1]). %%---------------------------------------------------------------------------- @@ -30,6 +31,8 @@ (rabbit_types:content()) -> rabbit_types:decoded_content()). -spec(clear_decoded_content/1 :: (rabbit_types:content()) -> rabbit_types:undecoded_content()). +-spec(validate_utf8/1 :: (binary()) -> 'ok' | 'error'). +-spec(assert_utf8/1 :: (binary()) -> 'ok'). -endif. @@ -99,3 +102,18 @@ clear_decoded_content(Content = #content{properties_bin = none}) -> Content; clear_decoded_content(Content = #content{}) -> Content#content{properties = none}. + +assert_utf8(B) -> + case validate_utf8(B) of + ok -> ok; + error -> rabbit_misc:protocol_error( + frame_error, "Malformed UTF-8 in shortstr", []) + end. + +validate_utf8(Bin) -> + try + xmerl_ucs:from_utf8(Bin), + ok + catch exit:{ucs, _} -> + error + end. diff --git a/src/rabbit_control_main.erl b/src/rabbit_control_main.erl index 6f36f99df5..f34632867a 100644 --- a/src/rabbit_control_main.erl +++ b/src/rabbit_control_main.erl @@ -706,7 +706,14 @@ unsafe_rpc(Node, Mod, Fun, Args) -> end. call(Node, {Mod, Fun, Args}) -> - rpc_call(Node, Mod, Fun, lists:map(fun list_to_binary/1, Args)). + rpc_call(Node, Mod, Fun, lists:map(fun list_to_binary_utf8/1, Args)). + +list_to_binary_utf8(L) -> + B = list_to_binary(L), + case rabbit_binary_parser:validate_utf8(B) of + ok -> B; + error -> throw({error, {not_utf_8, L}}) + end. rpc_call(Node, Mod, Fun, Args) -> rpc:call(Node, Mod, Fun, Args, ?RPC_TIMEOUT). |
