From: Aaron Jacobs Date: Wed, 16 Sep 2015 22:32:09 +0000 (+1000) Subject: os: handle EINTR from open(2). X-Git-Tag: go1.6beta1~1054 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=50d0ee0c98ea21f818d2daa9bc21ef51861a2ef9;p=gostls13.git os: handle EINTR from open(2). The man page for sigaction(2) on OS X doesn't guarantee that SA_RESTART will work for open(2) on regular files: The affected system calls include open(2), read(2), write(2), sendto(2), recvfrom(2), sendmsg(2) and recvmsg(2) on a communications channel or a slow device (such as a terminal, but not a regular file) and during a wait(2) or ioctl(2). I've never observed EINTR from open(2) for a traditional file system such as HFS+, but it's easy to observe with a fuse file system that is slightly slow (cf. https://goo.gl/UxsVgB). After this change, the problem can no longer be reproduced when calling os.OpenFile. Fixes #11180. Change-Id: I967247430e20a7d29a285b3d76bf3498dc4773db Reviewed-on: https://go-review.googlesource.com/14484 Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- diff --git a/src/os/file_unix.go b/src/os/file_unix.go index 0677707ee0..36b2a608ff 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -90,8 +90,16 @@ func OpenFile(name string, flag int, perm FileMode) (*File, error) { } } +retry: r, e := syscall.Open(name, flag|syscall.O_CLOEXEC, syscallMode(perm)) if e != nil { + // On OS X, sigaction(2) doesn't guarantee that SA_RESTART will cause + // open(2) to be restarted for regular files. This is easy to reproduce on + // fuse file systems (see http://golang.org/issue/11180). + if e == syscall.EINTR { + goto retry + } + return nil, &PathError{"open", name, e} }