diff --git a/fs.go b/fs.go index a0ed59bc..eee7e607 100644 --- a/fs.go +++ b/fs.go @@ -567,6 +567,9 @@ func (f ArchiveFS) ReadDir(name string) ([]fs.DirEntry, error) { ) handler := func(_ context.Context, file File) error { file.NameInArchive = strings.Trim(file.NameInArchive, "/") + if file.NameInArchive == "." { + return nil + } files = append(files, file) if file.NameInArchive == name && !file.IsDir() { foundFile = true diff --git a/fs_test.go b/fs_test.go index 6262b161..9180fbf3 100644 --- a/fs_test.go +++ b/fs_test.go @@ -8,6 +8,7 @@ import ( "io/fs" "log" "net/http" + "os" "path" "reflect" "sort" @@ -53,6 +54,34 @@ var ( unorderZip []byte ) +func TestSelfTar(t *testing.T) { + fn := "testdata/self-tar.tar" + fh, err := os.Open(fn) + if err != nil { + t.Fatalf("Could not load test tar: %v", fn) + } + fstat, err := os.Stat(fn) + if err != nil { + t.Fatalf("Could not stat test tar: %v", fn) + } + fsys := ArchiveFS{ + Stream: io.NewSectionReader(fh, 0, fstat.Size()), + Format: Tar{}, + } + var count int + err = fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error { + if count > 10 { + t.Error("walking test tar appears to be recursing in error") + return fmt.Errorf("recursing tar: %v", fn) + } + count++ + return nil + }) + if err != nil { + t.Fatal(err) + } +} + func ExampleArchiveFS_Stream() { fsys := ArchiveFS{ Stream: io.NewSectionReader(bytes.NewReader(testZIP), 0, int64(len(testZIP))), diff --git a/testdata/self-tar.tar b/testdata/self-tar.tar new file mode 100644 index 00000000..15c2b1d9 Binary files /dev/null and b/testdata/self-tar.tar differ