aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/binary
diff options
context:
space:
mode:
authorcuiweixie <cuiweixie@gmail.com>2022-08-08 16:48:55 +0000
committerGopher Robot <gobot@golang.org>2022-08-08 17:29:13 +0000
commit9903ab546938639c93a616c00b80cd94683e2779 (patch)
tree158a0eaeef24ea711b1f25fb8dd56aa40f7d440a /src/encoding/binary
parent0a86cd6857b9fb12a798b3dbcfb6974384aa07d6 (diff)
downloadgo-9903ab546938639c93a616c00b80cd94683e2779.tar.xz
encoding/binary: ReadUvarint return io.ErrUnexpectedEOF when read at least 1 byte
Fixes #54139 Change-Id: Ifc73bd7f181b13970ee6a08968f9d8f6e55d7ff3 GitHub-Last-Rev: 1e0a79bd3eb3e4dfcbfd7e9f94e849b3248ffac1 GitHub-Pull-Request: golang/go#54143 Reviewed-on: https://go-review.googlesource.com/c/go/+/420274 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Keith Randall <khr@golang.org> Run-TryBot: Joseph Tsai <joetsai@digital-static.net> Auto-Submit: Keith Randall <khr@golang.org> Reviewed-by: Joseph Tsai <joetsai@digital-static.net> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src/encoding/binary')
-rw-r--r--src/encoding/binary/varint.go9
-rw-r--r--src/encoding/binary/varint_test.go6
2 files changed, 14 insertions, 1 deletions
diff --git a/src/encoding/binary/varint.go b/src/encoding/binary/varint.go
index c807d15f44..18e1ff1511 100644
--- a/src/encoding/binary/varint.go
+++ b/src/encoding/binary/varint.go
@@ -126,12 +126,18 @@ func Varint(buf []byte) (int64, int) {
var overflow = errors.New("binary: varint overflows a 64-bit integer")
// ReadUvarint reads an encoded unsigned integer from r and returns it as a uint64.
+// The error is EOF only if no bytes were read.
+// If an EOF happens after reading some but not all the bytes,
+// ReadUvarint returns io.ErrUnexpectedEOF.
func ReadUvarint(r io.ByteReader) (uint64, error) {
var x uint64
var s uint
for i := 0; i < MaxVarintLen64; i++ {
b, err := r.ReadByte()
if err != nil {
+ if i > 0 && err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
return x, err
}
if b < 0x80 {
@@ -147,6 +153,9 @@ func ReadUvarint(r io.ByteReader) (uint64, error) {
}
// ReadVarint reads an encoded signed integer from r and returns it as an int64.
+// The error is EOF only if no bytes were read.
+// If an EOF happens after reading some but not all the bytes,
+// ReadVarint returns io.ErrUnexpectedEOF.
func ReadVarint(r io.ByteReader) (int64, error) {
ux, err := ReadUvarint(r) // ok to continue in presence of error
x := int64(ux >> 1)
diff --git a/src/encoding/binary/varint_test.go b/src/encoding/binary/varint_test.go
index 080a2148f0..a3caea8a43 100644
--- a/src/encoding/binary/varint_test.go
+++ b/src/encoding/binary/varint_test.go
@@ -128,7 +128,11 @@ func TestBufferTooSmall(t *testing.T) {
}
x, err := ReadUvarint(bytes.NewReader(buf))
- if x != 0 || err != io.EOF {
+ wantErr := io.EOF
+ if i > 0 {
+ wantErr = io.ErrUnexpectedEOF
+ }
+ if x != 0 || err != wantErr {
t.Errorf("ReadUvarint(%v): got x = %d, err = %s", buf, x, err)
}
}