From c7ea7a6f08e8376a254332233b2612f6b4bd72ed Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Mon, 31 May 2010 01:48:07 -0700 Subject: [PATCH] fixed parsing error related to interrupted utf-8 seqences --- src/jsx.erl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/jsx.erl b/src/jsx.erl index 3e89451..9f11ea8 100644 --- a/src/jsx.erl +++ b/src/jsx.erl @@ -262,6 +262,9 @@ key(<<>>, Stack, Callbacks, Opts) -> %% unicode codepoints is faster than constructing binaries, many of which will be %% converted back to lists by the user anyways. +%% the clause starting with Bin is necessary for cases where a stream is broken at a +%% point where it contains only a partial utf-8 sequence. + string(<>, [key|_] = Stack, Callbacks, Opts, Acc) -> colon(Rest, Stack, fold({key, lists:reverse(Acc)}, Callbacks), Opts); string(<>, Stack, Callbacks, Opts, Acc) -> @@ -269,7 +272,9 @@ string(<>, Stack, Callbacks, Opts, Acc) -> string(<>, Stack, Callbacks, Opts, Acc) -> escape(Rest, Stack, Callbacks, Opts, Acc); string(<>, Stack, Callbacks, Opts, Acc) when ?is_noncontrol(S) -> - string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); + string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +string(Bin, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> string(<>, Stack, Callbacks, Opts, Acc) end}; string(<<>>, Stack, Callbacks, Opts, Acc) -> {incomplete, fun(Stream) -> string(Stream, Stack, Callbacks, Opts, Acc) end}.