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:
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user