Skip to content

Commit

Permalink
encoding/base32: use correct length for unpadded buffer in Read
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ceriath authored and gopherbot committed May 14, 2024
1 parent 9fa34d9 commit c7c578c
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/encoding/base32/base32.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
37 changes: 37 additions & 0 deletions src/encoding/base32/base32_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
Expand Down

0 comments on commit c7c578c

Please sign in to comment.