aboutsummaryrefslogtreecommitdiff
path: root/src/io
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2022-03-12 16:18:23 -0800
committerIan Lance Taylor <iant@golang.org>2022-03-28 22:03:07 +0000
commit460fd63cccd2f1d16fc4b1b761545b1649e14e28 (patch)
treed578069779c03ac6c2dc2ae2b427ce0d62014db6 /src/io
parent3c7f9b80222376fa01f8c6e3b411281c23dd74ed (diff)
downloadgo-460fd63cccd2f1d16fc4b1b761545b1649e14e28.tar.gz
go-460fd63cccd2f1d16fc4b1b761545b1649e14e28.zip
io/fs, path/filepath: honor SkipDir on second WalkDirFunc error call
Fixes #51617 Change-Id: I03e9e575d9bad1481e7e4f051b50a077ba5f2fe0 Reviewed-on: https://go-review.googlesource.com/c/go/+/392154 Trust: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
Diffstat (limited to 'src/io')
-rw-r--r--src/io/fs/walk.go3
-rw-r--r--src/io/fs/walk_test.go33
2 files changed, 36 insertions, 0 deletions
diff --git a/src/io/fs/walk.go b/src/io/fs/walk.go
index 534876bad3..52a51bbd37 100644
--- a/src/io/fs/walk.go
+++ b/src/io/fs/walk.go
@@ -76,6 +76,9 @@ func walkDir(fsys FS, name string, d DirEntry, walkDirFn WalkDirFunc) error {
// Second call, to report ReadDir error.
err = walkDirFn(name, d, err)
if err != nil {
+ if err == SkipDir && d.IsDir() {
+ err = nil
+ }
return err
}
}
diff --git a/src/io/fs/walk_test.go b/src/io/fs/walk_test.go
index 5e127e71cd..04358beb24 100644
--- a/src/io/fs/walk_test.go
+++ b/src/io/fs/walk_test.go
@@ -8,6 +8,8 @@ import (
. "io/fs"
"os"
pathpkg "path"
+ "path/filepath"
+ "reflect"
"testing"
"testing/fstest"
)
@@ -122,3 +124,34 @@ func TestWalkDir(t *testing.T) {
}
checkMarks(t, true)
}
+
+func TestIssue51617(t *testing.T) {
+ dir := t.TempDir()
+ for _, sub := range []string{"a", filepath.Join("a", "bad"), filepath.Join("a", "next")} {
+ if err := os.Mkdir(filepath.Join(dir, sub), 0755); err != nil {
+ t.Fatal(err)
+ }
+ }
+ bad := filepath.Join(dir, "a", "bad")
+ if err := os.Chmod(bad, 0); err != nil {
+ t.Fatal(err)
+ }
+ defer os.Chmod(bad, 0700) // avoid errors on cleanup
+ var saw []string
+ err := WalkDir(os.DirFS(dir), ".", func(path string, d DirEntry, err error) error {
+ if err != nil {
+ return filepath.SkipDir
+ }
+ if d.IsDir() {
+ saw = append(saw, path)
+ }
+ return nil
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ want := []string{".", "a", "a/bad", "a/next"}
+ if !reflect.DeepEqual(saw, want) {
+ t.Errorf("got directories %v, want %v", saw, want)
+ }
+}