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