diff options
| author | cuiweixie <cuiweixie@gmail.com> | 2022-08-08 16:48:55 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-08-08 17:29:13 +0000 |
| commit | 9903ab546938639c93a616c00b80cd94683e2779 (patch) | |
| tree | 158a0eaeef24ea711b1f25fb8dd56aa40f7d440a /src/encoding/binary | |
| parent | 0a86cd6857b9fb12a798b3dbcfb6974384aa07d6 (diff) | |
| download | go-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.go | 9 | ||||
| -rw-r--r-- | src/encoding/binary/varint_test.go | 6 |
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) } } |
