kernel/socket: for accept()/recvmsg() invalid user addresses are not fatal
needed to align with FreeBSD and Linux.
FreeBSD Test: tools/regression/sockets/accept_fd_leak/accept_fd_leak.c
Change-Id: Ia87e1713f0fb2a8010257539d2fe62cef9331c56
Reviewed-on: https://review.haiku-os.org/c/haiku/+/9382
Reviewed-by: Jérôme Duval <jerome.duval@gmail.com>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Diff
src/system/kernel/fs/socket.cpp | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
@@ -107,9 +107,11 @@
if (userAddress == NULL) {
if (addressRequired)
return B_BAD_VALUE;
} else if (!IS_USER_ADDRESS(userAddress)
|| !IS_USER_ADDRESS(_addressLength)) {
return B_BAD_ADDRESS;
} else {
if (!IS_USER_ADDRESS(_addressLength))
return B_BAD_ADDRESS;
if (!IS_USER_ADDRESS(userAddress) && addressRequired)
return B_BAD_ADDRESS;
}
@@ -136,8 +138,8 @@
if (user_memcpy(userAddressLength, &addressLength,
sizeof(socklen_t)) != B_OK
|| (userAddress != NULL
&& user_memcpy(userAddress, address,
min_c(addressLength, userAddressBufferSize)) != B_OK)) {
&& (!IS_USER_ADDRESS(userAddress) || user_memcpy(userAddress, address,
min_c(addressLength, userAddressBufferSize)) != B_OK))) {
return B_BAD_ADDRESS;
}