Fix lexer.errInvalidToken panic

This commit is contained in:
alexej-v
2018-07-26 14:30:18 +03:00
parent d5012789d6
commit 30bdb172b2
2 changed files with 28 additions and 4 deletions
+9 -4
View File
@@ -240,7 +240,7 @@ func (r *Lexer) fetchNumber() {
// findStringLen tries to scan into the string literal for ending quote char to determine required size.
// The size will be exact if no escapes are present and may be inexact if there are escaped chars.
func findStringLen(data []byte) (hasEscapes bool, length int) {
func findStringLen(data []byte) (isValid, hasEscapes bool, length int) {
delta := 0
for i := 0; i < len(data); i++ {
@@ -252,11 +252,11 @@ func findStringLen(data []byte) (hasEscapes bool, length int) {
delta++
}
case '"':
return (delta > 0), (i - delta)
return true, (delta > 0), (i - delta)
}
}
return false, len(data)
return false, false, len(data)
}
// getu4 decodes \uXXXX from the beginning of s, returning the hex value,
@@ -342,7 +342,12 @@ func (r *Lexer) fetchString() {
r.pos++
data := r.Data[r.pos:]
hasEscapes, length := findStringLen(data)
isValid, hasEscapes, length := findStringLen(data)
if !isValid {
r.pos += length
r.errParse("missing trailing string literal")
return
}
if !hasEscapes {
r.token.byteValue = data[:length]
r.pos += length + 1
+19
View File
@@ -312,3 +312,22 @@ func TestJsonNumber(t *testing.T) {
}
}
}
func TestFetchStringUnterminatedString(t *testing.T) {
for _, test := range []struct {
data []byte
}{
{data: []byte(`"sting without trailing literal`)},
{data: []byte(`"\"`)},
{data: []byte{'"'}},
} {
l := Lexer{Data: test.data}
l.fetchString()
if l.pos > len(l.Data) {
t.Errorf("pos should not be greater than length of Data")
}
if l.Error() == nil {
t.Errorf("fetchString() should add parsing error")
}
}
}