Skip to content

Commit 5f8abe5

Browse files
authored
Merge pull request #4637 from mirendev/evanphx/b-eintr
Retry direct unix package calls if observing EINTR
2 parents 7ee017c + 28475f1 commit 5f8abe5

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

libcontainer/notify_v2_linux.go

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package libcontainer
22

33
import (
44
"fmt"
5+
"os"
56
"path/filepath"
67
"unsafe"
78

@@ -40,7 +41,11 @@ func registerMemoryEventV2(cgDir, evName, cgEvName string) (<-chan struct{}, err
4041

4142
for {
4243
n, err := unix.Read(fd, buffer[:])
44+
if err == unix.EINTR { //nolint:errorlint // unix errors are bare
45+
continue
46+
}
4347
if err != nil {
48+
err = os.NewSyscallError("read", err)
4449
logrus.Warnf("unable to read event data from inotify, got error: %v", err)
4550
return
4651
}

libcontainer/sync_unix.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,20 @@ func (s *syncSocket) WritePacket(b []byte) (int, error) {
4242
}
4343

4444
func (s *syncSocket) ReadPacket() ([]byte, error) {
45-
size, _, err := unix.Recvfrom(int(s.f.Fd()), nil, unix.MSG_TRUNC|unix.MSG_PEEK)
45+
var (
46+
size int
47+
err error
48+
)
49+
50+
for {
51+
size, _, err = unix.Recvfrom(int(s.f.Fd()), nil, unix.MSG_TRUNC|unix.MSG_PEEK)
52+
if err != unix.EINTR { //nolint:errorlint // unix errors are bare
53+
break
54+
}
55+
}
56+
4657
if err != nil {
47-
return nil, fmt.Errorf("fetch packet length from socket: %w", err)
58+
return nil, fmt.Errorf("fetch packet length from socket: %w", os.NewSyscallError("recvfrom", err))
4859
}
4960
// We will only get a zero size if the socket has been closed from the
5061
// other end (otherwise recvfrom(2) will block until a packet is ready). In

libcontainer/utils/cmsg.go

+19-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,20 @@ func RecvFile(socket *os.File) (_ *os.File, Err error) {
4242
oob := make([]byte, oobSpace)
4343

4444
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+
4657
if err != nil {
47-
return nil, err
58+
return nil, os.NewSyscallError("recvmsg", err)
4859
}
4960
if n >= MaxNameLen || oobn != oobSpace {
5061
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 {
115126
// SendRawFd sends a specific file descriptor over the given AF_UNIX socket.
116127
func SendRawFd(socket *os.File, msg string, fd uintptr) error {
117128
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+
}
119135
}

0 commit comments

Comments
 (0)