aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaokun Lee <nototon@gmail.com>2019-03-05 03:10:38 +0800
committerIan Lance Taylor <iant@golang.org>2019-03-05 01:16:23 +0000
commit6ff06c19fd54d844b1963cf0ecfef6062d36611b (patch)
tree726b1b866676996d36d09584f7cd7d4e2b605b8c
parent71b8a3bc8751ca4662cc7fdf36a78691ea1bd441 (diff)
downloadgo-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.go3
-rw-r--r--src/os/removeall_test.go30
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)
+ }
+}