From 6fb913b30f367555467f08da4d60f49996c9b17a Mon Sep 17 00:00:00 2001 From: HuShuai Date: Thu, 8 Jan 2026 17:58:24 +0800 Subject: [PATCH] unix: return early on error in Recvmsg Currently, Recvmsg may access the rsa buffer even if the underlying syscall returns an error. This change aligns Recvmsg with the safer logic already used in RecvmsgBuffers, ensuring the address is only processed when the syscall succeeds (err == nil). Fixes golang/go#76848 Change-Id: If76477d0362b802e54ee6d27d0e8f57024a8a1dc Reviewed-on: https://go-review.googlesource.com/c/sys/+/734740 Reviewed-by: Junyang Shao Reviewed-by: Ian Lance Taylor LUCI-TryBot-Result: Go LUCI Auto-Submit: Ian Lance Taylor Reviewed-by: Florian Lehner Reviewed-by: Michael Pratt --- unix/syscall_unix.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/unix/syscall_unix.go b/unix/syscall_unix.go index 4e92e5aa..de6fccf9 100644 --- a/unix/syscall_unix.go +++ b/unix/syscall_unix.go @@ -367,7 +367,9 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from iov[0].SetLen(len(p)) } var rsa RawSockaddrAny - n, oobn, recvflags, err = recvmsgRaw(fd, iov[:], oob, flags, &rsa) + if n, oobn, recvflags, err = recvmsgRaw(fd, iov[:], oob, flags, &rsa); err != nil { + return + } // source address is only specified if the socket is unconnected if rsa.Addr.Family != AF_UNSPEC { from, err = anyToSockaddr(fd, &rsa) @@ -389,8 +391,10 @@ func RecvmsgBuffers(fd int, buffers [][]byte, oob []byte, flags int) (n, oobn in } } var rsa RawSockaddrAny - n, oobn, recvflags, err = recvmsgRaw(fd, iov, oob, flags, &rsa) - if err == nil && rsa.Addr.Family != AF_UNSPEC { + if n, oobn, recvflags, err = recvmsgRaw(fd, iov, oob, flags, &rsa); err != nil { + return + } + if rsa.Addr.Family != AF_UNSPEC { from, err = anyToSockaddr(fd, &rsa) } return