From 4f08d5355fb9bbe5c007c2534bf5b80983c9e128 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Sun, 20 Oct 2013 21:16:03 +0000 Subject: [PATCH] fix bug where escape characters were getting dropped when operating under `dirty_strings' --- src/jsx_decoder.erl | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index a858257..03b1d5a 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -631,12 +631,10 @@ strip_continuations(<>, Handler, Acc, Stack, Config, _) -> %% this all gets really gross and should probably eventually be folded into %% but for now it fakes being part of string on incompletes and errors +unescape(<>, Handler, Acc, Stack, Config=#config{dirty_strings=true}) -> + string(<>, Handler, acc_seq(Acc, ?rsolidus), Stack, Config); unescape(<>, Handler, Acc, Stack, Config=#config{dirty_strings=true}) -> - case C of - ?doublequote -> string(Rest, Handler, acc_seq(Acc, C), Stack, Config); - ?rsolidus -> string(<>, Handler, acc_seq(Acc, ?rsolidus), Stack, Config); - _ -> string(Rest, Handler, acc_seq(Acc, [?rsolidus, C]), Stack, Config) - end; + string(Rest, Handler, acc_seq(Acc, [?rsolidus, C]), Stack, Config); unescape(<<$b, Rest/binary>>, Handler, Acc, Stack, Config) -> string(Rest, Handler, acc_seq(Acc, maybe_replace($\b, Config)), Stack, Config); unescape(<<$f, Rest/binary>>, Handler, Acc, Stack, Config) -> @@ -1367,6 +1365,16 @@ dirty_string_test_() -> <<"[\"", 0, "\"]">>, [dirty_strings] }, + {"dirty 0\\\"0", + [start_array, {string, <<0, ?rsolidus, ?doublequote, 0>>}, end_array, end_json], + <<"[\"", 0, ?rsolidus, ?doublequote, 0, "\"]">>, + [dirty_strings] + }, + {"dirty 0\\\\\"0", + [start_array, {string, <<0, ?rsolidus, ?rsolidus, ?doublequote, 0>>}, end_array, end_json], + <<"[\"", 0, ?rsolidus, ?rsolidus, ?doublequote, 0, "\"]">>, + [dirty_strings] + }, {"dirty 16#d800", [start_array, {string, <<237, 160, 128>>}, end_array, end_json], <<"[\"", 237, 160, 128, "\"]">>,