internal/encoding/text: fix eof crash when parsing list of scalars
Need to check for EOF and return proper error.
Bug caught by fuzz test: https://oss-fuzz.com/testcase-detail/6258064955277312.
Change-Id: I63d5c12c301f2ddefc9a0813c13abef40d745e91
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/218258
Reviewed-by: Joe Tsai <[email protected]>
diff --git a/internal/encoding/text/decode.go b/internal/encoding/text/decode.go
index b497090..074e849 100644
--- a/internal/encoding/text/decode.go
+++ b/internal/encoding/text/decode.go
@@ -166,6 +166,9 @@
case ListOpen:
// Next token can be ListClose or comma.
+ if isEOF {
+ return Token{}, io.ErrUnexpectedEOF
+ }
switch ch := d.in[0]; ch {
case ']':
d.popOpenStack()
diff --git a/internal/encoding/text/decode_test.go b/internal/encoding/text/decode_test.go
index 25ef83a..6ad31ce 100644
--- a/internal/encoding/text/decode_test.go
+++ b/internal/encoding/text/decode_test.go
@@ -733,6 +733,15 @@
},
},
{
+ in: `name: [0`,
+ want: []R{
+ {K: text.Name},
+ {K: text.ListOpen},
+ {K: text.Scalar},
+ {E: eofErr},
+ },
+ },
+ {
in: `name: [` + space + `"hello"` + space + `]` + space,
want: []R{
{K: text.Name},