]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/base64: do not slice past output unnecessarily
authorRuss Cox <rsc@golang.org>
Fri, 1 Mar 2019 17:03:41 +0000 (12:03 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 5 Mar 2019 18:37:55 +0000 (18:37 +0000)
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>
src/encoding/base64/base64.go
src/encoding/base64/base64_test.go

index a90e4dfa1270a276b39544dde17c590768ddf73a..a7da7747ef63a9e3f4e571719e75180485b2618b 100644 (file)
@@ -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
 }
index beb63d7c5ae465b593618ec09df6578f30f62852..bc67036f5bcfbb81e1b8ddaf2f300599f29962c1 100644 (file)
@@ -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