]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/base32: use correct length for unpadded buffer in Read
authorNiklas Ott <ceriath12@gmail.com>
Wed, 24 Apr 2024 13:22:52 +0000 (15:22 +0200)
committerGopher Robot <gobot@golang.org>
Tue, 14 May 2024 16:25:54 +0000 (16:25 +0000)
If unpadded content was passed, in some occassions content was omitted,
because the division result was floored. Ceiling it makes sure all
content is always read.

Fixes #65166

Change-Id: I1d8ee7ef436080483ed8f0e615b70a1013455f92
Reviewed-on: https://go-review.googlesource.com/c/go/+/581415
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/encoding/base32/base32.go
src/encoding/base32/base32_test.go

index 4a61199a59d0d88dba1feed138675be5da03d031..9e988ef39b4f4dfcff2b3690c7044a5dbfdd0828 100644 (file)
@@ -467,7 +467,7 @@ func (d *decoder) Read(p []byte) (n int, err error) {
        }
 
        // Read a chunk.
-       nn := len(p) / 5 * 8
+       nn := (len(p) + 4) / 5 * 8
        if nn < 8 {
                nn = 8
        }
index 33638adeac691313c0a12ab8e1edca32820ac215..f5d3c49e38fbef48781ca87913c35d54672caaa5 100644 (file)
@@ -92,6 +92,43 @@ func TestEncoderBuffering(t *testing.T) {
        }
 }
 
+func TestDecoderBufferingWithPadding(t *testing.T) {
+       for bs := 0; bs <= 12; bs++ {
+               for _, s := range pairs {
+                       decoder := NewDecoder(StdEncoding, strings.NewReader(s.encoded))
+                       buf := make([]byte, len(s.decoded)+bs)
+
+                       var n int
+                       var err error
+                       n, err = decoder.Read(buf)
+
+                       if err != nil && err != io.EOF {
+                               t.Errorf("Read from %q at pos %d = %d, unexpected error %v", s.encoded, len(s.decoded), n, err)
+                       }
+                       testEqual(t, "Decoding/%d of %q = %q, want %q\n", bs, s.encoded, string(buf[:n]), s.decoded)
+               }
+       }
+}
+
+func TestDecoderBufferingWithoutPadding(t *testing.T) {
+       for bs := 0; bs <= 12; bs++ {
+               for _, s := range pairs {
+                       encoded := strings.TrimRight(s.encoded, "=")
+                       decoder := NewDecoder(StdEncoding.WithPadding(NoPadding), strings.NewReader(encoded))
+                       buf := make([]byte, len(s.decoded)+bs)
+
+                       var n int
+                       var err error
+                       n, err = decoder.Read(buf)
+
+                       if err != nil && err != io.EOF {
+                               t.Errorf("Read from %q at pos %d = %d, unexpected error %v", encoded, len(s.decoded), n, err)
+                       }
+                       testEqual(t, "Decoding/%d of %q = %q, want %q\n", bs, encoded, string(buf[:n]), s.decoded)
+               }
+       }
+}
+
 func TestDecode(t *testing.T) {
        for _, p := range pairs {
                dbuf := make([]byte, StdEncoding.DecodedLen(len(p.encoded)))