From e69d62f37523575bf5d2e053ee7598ea95944da2 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Mon, 25 Feb 2013 21:32:27 -0800 Subject: [PATCH] fix sort of a bug with escape sequences --- src/jsx_decoder.erl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index 98057c3..0290a2e 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -613,11 +613,16 @@ escape(<<$u, A, B, C, D, ?rsolidus, $u, W, X, Y, Z, Rest/binary>>, Handler, Acc, _ -> ?error([<<$u, A, B, C, D, ?rsolidus, $u, W, X, Y, Z, Rest/binary>>, Handler, Stack, Config]) end; -escape(<<$u, A, B, C, D, Rest/binary>>, Handler, Acc, Stack, Config) +escape(<<$u, A, B, C, D, Rest/binary>> = Bin, Handler, Acc, Stack, Config) when ?is_hex(A), ?is_hex(B), ?is_hex(C), ?is_hex(D) -> case erlang:list_to_integer([A, B, C, D], 16) of Codepoint when Codepoint >= 16#d800, Codepoint =< 16#dfff -> - ?incomplete(string, <>, Handler, Acc, Stack, Config); + case is_partial_escape(Bin) of + true -> + ?incomplete(string, <>, Handler, Acc, Stack, Config); + false -> + ?error([Bin, Handler, Acc, Stack, Config]) + end; Codepoint when Codepoint =< 16#d7ff; Codepoint >= 16#e000 -> string(Rest, Handler, ?acc_seq(Acc, maybe_replace(Codepoint, Config)), Stack, Config); _ when Config#config.replaced_bad_utf8 == true ->