// Otherwise, we're at the end of the file
return 0, io.EOF
}
+ if sfr.tot < sfr.sp[0].offset {
+ return 0, io.ErrUnexpectedEOF
+ }
if sfr.pos < sfr.sp[0].offset {
// We're in a hole
n = sfr.readHole(b, sfr.sp[0].offset)
}
io.Copy(ioutil.Discard, r)
}
+
+// This used to hang in (*sparseFileReader).readHole due to missing
+// verification of sparse offsets against file size.
+func TestIssue10968(t *testing.T) {
+ f, err := os.Open("testdata/issue10968.tar")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+ r := NewReader(f)
+ _, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ _, err = io.Copy(ioutil.Discard, r)
+ if err != io.ErrUnexpectedEOF {
+ t.Fatalf("expected %q, got %q", io.ErrUnexpectedEOF, err)
+ }
+}