From 6c7326b290462372bb6c23462b2087149cf5fcc6 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Thu, 19 May 2022 20:28:13 -0400 Subject: JSON fix: correctly parse UTF-16 surrogate pairs --- libtests/qtest/json_parse.test | 5 ++++- libtests/qtest/json_parse/bad-37.json | 1 + libtests/qtest/json_parse/bad-37.out | 1 + libtests/qtest/json_parse/bad-38.json | 1 + libtests/qtest/json_parse/bad-38.out | 1 + libtests/qtest/json_parse/bad-39.json | 1 + libtests/qtest/json_parse/bad-39.out | 1 + libtests/qtest/json_parse/good-11-react.out | 16 ++++++++++++++++ libtests/qtest/json_parse/good-11.json | 4 ++++ libtests/qtest/json_parse/save-11.json | 13 +++++++++++++ 10 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 libtests/qtest/json_parse/bad-37.json create mode 100644 libtests/qtest/json_parse/bad-37.out create mode 100644 libtests/qtest/json_parse/bad-38.json create mode 100644 libtests/qtest/json_parse/bad-38.out create mode 100644 libtests/qtest/json_parse/bad-39.json create mode 100644 libtests/qtest/json_parse/bad-39.out create mode 100644 libtests/qtest/json_parse/good-11-react.out create mode 100644 libtests/qtest/json_parse/good-11.json create mode 100644 libtests/qtest/json_parse/save-11.json (limited to 'libtests/qtest') diff --git a/libtests/qtest/json_parse.test b/libtests/qtest/json_parse.test index 15b251cc..6d57e92c 100644 --- a/libtests/qtest/json_parse.test +++ b/libtests/qtest/json_parse.test @@ -32,7 +32,7 @@ if ($^O ne 'msys') cleanup(); -my $good = 10; +my $good = 11; for (my $i = 1; $i <= $good; ++$i) { @@ -117,6 +117,9 @@ my @bad = ( "premature end after u", # 34 "bad hex digit", # 35 "parser depth exceeded", # 36 + "stray low surrogate", # 37 + "high high surrogate", # 38 + "dangling high surrogate", # 39 ); my $i = 0; diff --git a/libtests/qtest/json_parse/bad-37.json b/libtests/qtest/json_parse/bad-37.json new file mode 100644 index 00000000..3fd031aa --- /dev/null +++ b/libtests/qtest/json_parse/bad-37.json @@ -0,0 +1 @@ +[1, "u:potato: \udd54", 2] diff --git a/libtests/qtest/json_parse/bad-37.out b/libtests/qtest/json_parse/bad-37.out new file mode 100644 index 00000000..8b811a34 --- /dev/null +++ b/libtests/qtest/json_parse/bad-37.out @@ -0,0 +1 @@ +exception: bad-37.json: JSON: offset 15: UTF-16 low surrogate found not immediately after high surrogate diff --git a/libtests/qtest/json_parse/bad-38.json b/libtests/qtest/json_parse/bad-38.json new file mode 100644 index 00000000..78444f98 --- /dev/null +++ b/libtests/qtest/json_parse/bad-38.json @@ -0,0 +1 @@ +"u:\ud83ezz\ud83ezz" diff --git a/libtests/qtest/json_parse/bad-38.out b/libtests/qtest/json_parse/bad-38.out new file mode 100644 index 00000000..1b4461f1 --- /dev/null +++ b/libtests/qtest/json_parse/bad-38.out @@ -0,0 +1 @@ +exception: bad-38.json: JSON: offset 11: UTF-16 high surrogate found after previous high surrogate at offset 3 diff --git a/libtests/qtest/json_parse/bad-39.json b/libtests/qtest/json_parse/bad-39.json new file mode 100644 index 00000000..2edab94b --- /dev/null +++ b/libtests/qtest/json_parse/bad-39.json @@ -0,0 +1 @@ +"u:\ud83e all alone" diff --git a/libtests/qtest/json_parse/bad-39.out b/libtests/qtest/json_parse/bad-39.out new file mode 100644 index 00000000..a408dba8 --- /dev/null +++ b/libtests/qtest/json_parse/bad-39.out @@ -0,0 +1 @@ +exception: bad-39.json: JSON: offset 3: UTF-16 high surrogate not followed by low surrogate diff --git a/libtests/qtest/json_parse/good-11-react.out b/libtests/qtest/json_parse/good-11-react.out new file mode 100644 index 00000000..6cf3345e --- /dev/null +++ b/libtests/qtest/json_parse/good-11-react.out @@ -0,0 +1,16 @@ +array start +array item: [4, 0): [] +array start +array item: [5, 11): "u:π" +array item: [13, 23): "u:π" +array item: [25, 39): "b:EFBBBFCF80" +array item: [41, 53): "b:feff03c0" +container end: [4, 54): [] +array item: [58, 0): [] +array start +array item: [59, 67): "u:🥔" +array item: [69, 85): "u:🥔" +array item: [87, 103): "b:feffd83eDD54" +container end: [58, 104): [] +container end: [0, 106): [] +[] diff --git a/libtests/qtest/json_parse/good-11.json b/libtests/qtest/json_parse/good-11.json new file mode 100644 index 00000000..0a492795 --- /dev/null +++ b/libtests/qtest/json_parse/good-11.json @@ -0,0 +1,4 @@ +[ + ["u:π", "u:\u03c0", "b:EFBBBFCF80", "b:feff03c0"], + ["u:🥔", "u:\ud83e\udd54", "b:feffd83eDD54"] +] diff --git a/libtests/qtest/json_parse/save-11.json b/libtests/qtest/json_parse/save-11.json new file mode 100644 index 00000000..f935b8bf --- /dev/null +++ b/libtests/qtest/json_parse/save-11.json @@ -0,0 +1,13 @@ +[ + [ + "u:π", + "u:π", + "b:EFBBBFCF80", + "b:feff03c0" + ], + [ + "u:🥔", + "u:🥔", + "b:feffd83eDD54" + ] +] -- cgit v1.2.3-54-g00ecf