Skip to content

Commit 02f4084

Browse files
osocuriosodsymonds
authored andcommitted
archive/tar: don't panic on negative file size
Fixes #10959. Fixes #10960. Change-Id: I9a81a0e2b8275338d0d1c3f7f7265e0fd91f3de2 Reviewed-on: https://go-review.googlesource.com/10402 TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Symonds <dsymonds@golang.org>
1 parent 6551803 commit 02f4084

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

src/archive/tar/reader.go

+4
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,10 @@ func (tr *Reader) readHeader() *Header {
463463
hdr.Uid = int(tr.octal(s.next(8)))
464464
hdr.Gid = int(tr.octal(s.next(8)))
465465
hdr.Size = tr.octal(s.next(12))
466+
if hdr.Size < 0 {
467+
tr.err = ErrHeader
468+
return nil
469+
}
466470
hdr.ModTime = time.Unix(tr.octal(s.next(12)), 0)
467471
s.next(8) // chksum
468472
hdr.Typeflag = s.next(1)[0]

src/archive/tar/reader_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -741,3 +741,19 @@ func TestUninitializedRead(t *testing.T) {
741741
}
742742

743743
}
744+
745+
// Negative header size should not cause panic.
746+
// Issues 10959 and 10960.
747+
func TestNegativeHdrSize(t *testing.T) {
748+
f, err := os.Open("testdata/neg-size.tar")
749+
if err != nil {
750+
t.Fatal(err)
751+
}
752+
defer f.Close()
753+
r := NewReader(f)
754+
_, err = r.Next()
755+
if err != ErrHeader {
756+
t.Error("want ErrHeader, got", err)
757+
}
758+
io.Copy(ioutil.Discard, r)
759+
}

src/archive/tar/testdata/neg-size.tar

512 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)