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>
diff --git a/internal/encoding/text/decode.go b/internal/encoding/text/decode.go
index 8ab2eb4..b497090 100644
--- a/internal/encoding/text/decode.go
+++ b/internal/encoding/text/decode.go
@@ -449,7 +449,7 @@
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 @@
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 @@
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
diff --git a/internal/encoding/text/decode_test.go b/internal/encoding/text/decode_test.go
index 41c5e6d..25ef83a 100644
--- a/internal/encoding/text/decode_test.go
+++ b/internal/encoding/text/decode_test.go
@@ -462,6 +462,30 @@
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 @@
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()