internal/encoding/text/decode: limit errId length

Avoid very long errors returned by limiting the length of what errId
returns to 32 bytes (the value is chosen so that the error will not
be too long yet useful).

Append ellipsis to the returned value to denote that it was truncated.

Change-Id: I232d5192a2d9ad675daa0be0fe0c8518489c2953
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/406694
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Lasse Folger <lassefolger@google.com>
diff --git a/internal/encoding/text/decode.go b/internal/encoding/text/decode.go
index 636e34b..427c62d 100644
--- a/internal/encoding/text/decode.go
+++ b/internal/encoding/text/decode.go
@@ -655,7 +655,11 @@
 // errId extracts a byte sequence that looks like an invalid ID
 // (for the purposes of error reporting).
 func errId(seq []byte) []byte {
+	const maxLen = 32
 	for i := 0; i < len(seq); {
+		if i > maxLen {
+			return append(seq[:i:i], "…"...)
+		}
 		r, size := utf8.DecodeRune(seq[i:])
 		if r > utf8.RuneSelf || (r != '/' && isDelim(byte(r))) {
 			if i == 0 {
diff --git a/internal/encoding/text/decode_test.go b/internal/encoding/text/decode_test.go
index 65fd2f9..e4dfbf2 100644
--- a/internal/encoding/text/decode_test.go
+++ b/internal/encoding/text/decode_test.go
@@ -405,6 +405,10 @@
 			want: []R{{E: "invalid field name: \uFFFD"}},
 		},
 		{
+			in:   "-a234567890123456789012345678901234567890abc",
+			want: []R{{E: "invalid field name: -a2345678901234567890123456789012…"}},
+		},
+		{
 			in: "[type]",
 			want: []R{
 				{K: text.Name, T: NT{K: text.TypeName, S: "type"}, RS: "[type]"},