]> Cypherpunks repositories - gostls13.git/commitdiff
compress/zlib: detect truncated streams
authorJoe Tsai <joetsai@digital-static.net>
Tue, 22 Sep 2015 08:17:01 +0000 (01:17 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 30 Sep 2015 22:47:28 +0000 (22:47 +0000)
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 <nigeltao@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/compress/zlib/reader.go
src/compress/zlib/reader_test.go

index 816f1bf6bd06e73dd24b781a2af8839fb08e25b9..78ea7043bcee353987e41b8ca210634247b75ad9 100644 (file)
@@ -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])
index 218ccba14110fcdcd0a64a778891c377d454284b..449f4460bcd3baa0d9b98b7c4f32b974b85b3d86 100644 (file)
@@ -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",
                "",