]> Cypherpunks repositories - gostls13.git/commitdiff
os: have RemoveAll loop on EINTR
authorNigel Tao <nigeltao@golang.org>
Mon, 23 Jan 2023 22:49:36 +0000 (09:49 +1100)
committerNigel Tao <nigeltao@golang.org>
Wed, 25 Jan 2023 07:07:01 +0000 (07:07 +0000)
Fixes #57966

Change-Id: Ia732d499ff9bd6e70030daab8fac42d1e204be37
Reviewed-on: https://go-review.googlesource.com/c/go/+/463076
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Nigel Tao <nigeltao@golang.org>
Reviewed-by: Nigel Tao (INACTIVE; USE @golang.org INSTEAD) <nigeltao@google.com>
src/os/removeall_at.go

index 8b46152a9e71cbdb76598d2f4416f8b93e198c3f..306debd9727907cd7a2914943533a0a5e9fd53a8 100644 (file)
@@ -58,7 +58,9 @@ func removeAll(path string) error {
 func removeAllFrom(parent *File, base string) error {
        parentFd := int(parent.Fd())
        // Simple case: if Unlink (aka remove) works, we're done.
-       err := unix.Unlinkat(parentFd, base, 0)
+       err := ignoringEINTR(func() error {
+               return unix.Unlinkat(parentFd, base, 0)
+       })
        if err == nil || IsNotExist(err) {
                return nil
        }
@@ -75,7 +77,9 @@ func removeAllFrom(parent *File, base string) error {
 
        // Is this a directory we need to recurse into?
        var statInfo syscall.Stat_t
-       statErr := unix.Fstatat(parentFd, base, &statInfo, unix.AT_SYMLINK_NOFOLLOW)
+       statErr := ignoringEINTR(func() error {
+               return unix.Fstatat(parentFd, base, &statInfo, unix.AT_SYMLINK_NOFOLLOW)
+       })
        if statErr != nil {
                if IsNotExist(statErr) {
                        return nil
@@ -151,7 +155,9 @@ func removeAllFrom(parent *File, base string) error {
        }
 
        // Remove the directory itself.
-       unlinkError := unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR)
+       unlinkError := ignoringEINTR(func() error {
+               return unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR)
+       })
        if unlinkError == nil || IsNotExist(unlinkError) {
                return nil
        }