json/jsontext: normalize all invalid Kinds to 0

For #75431

Change-Id: Iafefe952d3c1837e2f4c8c24cae96945d9e5abbf
Reviewed-on: https://go-review.googlesource.com/c/go/+/728380
Reviewed-by: Joseph Tsai <joetsai@digital-static.net>
Auto-Submit: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
Damien Neil 2025-12-08 13:54:15 -08:00 committed by Gopher Robot
parent 00642ee23b
commit 9de6468701
2 changed files with 29 additions and 8 deletions

View File

@ -193,8 +193,8 @@ var decoderErrorTestdata = []struct {
name: jsontest.Name("InvalidStart"),
in: ` #`,
calls: []decoderMethodCall{
{'#', zeroToken, newInvalidCharacterError("#", "at start of value").withPos(" ", ""), ""},
{'#', zeroValue, newInvalidCharacterError("#", "at start of value").withPos(" ", ""), ""},
{0, zeroToken, newInvalidCharacterError("#", "at start of value").withPos(" ", ""), ""},
{0, zeroValue, newInvalidCharacterError("#", "at start of value").withPos(" ", ""), ""},
},
}, {
name: jsontest.Name("StreamN0"),

View File

@ -518,10 +518,31 @@ func (k Kind) String() string {
}
}
// normalize coalesces all possible starting characters of a number as just '0'.
func (k Kind) normalize() Kind {
if k == '-' || ('0' <= k && k <= '9') {
return '0'
}
return k
var normKind = [256]Kind{
'n': 'n',
'f': 'f',
't': 't',
'"': '"',
'{': '{',
'}': '}',
'[': '[',
']': ']',
'-': '0',
'0': '0',
'1': '0',
'2': '0',
'3': '0',
'4': '0',
'5': '0',
'6': '0',
'7': '0',
'8': '0',
'9': '0',
}
// normalize coalesces all possible starting characters of a number as just '0',
// and converts all invalid kinds to 0.
func (k Kind) normalize() Kind {
// A lookup table keeps the inlining cost as low as possible.
return normKind[k]
}