diff options
| author | teivah <t.harsanyi@thebeat.co> | 2022-05-03 09:54:48 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-05-03 18:30:15 +0000 |
| commit | 8a5845e4e34c046758af3729acf9221b8b6c01ae (patch) | |
| tree | 2782684e39238f6040cf89bae835a008e7ff348b /src/encoding/base32 | |
| parent | 35d02791b990082fe80da54352050bd095ebd1e7 (diff) | |
| download | go-8a5845e4e34c046758af3729acf9221b8b6c01ae.tar.xz | |
encoding/base32: decoder output depends on chunking of underlying reader
After an analysis, I figured that a way to do it could be to check, after
the call to readEncodedData whether the decoder already saw the end or not.
Fixes #38657
Change-Id: I06fd718ea4ee6ded2cb26c2866b28581ad86e271
GitHub-Last-Rev: d0b7bb38e4301a2ae9b8e588944488dbd88b39c4
GitHub-Pull-Request: golang/go#52631
Reviewed-on: https://go-review.googlesource.com/c/go/+/403315
Run-TryBot: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src/encoding/base32')
| -rw-r--r-- | src/encoding/base32/base32.go | 3 | ||||
| -rw-r--r-- | src/encoding/base32/base32_test.go | 52 |
2 files changed, 55 insertions, 0 deletions
diff --git a/src/encoding/base32/base32.go b/src/encoding/base32/base32.go index 5f3af4c8bb..fa6e42e26c 100644 --- a/src/encoding/base32/base32.go +++ b/src/encoding/base32/base32.go @@ -445,6 +445,9 @@ func (d *decoder) Read(p []byte) (n int, err error) { if d.nbuf < min { return 0, d.err } + if nn > 0 && d.end { + return 0, CorruptInputError(0) + } // Decode chunk into p, or d.out and then p if p is too small. var nr int diff --git a/src/encoding/base32/base32_test.go b/src/encoding/base32/base32_test.go index dbd2b613b4..323d04e68b 100644 --- a/src/encoding/base32/base32_test.go +++ b/src/encoding/base32/base32_test.go @@ -627,6 +627,58 @@ func TestBufferedDecodingSameError(t *testing.T) { } } +func TestBufferedDecodingPadding(t *testing.T) { + testcases := []struct { + chunks []string + expectedError string + }{ + {[]string{ + "I4======", + "==", + }, "unexpected EOF"}, + + {[]string{ + "I4======N4======", + }, "illegal base32 data at input byte 2"}, + + {[]string{ + "I4======", + "N4======", + }, "illegal base32 data at input byte 0"}, + + {[]string{ + "I4======", + "========", + }, "illegal base32 data at input byte 0"}, + + {[]string{ + "I4I4I4I4", + "I4======", + "I4======", + }, "illegal base32 data at input byte 0"}, + } + + for _, testcase := range testcases { + testcase := testcase + pr, pw := io.Pipe() + go func() { + for _, chunk := range testcase.chunks { + _, _ = pw.Write([]byte(chunk)) + } + _ = pw.Close() + }() + + decoder := NewDecoder(StdEncoding, pr) + _, err := io.ReadAll(decoder) + + if err == nil && len(testcase.expectedError) != 0 { + t.Errorf("case %q: got nil error, want %v", testcase.chunks, testcase.expectedError) + } else if err.Error() != testcase.expectedError { + t.Errorf("case %q: got %v, want %v", testcase.chunks, err, testcase.expectedError) + } + } +} + func TestEncodedDecodedLen(t *testing.T) { type test struct { in int |
