diff options
author | Joe Tsai <joetsai@digital-static.net> | 2015-09-30 13:35:03 -0700 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2015-09-30 22:10:44 +0000 |
commit | b72a4a07c257f394f5a96dff29a4fc862601a41f (patch) | |
tree | 6579657426318980ebc3d3276d2b3ab151a1bc30 /src/encoding/binary | |
parent | e01be84149b8189a58815ab75a86984e58d203e2 (diff) | |
download | go-b72a4a07c257f394f5a96dff29a4fc862601a41f.tar.gz go-b72a4a07c257f394f5a96dff29a4fc862601a41f.zip |
encoding/binary: document that Read returns io.EOF iff zero bytes are read
Also add a unit test to lock this behavior into the API.
Fixes #12016
Change-Id: Ib6ec6e7948f0705f3504ede9143b5dc4e790fc44
Reviewed-on: https://go-review.googlesource.com/15171
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/encoding/binary')
-rw-r--r-- | src/encoding/binary/binary.go | 4 | ||||
-rw-r--r-- | src/encoding/binary/binary_test.go | 30 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/encoding/binary/binary.go b/src/encoding/binary/binary.go index 2bbe07c02f..1c2577b68d 100644 --- a/src/encoding/binary/binary.go +++ b/src/encoding/binary/binary.go @@ -135,6 +135,10 @@ func (bigEndian) GoString() string { return "binary.BigEndian" } // blank (_) field names is skipped; i.e., blank field names // may be used for padding. // When reading into a struct, all non-blank fields must be exported. +// +// The error is EOF only if no bytes were read. +// If an EOF happens after reading some but not all the bytes, +// Read returns ErrUnexpectedEOF. func Read(r io.Reader, order ByteOrder, data interface{}) error { // Fast path for basic types and slices. if n := intDataSize(data); n != 0 { diff --git a/src/encoding/binary/binary_test.go b/src/encoding/binary/binary_test.go index 8ee595fa47..7fd36fa4ef 100644 --- a/src/encoding/binary/binary_test.go +++ b/src/encoding/binary/binary_test.go @@ -309,6 +309,36 @@ func TestReadErrorMsg(t *testing.T) { read(&p) } +func TestReadTruncated(t *testing.T) { + const data = "0123456789abcdef" + + var b1 = make([]int32, 4) + var b2 struct { + A, B, C, D byte + E int32 + F float64 + } + + for i := 0; i <= len(data); i++ { + var errWant error + switch i { + case 0: + errWant = io.EOF + case len(data): + errWant = nil + default: + errWant = io.ErrUnexpectedEOF + } + + if err := Read(strings.NewReader(data[:i]), LittleEndian, &b1); err != errWant { + t.Errorf("Read(%d) with slice: got %v, want %v", i, err, errWant) + } + if err := Read(strings.NewReader(data[:i]), LittleEndian, &b2); err != errWant { + t.Errorf("Read(%d) with struct: got %v, want %v", i, err, errWant) + } + } +} + type byteSliceReader struct { remain []byte } |