From c5c98482fc8ce03bdeeeca3cd7fc7a4cb93a47d5 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Tue, 26 Jul 2011 19:28:41 -0700 Subject: [PATCH] test for noncharacters, fixed bug discovered by test --- src/jsx.erl | 16 +++++++++++++++- src/jsx_decoder.hrl | 5 +++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/jsx.erl b/src/jsx.erl index 79c831c..b10eda0 100644 --- a/src/jsx.erl +++ b/src/jsx.erl @@ -232,7 +232,9 @@ decode_loop({jsx, end_json, _Next}, Acc) -> decode_loop({jsx, incomplete, More}, Acc) -> decode_loop(More(end_stream), Acc); decode_loop({jsx, E, Next}, Acc) -> - decode_loop(Next(), [E] ++ Acc). + decode_loop(Next(), [E] ++ Acc); +decode_loop({error, {badjson, _Error}}, _Acc) -> + {error, badjson}. incremental_decode(<>, Flags) -> @@ -249,6 +251,17 @@ incremental_decode_loop({jsx, Event, Next}, Rest, Acc) -> incremental_decode_loop(Next(), Rest, [Event] ++ Acc). +bad_escapes_test_() -> + [ + {"null byte", + ?_assertEqual({error, badjson}, decode(<<"\"\\u0000\"">>, [])) + }, + {"escaped noncharacter", + ?_assertEqual({error, badjson}, decode(<<"\"\\ud83f\\udfff\"">>, [])) + } + ]. + + multi_decode_test_() -> [ {"multiple values in a single stream", ?_assert( @@ -290,5 +303,6 @@ multi_test_result() -> ]. + -endif. \ No newline at end of file diff --git a/src/jsx_decoder.hrl b/src/jsx_decoder.hrl index 1bb8331..398b172 100644 --- a/src/jsx_decoder.hrl +++ b/src/jsx_decoder.hrl @@ -542,9 +542,10 @@ low_surrogate(<>, Stack, Opts, String, [C, B, A], High) X when X >= 16#dc00, X =< 16#dfff -> V = surrogate_to_codepoint(High, X), case V rem 16#10000 of - X when X == 16#fffe; X == 16#ffff -> + Y when Y == 16#fffe; Y == 16#ffff -> {error, {badjson, <>}} - ; _ -> + ; Y -> + io:format("~p ~p~n", [V, Y]), string(Rest, Stack, Opts, <>) end %% not a low surrogate, bad bad bad