"bufio"
"encoding/binary"
"errors"
+ "fmt"
"hash"
"hash/crc32"
"internal/godebug"
s, err := d.files[d.offset+i].stat()
if err != nil {
return nil, err
+ } else if s.Name() == "." || !fs.ValidPath(s.Name()) {
+ return nil, &fs.PathError{
+ Op: "readdir",
+ Path: d.e.name,
+ Err: fmt.Errorf("invalid file name: %v", d.files[d.offset+i].name),
+ }
}
list[i] = s
}
"bytes"
"encoding/binary"
"encoding/hex"
+ "errors"
"internal/obscuretestdata"
"io"
"io/fs"
}
}
+func TestFSWalkBadFile(t *testing.T) {
+ t.Parallel()
+
+ var buf bytes.Buffer
+ zw := NewWriter(&buf)
+ hdr := &FileHeader{Name: "."}
+ hdr.SetMode(fs.ModeDir | 0o755)
+ w, err := zw.CreateHeader(hdr)
+ if err != nil {
+ t.Fatalf("create zip header: %v", err)
+ }
+ _, err = w.Write([]byte("some data"))
+ if err != nil {
+ t.Fatalf("write zip contents: %v", err)
+
+ }
+ err = zw.Close()
+ if err != nil {
+ t.Fatalf("close zip writer: %v", err)
+
+ }
+
+ zr, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
+ if err != nil {
+ t.Fatalf("create zip reader: %v", err)
+
+ }
+ var count int
+ var errRepeat = errors.New("repeated call to path")
+ err = fs.WalkDir(zr, ".", func(p string, d fs.DirEntry, err error) error {
+ count++
+ if count > 2 { // once for directory read, once for the error
+ return errRepeat
+ }
+ return err
+ })
+ if err == nil {
+ t.Fatalf("expected error from invalid file name")
+ } else if errors.Is(err, errRepeat) {
+ t.Fatal(err)
+ }
+}
+
func TestFSModTime(t *testing.T) {
t.Parallel()
z, err := OpenReader("testdata/subdir.zip")