Decode: prevent comments that look like dates to be accepted (#657)

* parser: fix date detection

When the parser has to decide between parsing and integer or a date, it should
check that all characters are actually acceptable (digits, or date/time
elements).

Fixes #655
This commit is contained in:
Thomas Pelletier
2021-11-04 22:06:12 -04:00
committed by GitHub
parent 74d21b367f
commit 11f789ef11
2 changed files with 26 additions and 4 deletions
+2 -4
View File
@@ -692,10 +692,6 @@ func (p *parser) parseSimpleKey(b []byte) (raw, key, rest []byte, err error) {
// simple-key = quoted-key / unquoted-key // simple-key = quoted-key / unquoted-key
// unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _ // unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _
// quoted-key = basic-string / literal-string // quoted-key = basic-string / literal-string
if len(b) == 0 {
return nil, nil, nil, newDecodeError(b, "key is incomplete")
}
switch { switch {
case b[0] == '\'': case b[0] == '\'':
return p.parseLiteralString(b) return p.parseLiteralString(b)
@@ -884,6 +880,8 @@ func (p *parser) parseIntOrFloatOrDateTime(b []byte) (ast.Reference, []byte, err
if idx == 2 && c == ':' || (idx == 4 && c == '-') { if idx == 2 && c == ':' || (idx == 4 && c == '-') {
return p.scanDateTime(b) return p.scanDateTime(b)
} }
break
} }
return p.scanIntOrFloat(b) return p.scanIntOrFloat(b)
+24
View File
@@ -1569,6 +1569,30 @@ B = "data"`,
} }
}, },
}, },
{
desc: "comment that looks like a date",
input: "a=19#9-",
gen: func() test {
doc := map[string]interface{}{}
return test{
target: &doc,
expected: &map[string]interface{}{"a": int64(19)},
}
},
},
{
desc: "comment that looks like a date",
input: "a=199#-",
gen: func() test {
doc := map[string]interface{}{}
return test{
target: &doc,
expected: &map[string]interface{}{"a": int64(199)},
}
},
},
} }
for _, e := range examples { for _, e := range examples {