internal/encoding/text: fix error construction in parseTypeName

Fuzz test caught the following issue --
https://oss-fuzz.com/testcase-detail/6288731021770752

Change-Id: Idcbce7953b465d1b83c01b1d123c9d43907d402a
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/218037
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
This commit is contained in:
Herbie Ong 2020-02-05 14:33:27 -08:00
parent 40cba14b26
commit 2eb18f0e62
2 changed files with 29 additions and 4 deletions

View File

@ -449,7 +449,7 @@ func (d *Decoder) parseTypeName() (Token, error) {
case s[0] == '/', s[0] == '.':
if len(name) > 0 && (name[len(name)-1] == '/' || name[len(name)-1] == '.') {
return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s",
d.in[startPos:len(d.orig)-len(s)+1])
d.orig[startPos:len(d.orig)-len(s)+1])
}
name = append(name, s[0])
s = s[1:]
@ -462,7 +462,7 @@ func (d *Decoder) parseTypeName() (Token, error) {
default:
return Token{}, d.newSyntaxError(
"invalid type URL/extension field name: %s", d.in[startPos:len(d.orig)-len(s)+1])
"invalid type URL/extension field name: %s", d.orig[startPos:len(d.orig)-len(s)+1])
}
}
@ -474,7 +474,7 @@ func (d *Decoder) parseTypeName() (Token, error) {
size := len(name)
if size == 0 || name[0] == '.' || name[size-1] == '.' || name[size-1] == '/' {
return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s",
d.in[startPos:len(d.orig)-len(s)])
d.orig[startPos:len(d.orig)-len(s)])
}
d.in = s

View File

@ -461,6 +461,30 @@ func TestDecoder(t *testing.T) {
in: "[proto.package/]",
want: []R{{E: "invalid type URL/extension field name: [proto.package/"}},
},
{
in: `message_field{[bad@]`,
want: []R{
{K: text.Name},
{K: text.MessageOpen},
{E: `invalid type URL/extension field name: [bad@`},
},
},
{
in: `message_field{[invalid//type]`,
want: []R{
{K: text.Name},
{K: text.MessageOpen},
{E: `invalid type URL/extension field name: [invalid//`},
},
},
{
in: `message_field{[proto.package.]`,
want: []R{
{K: text.Name},
{K: text.MessageOpen},
{E: `invalid type URL/extension field name: [proto.package.`},
},
},
{
in: "[proto.package",
want: []R{{E: eofErr}},
@ -1538,7 +1562,8 @@ m: {
for _, tc := range tests {
t.Run("", func(t *testing.T) {
tc := tc
dec := text.NewDecoder([]byte(tc.in))
in := []byte(tc.in)
dec := text.NewDecoder(in[:len(in):len(in)])
for i, want := range tc.want {
peekTok, peekErr := dec.Peek()
tok, err := dec.Read()