aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume J. Charmes <guillaume@charmes.net>2014-05-15 15:18:05 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2014-05-15 15:18:05 -0700
commit6d63d4f3be32bfd3dbc57fe6872d315369c59c6d (patch)
treedb16aed1e03654f4633d08f1112a53d5f600c390
parent8c8c260d2eecae480f99fcc336ab0e6fc15b23c4 (diff)
downloadgo-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.go3
-rw-r--r--src/pkg/archive/tar/reader_test.go16
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)
+ }
+
+}