encoding/base32: use correct length for unpadded buffer in Read

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>
diff --git a/src/encoding/base32/base32.go b/src/encoding/base32/base32.go
index 4a61199..9e988ef 100644
--- a/src/encoding/base32/base32.go
+++ b/src/encoding/base32/base32.go
@@ -467,7 +467,7 @@
 	}
 
 	// Read a chunk.
-	nn := len(p) / 5 * 8
+	nn := (len(p) + 4) / 5 * 8
 	if nn < 8 {
 		nn = 8
 	}
diff --git a/src/encoding/base32/base32_test.go b/src/encoding/base32/base32_test.go
index 33638ad..f5d3c49 100644
--- a/src/encoding/base32/base32_test.go
+++ b/src/encoding/base32/base32_test.go
@@ -92,6 +92,43 @@
 	}
 }
 
+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)))