From 491326cdeb3762a8b5f926be9bb5ddd36115e31d Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Tue, 25 Mar 2025 14:55:33 -0700 Subject: [PATCH] int/linux: add/use Recvfrom Signed-off-by: Kir Kolyshkin --- internal/linux/linux.go | 12 ++++++++++++ libcontainer/sync_unix.go | 16 +++------------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/internal/linux/linux.go b/internal/linux/linux.go index b281a3347..9b0496479 100644 --- a/internal/linux/linux.go +++ b/internal/linux/linux.go @@ -53,6 +53,18 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { return fd, nil } +// Recvfrom wraps [unix.Recvfrom]. +func Recvfrom(fd int, p []byte, flags int) (n int, from unix.Sockaddr, err error) { + err = retryOnEINTR(func() error { + n, from, err = unix.Recvfrom(fd, p, flags) + return err + }) + if err != nil { + return 0, nil, os.NewSyscallError("recvfrom", err) + } + return n, from, err +} + // Sendmsg wraps [unix.Sendmsg]. func Sendmsg(fd int, p, oob []byte, to unix.Sockaddr, flags int) error { err := retryOnEINTR(func() error { diff --git a/libcontainer/sync_unix.go b/libcontainer/sync_unix.go index 69c0228db..2c6e4387d 100644 --- a/libcontainer/sync_unix.go +++ b/libcontainer/sync_unix.go @@ -6,6 +6,7 @@ import ( "os" "sync/atomic" + "github.com/opencontainers/runc/internal/linux" "golang.org/x/sys/unix" ) @@ -42,20 +43,9 @@ func (s *syncSocket) WritePacket(b []byte) (int, error) { } func (s *syncSocket) ReadPacket() ([]byte, error) { - var ( - size int - err error - ) - - for { - size, _, err = unix.Recvfrom(int(s.f.Fd()), nil, unix.MSG_TRUNC|unix.MSG_PEEK) - if err != unix.EINTR { //nolint:errorlint // unix errors are bare - break - } - } - + size, _, err := linux.Recvfrom(int(s.f.Fd()), nil, unix.MSG_TRUNC|unix.MSG_PEEK) if err != nil { - return nil, fmt.Errorf("fetch packet length from socket: %w", os.NewSyscallError("recvfrom", err)) + return nil, fmt.Errorf("fetch packet length from socket: %w", err) } // We will only get a zero size if the socket has been closed from the // other end (otherwise recvfrom(2) will block until a packet is ready). In