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 <shaojunyang@google.com> Reviewed-by: Ian Lance Taylor <iant@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Ian Lance Taylor <iant@golang.org> Reviewed-by: Florian Lehner <lehner.florian86@gmail.com> Reviewed-by: Michael Pratt <mpratt@google.com>
diff --git a/unix/syscall_unix.go b/unix/syscall_unix.go index 4e92e5a..de6fccf 100644 --- a/unix/syscall_unix.go +++ b/unix/syscall_unix.go
@@ -367,7 +367,9 @@ 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 @@ } } 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