diff --git a/jlexer/lexer.go b/jlexer/lexer.go index 02ea0f2..ef0aa61 100644 --- a/jlexer/lexer.go +++ b/jlexer/lexer.go @@ -529,6 +529,7 @@ func (r *Lexer) Skip() { func (r *Lexer) SkipRecursive() { r.scanToken() var start, end byte + startPos := r.start switch r.token.delimValue { case '{': @@ -554,6 +555,14 @@ func (r *Lexer) SkipRecursive() { level-- if level == 0 { r.pos += i + 1 + if !json.Valid(r.Data[startPos:r.pos]) { + r.pos = len(r.Data) + r.fatalError = &LexerError{ + Reason: "skipped array/object json value is invalid", + Offset: r.pos, + Data: string(r.Data[r.pos:]), + } + } return } case c == '\\' && inQuotes: diff --git a/jlexer/lexer_test.go b/jlexer/lexer_test.go index 981caa5..cc60179 100644 --- a/jlexer/lexer_test.go +++ b/jlexer/lexer_test.go @@ -201,6 +201,10 @@ func TestSkipRecursive(t *testing.T) { // object with double slashes at the end of string {toParse: `{"a":"hey\\"}, 4`, left: ", 4"}, + + // make sure skipping an invalid json results in an error + {toParse: `{"a": [ ##invalid json## ]}, 4`, wantError: true}, + {toParse: `{"a": [ [1], [ ##invalid json## ]]}, 4`, wantError: true}, } { l := Lexer{Data: []byte(test.toParse)}