aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/base64
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2019-03-01 12:03:41 -0500
committerRuss Cox <rsc@golang.org>2019-03-05 18:37:55 +0000
commita125bdb49b9aa96f3185ae4dfcc0f6d13b998724 (patch)
treeb2742657a8554224c4b5b59709468b293dbd96c9 /src/encoding/base64
parent2f8d2427d9751ab5ebdc64ec68ee8e2c0252d8d4 (diff)
downloadgo-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.go7
-rw-r--r--src/encoding/base64/base64_test.go15
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