diff options
author | Russ Cox <rsc@golang.org> | 2019-03-01 12:03:41 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2019-03-05 18:37:55 +0000 |
commit | a125bdb49b9aa96f3185ae4dfcc0f6d13b998724 (patch) | |
tree | b2742657a8554224c4b5b59709468b293dbd96c9 /src/encoding/base64 | |
parent | 2f8d2427d9751ab5ebdc64ec68ee8e2c0252d8d4 (diff) | |
download | go-a125bdb49b9aa96f3185ae4dfcc0f6d13b998724.tar.gz go-a125bdb49b9aa96f3185ae4dfcc0f6d13b998724.zip |
encoding/base64: do not slice past output unnecessarily
Base64-encoding 32 bytes results in a 44-byte string.
While in general a 44-byte string might decode to 33 bytes,
if you take a 44-byte string that actually only encodes 32 bytes,
and you try to decode it into 32 bytes, that should succeed.
Instead it fails trying to do a useless dst[33:] slice operation.
Delete that slice operation.
Noticed while preparing CL 156322.
Change-Id: I8024bf28a65e2638675b980732b2ff91c66c62cf
Reviewed-on: https://go-review.googlesource.com/c/go/+/164628
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/encoding/base64')
-rw-r--r-- | src/encoding/base64/base64.go | 7 | ||||
-rw-r--r-- | src/encoding/base64/base64_test.go | 15 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/encoding/base64/base64.go b/src/encoding/base64/base64.go index a90e4dfa12..a7da7747ef 100644 --- a/src/encoding/base64/base64.go +++ b/src/encoding/base64/base64.go @@ -282,7 +282,7 @@ func (e CorruptInputError) Error() string { func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err error) { // Decode quantum using the base64 alphabet var dbuf [4]byte - dinc, dlen := 3, 4 + dlen := 4 for j := 0; j < len(dbuf); j++ { if len(src) == si { @@ -292,7 +292,7 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err case j == 1, enc.padChar != NoPadding: return si, 0, CorruptInputError(si - j) } - dinc, dlen = j-1, j + dlen = j break } in := src[si] @@ -344,7 +344,7 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err // trailing garbage err = CorruptInputError(si) } - dinc, dlen = 3, j + dlen = j break } @@ -369,7 +369,6 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err return si, 0, CorruptInputError(si - 2) } } - dst = dst[dinc:] return si, dlen - 1, err } diff --git a/src/encoding/base64/base64_test.go b/src/encoding/base64/base64_test.go index beb63d7c5a..bc67036f5b 100644 --- a/src/encoding/base64/base64_test.go +++ b/src/encoding/base64/base64_test.go @@ -11,6 +11,7 @@ import ( "io" "io/ioutil" "reflect" + "runtime/debug" "strings" "testing" "time" @@ -247,6 +248,20 @@ func TestDecodeCorrupt(t *testing.T) { } } +func TestDecodeBounds(t *testing.T) { + var buf [32]byte + s := StdEncoding.EncodeToString(buf[:]) + defer func() { + if err := recover(); err != nil { + t.Fatalf("Decode panicked unexpectedly: %v\n%s", err, debug.Stack()) + } + }() + n, err := StdEncoding.Decode(buf[:], []byte(s)) + if n != len(buf) || err != nil { + t.Fatalf("StdEncoding.Decode = %d, %v, want %d, nil", n, err, len(buf)) + } +} + func TestEncodedLen(t *testing.T) { for _, tt := range []struct { enc *Encoding |