diff options
-rw-r--r-- | ext/json/parser/parser.c | 2 | ||||
-rw-r--r-- | test/json/json_parser_test.rb | 3 |
2 files changed, 5 insertions, 0 deletions
diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c index 351b7f6fac..9cbe2c1d7e 100644 --- a/ext/json/parser/parser.c +++ b/ext/json/parser/parser.c @@ -990,6 +990,8 @@ static VALUE json_parse_any(JSON_ParserState *state, JSON_ParserConfig *config) raise_parse_error("invalid number: %s", start); } else if (RB_UNLIKELY(integer_length > 2 && start[0] == '-' && start[1] == '0')) { raise_parse_error("invalid number: %s", start); + } else if (RB_UNLIKELY(integer_length == 1 && start[0] == '-')) { + raise_parse_error("invalid number: %s", start); } if ((state->cursor < state->end) && (*state->cursor == '.')) { diff --git a/test/json/json_parser_test.rb b/test/json/json_parser_test.rb index 3f009de57c..d1f084bb63 100644 --- a/test/json/json_parser_test.rb +++ b/test/json/json_parser_test.rb @@ -109,6 +109,9 @@ class JSONParserTest < Test::Unit::TestCase assert_raise(JSON::ParserError) { parse('-023.12') } assert_raise(JSON::ParserError) { parse('023e12') } assert_raise(JSON::ParserError) { parse('-023e12') } + assert_raise(JSON::ParserError) { parse('-') } + assert_raise(JSON::ParserError) { parse('-.1') } + assert_raise(JSON::ParserError) { parse('-e0') } assert_equal(23, parse('23')) assert_equal(-23, parse('-23')) assert_equal_float(3.141, parse('3.141')) |