From fb299bd85f7d836e3f0ae7b39ae53dfdc3eebed2 Mon Sep 17 00:00:00 2001 From: Jonas Hietala Date: Mon, 15 Sep 2014 19:12:15 +0200 Subject: [PATCH] json: Properly handle trailing comma error in object decoding. Closes #16945 --- src/libserialize/json.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index 733bc593922..c1068dd2096 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -234,6 +234,7 @@ pub enum ErrorCode { KeyMustBeAString, ExpectedColon, TrailingCharacters, + TrailingComma, InvalidEscape, InvalidUnicodeCodePoint, LoneLeadingSurrogateInHexEscape, @@ -274,6 +275,7 @@ pub fn error_str(error: ErrorCode) -> &'static str { KeyMustBeAString => "key must be a string", ExpectedColon => "expected `:`", TrailingCharacters => "trailing characters", + TrailingComma => "trailing comma", InvalidEscape => "invalid escape", UnrecognizedHex => "invalid \\u escape (unrecognized hex)", NotFourDigit => "invalid \\u escape (not four digits)", @@ -1681,7 +1683,11 @@ impl> Parser { fn parse_object(&mut self, first: bool) -> JsonEvent { if self.ch_is('}') { if !first { - self.stack.pop(); + if self.stack.is_empty() { + return self.error_event(TrailingComma); + } else { + self.stack.pop(); + } } if self.stack.is_empty() { self.state = ParseBeforeFinish; @@ -2377,7 +2383,7 @@ mod tests { F64Value, StringValue, NullValue, SyntaxError, Key, Index, Stack, InvalidSyntax, InvalidNumber, EOFWhileParsingObject, EOFWhileParsingList, EOFWhileParsingValue, EOFWhileParsingString, KeyMustBeAString, ExpectedColon, - TrailingCharacters}; + TrailingCharacters, TrailingComma}; use std::{i64, u64, f32, f64, io}; use std::collections::TreeMap; @@ -3379,6 +3385,7 @@ mod tests { } } } + #[test] #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064) fn test_read_object_streaming() { @@ -3393,6 +3400,7 @@ mod tests { assert_eq!(last_event("{\"a\":1"), Error(SyntaxError(EOFWhileParsingObject, 1, 7))); assert_eq!(last_event("{\"a\":1 1"), Error(SyntaxError(InvalidSyntax, 1, 8))); assert_eq!(last_event("{\"a\":1,"), Error(SyntaxError(EOFWhileParsingObject, 1, 8))); + assert_eq!(last_event("{\"a\":1,}"), Error(SyntaxError(TrailingComma, 1, 8))); assert_stream_equal( "{}",