Reviewers: golang-dev_googlegroups.com,
Message:
Hello golang-dev@googlegroups.com (cc: golang-dev@googlegroups.com),
I'd like you to review this change to
https://code.google.com/p/go/
Description:
fmt, encoding/gob: fix misuse of Read
Read() can return both 0,nil and len(buf),err.
Fixes issue 3472.
Please review this at https://codereview.appspot.com/6285050/
Affected files:
M src/pkg/encoding/gob/decode.go
M src/pkg/fmt/scan.go
Index: src/pkg/encoding/gob/decode.go
===================================================================
--- a/src/pkg/encoding/gob/decode.go
+++ b/src/pkg/encoding/gob/decode.go
@@ -62,15 +62,18 @@
// Used only by the Decoder to read the message length.
func decodeUintReader(r io.Reader, buf []byte) (x uint64, width int, err
error) {
width = 1
- _, err = r.Read(buf[0:width])
- if err != nil {
+ n, err := io.ReadFull(r, buf[0:width])
+ if n < 1 {
+ if err == nil {
+ err = io.EOF
+ }
return
}
b := buf[0]
if b <= 0x7f {
return uint64(b), width, nil
}
- n := -int(int8(b))
+ n = -int(int8(b))
if n > uint64Size {
err = errBadUint
return
Index: src/pkg/fmt/scan.go
===================================================================
--- a/src/pkg/fmt/scan.go
+++ b/src/pkg/fmt/scan.go
@@ -337,7 +337,12 @@
r.pending--
return
}
- _, err = r.reader.Read(r.pendBuf[0:1])
+ n, err := r.reader.Read(r.pendBuf[0:1])
+ if n == 1 {
+ err = nil
+ } else if n == 0 && err == nil {
+ err = io.EOF
+ }
return r.pendBuf[0], err
}