diff options
| author | Guillaume J. Charmes <guillaume@charmes.net> | 2014-05-15 15:18:05 -0700 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2014-05-15 15:18:05 -0700 |
| commit | 6d63d4f3be32bfd3dbc57fe6872d315369c59c6d (patch) | |
| tree | db16aed1e03654f4633d08f1112a53d5f600c390 | |
| parent | 8c8c260d2eecae480f99fcc336ab0e6fc15b23c4 (diff) | |
| download | go-6d63d4f3be32bfd3dbc57fe6872d315369c59c6d.tar.xz | |
archive/tar: Do not panic on Read if uninitialized
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
| -rw-r--r-- | src/pkg/archive/tar/reader.go | 3 | ||||
| -rw-r--r-- | src/pkg/archive/tar/reader_test.go | 16 |
2 files changed, 19 insertions, 0 deletions
diff --git a/src/pkg/archive/tar/reader.go b/src/pkg/archive/tar/reader.go index e6ac538aad..920a9b08f9 100644 --- a/src/pkg/archive/tar/reader.go +++ b/src/pkg/archive/tar/reader.go @@ -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 diff --git a/src/pkg/archive/tar/reader_test.go b/src/pkg/archive/tar/reader_test.go index ed058978cc..9601ffe459 100644 --- a/src/pkg/archive/tar/reader_test.go +++ b/src/pkg/archive/tar/reader_test.go @@ -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) + } + +} |
