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()