diff --git a/src/archive/tar/reader.go b/src/archive/tar/reader.go index 8662e5643b47b..67daca27a95b4 100644 --- a/src/archive/tar/reader.go +++ b/src/archive/tar/reader.go @@ -110,7 +110,13 @@ func (tr *Reader) Next() (*Header, error) { // We actually read the whole file, // but this skips alignment padding tr.skipUnread() + if tr.err != nil { + return nil, tr.err + } hdr = tr.readHeader() + if hdr == nil { + return nil, tr.err + } mergePAX(hdr, headers) // Check for a PAX format sparse file diff --git a/src/archive/tar/reader_test.go b/src/archive/tar/reader_test.go index 311db7764128f..da01f26591180 100644 --- a/src/archive/tar/reader_test.go +++ b/src/archive/tar/reader_test.go @@ -781,3 +781,18 @@ func TestIssue10968(t *testing.T) { t.Fatalf("expected %q, got %q", io.ErrUnexpectedEOF, err) } } + +// Do not panic if there are errors in header blocks after the pax header. +// Issue 11169 +func TestIssue11169(t *testing.T) { + f, err := os.Open("testdata/issue11169.tar") + if err != nil { + t.Fatal(err) + } + defer f.Close() + r := NewReader(f) + _, err = r.Next() + if err == nil { + t.Fatal("Unexpected success") + } +} diff --git a/src/archive/tar/testdata/issue11169.tar b/src/archive/tar/testdata/issue11169.tar new file mode 100644 index 0000000000000..4d71fa1526060 Binary files /dev/null and b/src/archive/tar/testdata/issue11169.tar differ