@@ -42,9 +42,20 @@ func RecvFile(socket *os.File) (_ *os.File, Err error) {
42
42
oob := make ([]byte , oobSpace )
43
43
44
44
sockfd := socket .Fd ()
45
- n , oobn , _ , _ , err := unix .Recvmsg (int (sockfd ), name , oob , unix .MSG_CMSG_CLOEXEC )
45
+ var (
46
+ n , oobn int
47
+ err error
48
+ )
49
+
50
+ for {
51
+ n , oobn , _ , _ , err = unix .Recvmsg (int (sockfd ), name , oob , unix .MSG_CMSG_CLOEXEC )
52
+ if err != unix .EINTR { //nolint:errorlint // unix errors are bare
53
+ break
54
+ }
55
+ }
56
+
46
57
if err != nil {
47
- return nil , err
58
+ return nil , os . NewSyscallError ( "recvmsg" , err )
48
59
}
49
60
if n >= MaxNameLen || oobn != oobSpace {
50
61
return nil , fmt .Errorf ("recvfile: incorrect number of bytes read (n=%d oobn=%d)" , n , oobn )
@@ -115,5 +126,10 @@ func SendFile(socket *os.File, file *os.File) error {
115
126
// SendRawFd sends a specific file descriptor over the given AF_UNIX socket.
116
127
func SendRawFd (socket * os.File , msg string , fd uintptr ) error {
117
128
oob := unix .UnixRights (int (fd ))
118
- return unix .Sendmsg (int (socket .Fd ()), []byte (msg ), oob , nil , 0 )
129
+ for {
130
+ err := unix .Sendmsg (int (socket .Fd ()), []byte (msg ), oob , nil , 0 )
131
+ if err != unix .EINTR { //nolint:errorlint // unix errors are bare
132
+ return os .NewSyscallError ("sendmsg" , err )
133
+ }
134
+ }
119
135
}
0 commit comments