]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: Do not panic on Read if uninitialized
authorGuillaume J. Charmes <guillaume@charmes.net>
Thu, 15 May 2014 22:18:05 +0000 (15:18 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 15 May 2014 22:18:05 +0000 (15:18 -0700)
Calling tar.Reader.Read() used to work fine, but without this patch it panics.
Simply return EOF to indicate the tar.Reader.Next() needs to be called.

LGTM=iant, bradfitz
R=golang-codereviews, bradfitz, iant, mikioh.mikioh, dominik.honnef
CC=golang-codereviews
https://golang.org/cl/94530043

src/pkg/archive/tar/reader.go
src/pkg/archive/tar/reader_test.go

index e6ac538aad8dcac492ae73aaa5038a94dc9fa723..920a9b08f902032b37fb37ca523079cb78caab4f 100644 (file)
@@ -724,6 +724,9 @@ func (tr *Reader) numBytes() int64 {
 // It returns 0, io.EOF when it reaches the end of that entry,
 // until Next is called to advance to the next entry.
 func (tr *Reader) Read(b []byte) (n int, err error) {
+       if tr.curr == nil {
+               return 0, io.EOF
+       }
        n, err = tr.curr.Read(b)
        if err != nil && err != io.EOF {
                tr.err = err
index ed058978cc2688b4cbe995b3a6d1eeb5143852db..9601ffe459767b2b0a585331b1008eab0b747829 100644 (file)
@@ -725,3 +725,19 @@ func TestReadGNUSparseMap1x0(t *testing.T) {
                t.Errorf("Incorrect sparse map: got %v, wanted %v", sp, expected)
        }
 }
+
+func TestUninitializedRead(t *testing.T) {
+       test := gnuTarTest
+       f, err := os.Open(test.file)
+       if err != nil {
+               t.Fatalf("Unexpected error: %v", err)
+       }
+       defer f.Close()
+
+       tr := NewReader(f)
+       _, err = tr.Read([]byte{})
+       if err == nil || err != io.EOF {
+               t.Errorf("Unexpected error: %v, wanted %v", err, io.EOF)
+       }
+
+}