From e52da6c73ba6731a3598df7d01b4569c94bff80e Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Fri, 3 Jun 2022 15:36:50 -0400 Subject: [PATCH] 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. --- src/system/kernel/fs/fd.cpp | 2 +- src/system/kernel/fs/socket.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/system/kernel/fs/fd.cpp b/src/system/kernel/fs/fd.cpp index 4389bfe557..905414ff5b 100644 --- a/src/system/kernel/fs/fd.cpp +++ b/src/system/kernel/fs/fd.cpp @@ -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; diff --git a/src/system/kernel/fs/socket.cpp b/src/system/kernel/fs/socket.cpp index e4c02f46c9..f234e92f93 100644 --- a/src/system/kernel/fs/socket.cpp +++ b/src/system/kernel/fs/socket.cpp @@ -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 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 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