summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortompng <[email protected]>2025-01-20 20:42:20 +0900
committerJean Boussier <[email protected]>2025-01-20 14:20:55 +0100
commitc026e44bb557dc42516785beba00452fa462738e (patch)
tree2842d554976bc9c7489c6f7083c3d17a277498cf
parent2b4b7bdb10dc8671bbc9e757f05bb74355891062 (diff)
[ruby/json] Fix parsing incomplete unicode escape "\uaaa"
https://github.com/ruby/json/commit/86c0d4eb7e
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/12602
-rw-r--r--ext/json/parser/parser.c2
-rw-r--r--test/json/json_parser_test.rb8
2 files changed, 9 insertions, 1 deletions
diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c
index 907bd0477b..de72edf4e7 100644
--- a/ext/json/parser/parser.c
+++ b/ext/json/parser/parser.c
@@ -630,7 +630,7 @@ static VALUE json_string_unescape(JSON_ParserState *state, const char *string, c
unescape = (char *) "\f";
break;
case 'u':
- if (pe > stringEnd - 4) {
+ if (pe > stringEnd - 5) {
raise_parse_error("incomplete unicode character escape sequence at '%s'", p);
} else {
uint32_t ch = unescape_unicode((unsigned char *) ++pe);
diff --git a/test/json/json_parser_test.rb b/test/json/json_parser_test.rb
index c5ce02320f..bca8ff287c 100644
--- a/test/json/json_parser_test.rb
+++ b/test/json/json_parser_test.rb
@@ -302,6 +302,14 @@ class JSONParserTest < Test::Unit::TestCase
end
end
+ def test_invalid_unicode_escape
+ assert_raise(JSON::ParserError) { parse('"\u"') }
+ assert_raise(JSON::ParserError) { parse('"\ua"') }
+ assert_raise(JSON::ParserError) { parse('"\uaa"') }
+ assert_raise(JSON::ParserError) { parse('"\uaaa"') }
+ assert_equal "\uaaaa", parse('"\uaaaa"')
+ end
+
def test_parse_big_integers
json1 = JSON(orig = (1 << 31) - 1)
assert_equal orig, parse(json1)