kernel/fs: Invoke the new is_user_address_range on more I/O buffers.
We do not access these buffers directly here but pass them deeper into the kernel, where they may be used in IO operations that do not invoke user_* functions at all, so we have to validate them fully here. Part of #14961.
This commit is contained in:
@@ -759,7 +759,7 @@ common_user_io(int fd, off_t pos, void* buffer, size_t length, bool write)
|
||||
if (length == 0)
|
||||
return 0;
|
||||
|
||||
if (!IS_USER_ADDRESS(buffer))
|
||||
if (!is_user_address_range(buffer, length))
|
||||
return B_BAD_ADDRESS;
|
||||
|
||||
SyscallRestartWrapper<status_t> status;
|
||||
|
||||
@@ -918,7 +918,7 @@ _user_accept(int socket, struct sockaddr *userAddress,
|
||||
ssize_t
|
||||
_user_recv(int socket, void *data, size_t length, int flags)
|
||||
{
|
||||
if (data == NULL || !IS_USER_ADDRESS(data))
|
||||
if (data == NULL || !is_user_address_range(data, length))
|
||||
return B_BAD_ADDRESS;
|
||||
|
||||
SyscallRestartWrapper<ssize_t> result;
|
||||
@@ -930,7 +930,7 @@ ssize_t
|
||||
_user_recvfrom(int socket, void *data, size_t length, int flags,
|
||||
struct sockaddr *userAddress, socklen_t *_addressLength)
|
||||
{
|
||||
if (data == NULL || !IS_USER_ADDRESS(data))
|
||||
if (data == NULL || !is_user_address_range(data, length))
|
||||
return B_BAD_ADDRESS;
|
||||
|
||||
// check parameters
|
||||
@@ -1021,7 +1021,7 @@ _user_recvmsg(int socket, struct msghdr *userMessage, int flags)
|
||||
ssize_t
|
||||
_user_send(int socket, const void *data, size_t length, int flags)
|
||||
{
|
||||
if (data == NULL || !IS_USER_ADDRESS(data))
|
||||
if (data == NULL || !is_user_address_range(data, length))
|
||||
return B_BAD_ADDRESS;
|
||||
|
||||
SyscallRestartWrapper<ssize_t> result;
|
||||
@@ -1033,7 +1033,7 @@ ssize_t
|
||||
_user_sendto(int socket, const void *data, size_t length, int flags,
|
||||
const struct sockaddr *userAddress, socklen_t addressLength)
|
||||
{
|
||||
if (data == NULL || !IS_USER_ADDRESS(data))
|
||||
if (data == NULL || !is_user_address_range(data, length))
|
||||
return B_BAD_ADDRESS;
|
||||
|
||||
if (addressLength <= 0
|
||||
|
||||
Reference in New Issue
Block a user