]> Cypherpunks repositories - gostls13.git/commitdiff
os: remove unreadable directories in RemoveAll
authorBaokun Lee <nototon@gmail.com>
Mon, 4 Mar 2019 19:10:38 +0000 (03:10 +0800)
committerIan Lance Taylor <iant@golang.org>
Mon, 4 Mar 2019 20:01:35 +0000 (20:01 +0000)
Fixes #30555

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>
src/os/removeall_at.go
src/os/removeall_test.go

index 0b7d5efb7a5bbf51197c3b0bee25acf5972384f6..94232cf5564b6090d36e0d90bd6e7ce18e87afce 100644 (file)
@@ -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)
index 9dab0d4bb1079a8881e4a7d1437d822aed2696d2..21371d8776a68ccf54f739d1fb654b7dd2a90034 100644 (file)
@@ -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)
+       }
+}