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)
|
if (length == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!IS_USER_ADDRESS(buffer))
|
if (!is_user_address_range(buffer, length))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
SyscallRestartWrapper<status_t> status;
|
SyscallRestartWrapper<status_t> status;
|
||||||
|
|||||||
@@ -918,7 +918,7 @@ _user_accept(int socket, struct sockaddr *userAddress,
|
|||||||
ssize_t
|
ssize_t
|
||||||
_user_recv(int socket, void *data, size_t length, int flags)
|
_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;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
SyscallRestartWrapper<ssize_t> result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
@@ -930,7 +930,7 @@ ssize_t
|
|||||||
_user_recvfrom(int socket, void *data, size_t length, int flags,
|
_user_recvfrom(int socket, void *data, size_t length, int flags,
|
||||||
struct sockaddr *userAddress, socklen_t *_addressLength)
|
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;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
// check parameters
|
// check parameters
|
||||||
@@ -1021,7 +1021,7 @@ _user_recvmsg(int socket, struct msghdr *userMessage, int flags)
|
|||||||
ssize_t
|
ssize_t
|
||||||
_user_send(int socket, const void *data, size_t length, int flags)
|
_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;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
SyscallRestartWrapper<ssize_t> result;
|
SyscallRestartWrapper<ssize_t> result;
|
||||||
@@ -1033,7 +1033,7 @@ ssize_t
|
|||||||
_user_sendto(int socket, const void *data, size_t length, int flags,
|
_user_sendto(int socket, const void *data, size_t length, int flags,
|
||||||
const struct sockaddr *userAddress, socklen_t addressLength)
|
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;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
if (addressLength <= 0
|
if (addressLength <= 0
|
||||||
|
|||||||
Reference in New Issue
Block a user