diff --git a/src/jsx_decoder.hrl b/src/jsx_decoder.hrl index 5f19f6b..1bb8331 100644 --- a/src/jsx_decoder.hrl +++ b/src/jsx_decoder.hrl @@ -540,14 +540,16 @@ low_surrogate(<>, Stack, Opts, String, [C, B, A], High) when ?is_hex(D) -> case erlang:list_to_integer([A, B, C, D], 16) of X when X >= 16#dc00, X =< 16#dfff -> - string(Rest, - Stack, - Opts, - <> - ) + V = surrogate_to_codepoint(High, X), + case V rem 16#10000 of + X when X == 16#fffe; X == 16#ffff -> + {error, {badjson, <>}} + ; _ -> + string(Rest, Stack, Opts, <>) + end %% not a low surrogate, bad bad bad - ; X -> - {error, {badjson, <>}} + ; _ -> + {error, {badjson, <>}} end; low_surrogate(<>, Stack, Opts, String, Acc, High) when ?is_hex(S) ->