From: Nigel Tao Date: Mon, 23 Jan 2023 22:49:36 +0000 (+1100) Subject: os: have RemoveAll loop on EINTR X-Git-Tag: go1.21rc1~1803 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a11b8e37652ff60302b4a4a55a8a43db6a066ecf;p=gostls13.git os: have RemoveAll loop on EINTR Fixes #57966 Change-Id: Ia732d499ff9bd6e70030daab8fac42d1e204be37 Reviewed-on: https://go-review.googlesource.com/c/go/+/463076 TryBot-Result: Gopher Robot Reviewed-by: Bryan Mills Reviewed-by: Ian Lance Taylor Run-TryBot: Nigel Tao Reviewed-by: Nigel Tao (INACTIVE; USE @golang.org INSTEAD) --- diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go index 8b46152a9e..306debd972 100644 --- a/src/os/removeall_at.go +++ b/src/os/removeall_at.go @@ -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 }