diff options
author | Rob Pike <r@golang.org> | 2009-07-29 15:10:29 -0700 |
---|---|---|
committer | Rob Pike <r@golang.org> | 2009-07-29 15:10:29 -0700 |
commit | 517b830fc3b0c2a92a78ac5a247fc55887851f78 (patch) | |
tree | 228eff533d96d815e6a3d6da5663e92f5fb6b62c /src/pkg/gob/decoder.go | |
parent | 475f98271e13aa68604ad6dcb90b32067667cb9d (diff) | |
download | golang-517b830fc3b0c2a92a78ac5a247fc55887851f78.tar.gz |
handle some error conditions involving bad data.
R=rsc
DELTA=32 (24 added, 1 deleted, 7 changed)
OCL=32461
CL=32463
Diffstat (limited to 'src/pkg/gob/decoder.go')
-rw-r--r-- | src/pkg/gob/decoder.go | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/pkg/gob/decoder.go b/src/pkg/gob/decoder.go index 91bfcbbb8..b4c0acdfa 100644 --- a/src/pkg/gob/decoder.go +++ b/src/pkg/gob/decoder.go @@ -64,11 +64,11 @@ func (dec *Decoder) Decode(e interface{}) os.Error { dec.state.err = nil; for { // Read a count. - nbytes, err := decodeUintReader(dec.r, dec.oneByte); - if err != nil { - return err; + var nbytes uint64; + nbytes, dec.state.err = decodeUintReader(dec.r, dec.oneByte); + if dec.state.err != nil { + break; } - // Allocate the buffer. if nbytes > uint64(len(dec.buf)) { dec.buf = make([]byte, nbytes + 1000); @@ -77,12 +77,13 @@ func (dec *Decoder) Decode(e interface{}) os.Error { // Read the data var n int; - n, err = dec.r.Read(dec.buf[0:nbytes]); - if err != nil { - return err; + n, dec.state.err = io.ReadFull(dec.r, dec.buf[0:nbytes]); + if dec.state.err != nil { + break; } if n < int(nbytes) { - return os.ErrorString("gob decode: short read"); + dec.state.err = io.ErrUnexpectedEOF; + break; } // Receive a type id. |