diff options
author | Baokun Lee <nototon@gmail.com> | 2019-03-05 03:10:38 +0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2019-03-05 01:16:23 +0000 |
commit | 6ff06c19fd54d844b1963cf0ecfef6062d36611b (patch) | |
tree | 726b1b866676996d36d09584f7cd7d4e2b605b8c | |
parent | 71b8a3bc8751ca4662cc7fdf36a78691ea1bd441 (diff) | |
download | go-6ff06c19fd54d844b1963cf0ecfef6062d36611b.tar.gz go-6ff06c19fd54d844b1963cf0ecfef6062d36611b.zip |
[release-branch.go1.12] os: remove unreadable directories in RemoveAll
Updates #30555
Fixes #30579
Change-Id: Ib894b4f3cdba23a18a69c9470cf69ceb83591a4d
Reviewed-on: https://go-review.googlesource.com/c/go/+/165057
Run-TryBot: Baokun Lee <nototon@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
(cherry picked from commit c74659290a473cf932ec6bc96bfa7e96a930676e)
Reviewed-on: https://go-review.googlesource.com/c/go/+/165058
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r-- | src/os/removeall_at.go | 3 | ||||
-rw-r--r-- | src/os/removeall_test.go | 30 |
2 files changed, 32 insertions, 1 deletions
diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go index 0b7d5efb7a..94232cf556 100644 --- a/src/os/removeall_at.go +++ b/src/os/removeall_at.go @@ -92,7 +92,8 @@ func removeAllFrom(parent *File, path string) error { if IsNotExist(err) { return nil } - return err + recurseErr = err + break } names, readErr := file.Readdirnames(request) diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go index 9dab0d4bb1..21371d8776 100644 --- a/src/os/removeall_test.go +++ b/src/os/removeall_test.go @@ -372,3 +372,33 @@ func TestRemoveAllButReadOnly(t *testing.T) { } } } + +func TestRemoveUnreadableDir(t *testing.T) { + switch runtime.GOOS { + case "nacl", "js", "windows": + t.Skipf("skipping test on %s", runtime.GOOS) + } + + if Getuid() == 0 { + t.Skip("skipping test when running as root") + } + + t.Parallel() + + tempDir, err := ioutil.TempDir("", "TestRemoveAllButReadOnly-") + if err != nil { + t.Fatal(err) + } + defer RemoveAll(tempDir) + + target := filepath.Join(tempDir, "d0", "d1", "d2") + if err := MkdirAll(target, 0755); err != nil { + t.Fatal(err) + } + if err := Chmod(target, 0300); err != nil { + t.Fatal(err) + } + if err := RemoveAll(filepath.Join(tempDir, "d0")); err != nil { + t.Fatal(err) + } +} |