From: Joe Tsai Date: Tue, 22 Sep 2015 08:17:01 +0000 (-0700) Subject: compress/zlib: detect truncated streams X-Git-Tag: go1.6beta1~946 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b1797390b95d1ffd3d97b19532bf451719d42fd5;p=gostls13.git compress/zlib: detect truncated streams Reader failed to detect truncated streams since calls to io.ReadFull did not check if the error is io.EOF. Change-Id: I86c497519daaaccefc6eb5617ddcd8fd3b99f51b Reviewed-on: https://go-review.googlesource.com/14835 Reviewed-by: Nigel Tao TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- diff --git a/src/compress/zlib/reader.go b/src/compress/zlib/reader.go index 816f1bf6bd..78ea7043bc 100644 --- a/src/compress/zlib/reader.go +++ b/src/compress/zlib/reader.go @@ -101,6 +101,9 @@ func (z *reader) Read(p []byte) (n int, err error) { // Finished file; check checksum. if _, err := io.ReadFull(z.r, z.scratch[0:4]); err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } z.err = err return 0, err } @@ -130,6 +133,9 @@ func (z *reader) Reset(r io.Reader, dict []byte) error { } _, err := io.ReadFull(z.r, z.scratch[0:2]) if err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } return err } h := uint(z.scratch[0])<<8 | uint(z.scratch[1]) @@ -140,6 +146,9 @@ func (z *reader) Reset(r io.Reader, dict []byte) error { if haveDict { _, err = io.ReadFull(z.r, z.scratch[0:4]) if err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } return err } checksum := uint32(z.scratch[0])<<24 | uint32(z.scratch[1])<<16 | uint32(z.scratch[2])<<8 | uint32(z.scratch[3]) diff --git a/src/compress/zlib/reader_test.go b/src/compress/zlib/reader_test.go index 218ccba141..449f4460bc 100644 --- a/src/compress/zlib/reader_test.go +++ b/src/compress/zlib/reader_test.go @@ -22,6 +22,30 @@ type zlibTest struct { // http://www.zlib.net/zpipe.c var zlibTests = []zlibTest{ + { + "truncated empty", + "", + []byte{}, + nil, + io.ErrUnexpectedEOF, + }, + { + "truncated dict", + "", + []byte{0x78, 0xbb}, + []byte{0x00}, + io.ErrUnexpectedEOF, + }, + { + "truncated checksum", + "", + []byte{0x78, 0xbb, 0x00, 0x01, 0x00, 0x01, 0xca, 0x48, + 0xcd, 0xc9, 0xc9, 0xd7, 0x51, 0x28, 0xcf, 0x2f, + 0xca, 0x49, 0x01, 0x04, 0x00, 0x00, 0xff, 0xff, + }, + []byte{0x00}, + io.ErrUnexpectedEOF, + }, { "empty", "",