From 0424248dcbb8800b71bae807c399812460b094b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 1 May 2020 23:44:09 +0200 Subject: [PATCH] kernel/fs: allow sendto to be called with a NULL address POSIX says: If the socket is connection-mode, dest_addr shall be ignored. Change-Id: Ic75de473173e3795066beeac9a9f2404418d94da Reviewed-on: https://review.haiku-os.org/c/haiku/+/2547 Reviewed-by: waddlesplash --- src/system/kernel/fs/socket.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/system/kernel/fs/socket.cpp b/src/system/kernel/fs/socket.cpp index bbe0dd880f..e4c02f46c9 100644 --- a/src/system/kernel/fs/socket.cpp +++ b/src/system/kernel/fs/socket.cpp @@ -1036,25 +1036,27 @@ _user_sendto(int socket, const void *data, size_t length, int flags, if (data == NULL || !IS_USER_ADDRESS(data)) return B_BAD_ADDRESS; - // TODO: If this is a connection-mode socket, the address parameter is - // supposed to be ignored. - if (userAddress == NULL || addressLength <= 0 + if (addressLength <= 0 || addressLength > MAX_SOCKET_ADDRESS_LENGTH) { return B_BAD_VALUE; } // copy address from userland char address[MAX_SOCKET_ADDRESS_LENGTH]; - if (!IS_USER_ADDRESS(userAddress) + if (userAddress != NULL) { + if (!IS_USER_ADDRESS(userAddress) || user_memcpy(address, userAddress, addressLength) != B_OK) { - return B_BAD_ADDRESS; + return B_BAD_ADDRESS; + } + } else { + addressLength = 0; } // sendto() SyscallRestartWrapper result; return result = common_sendto(socket, data, length, flags, - (sockaddr*)address, addressLength, false); + userAddress != NULL ? (sockaddr*)address : NULL, addressLength, false); }