summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/json/parser/parser.c4
-rw-r--r--test/json/json_parser_test.rb7
2 files changed, 10 insertions, 1 deletions
diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c
index 5b7cd835cd..c84c7ed660 100644
--- a/ext/json/parser/parser.c
+++ b/ext/json/parser/parser.c
@@ -651,7 +651,9 @@ static inline const char *json_next_backslash(const char *pe, const char *string
positions->size--;
const char *next_position = positions->positions[0];
positions->positions++;
- return next_position;
+ if (next_position >= pe) {
+ return next_position;
+ }
}
if (positions->has_more) {
diff --git a/test/json/json_parser_test.rb b/test/json/json_parser_test.rb
index 3e662bda32..257e4f1736 100644
--- a/test/json/json_parser_test.rb
+++ b/test/json/json_parser_test.rb
@@ -325,6 +325,13 @@ class JSONParserTest < Test::Unit::TestCase
assert_raise(JSON::ParserError) { parse('"\u111___"') }
end
+ def test_unicode_followed_by_newline
+ # Ref: https://github.com/ruby/json/issues/912
+ assert_equal "🌌\n".bytes, JSON.parse('"\ud83c\udf0c\n"').bytes
+ assert_equal "🌌\n", JSON.parse('"\ud83c\udf0c\n"')
+ assert_predicate JSON.parse('"\ud83c\udf0c\n"'), :valid_encoding?
+ end
+
def test_invalid_surogates
assert_raise(JSON::ParserError) { parse('"\\uD800"') }
assert_raise(JSON::ParserError) { parse('"\\uD800_________________"') }