diff --git a/Kernel/Arch/x86/common/Processor.cpp b/Kernel/Arch/x86/common/Processor.cpp index dbf892c590..c7d29bbda4 100644 --- a/Kernel/Arch/x86/common/Processor.cpp +++ b/Kernel/Arch/x86/common/Processor.cpp @@ -476,10 +476,10 @@ Vector Processor::capture_stack_trace(Thread& thread, size_t max_frames break; if (Memory::is_user_range(VirtualAddress(stack_ptr), sizeof(FlatPtr) * 2)) { - if (!copy_from_user(&retaddr, &((FlatPtr*)stack_ptr)[1]) || !retaddr) + if (copy_from_user(&retaddr, &((FlatPtr*)stack_ptr)[1]).is_error() || !retaddr) break; stack_trace.append(retaddr); - if (!copy_from_user(&stack_ptr, (FlatPtr*)stack_ptr)) + if (copy_from_user(&stack_ptr, (FlatPtr*)stack_ptr).is_error()) break; } else { void* fault_at; @@ -552,7 +552,7 @@ Vector Processor::capture_stack_trace(Thread& thread, size_t max_frames auto& regs = thread.regs(); auto* stack_top = reinterpret_cast(regs.sp()); if (Memory::is_user_range(VirtualAddress(stack_top), sizeof(FlatPtr))) { - if (!copy_from_user(&frame_ptr, &((FlatPtr*)stack_top)[0])) + if (copy_from_user(&frame_ptr, &((FlatPtr*)stack_top)[0]).is_error()) frame_ptr = 0; } else { void* fault_at; diff --git a/Kernel/Devices/HID/KeyboardDevice.cpp b/Kernel/Devices/HID/KeyboardDevice.cpp index 485d5ccbb3..b7b374cc3c 100644 --- a/Kernel/Devices/HID/KeyboardDevice.cpp +++ b/Kernel/Devices/HID/KeyboardDevice.cpp @@ -316,9 +316,7 @@ KResult KeyboardDevice::ioctl(FileDescription&, unsigned request, Userspace(arg); - if (!copy_to_user(output, &m_num_lock_on)) - return EFAULT; - return KSuccess; + return copy_to_user(output, &m_num_lock_on); } case KEYBOARD_IOCTL_SET_NUM_LOCK: { // In this case we expect the value to be a boolean and not a pointer. @@ -330,9 +328,7 @@ KResult KeyboardDevice::ioctl(FileDescription&, unsigned request, Userspace(arg); - if (!copy_to_user(output, &m_caps_lock_on)) - return EFAULT; - return KSuccess; + return copy_to_user(output, &m_caps_lock_on); } case KEYBOARD_IOCTL_SET_CAPS_LOCK: { auto caps_lock_value = static_cast(arg.ptr()); diff --git a/Kernel/Devices/SB16.cpp b/Kernel/Devices/SB16.cpp index 6090936a1f..473b04e750 100644 --- a/Kernel/Devices/SB16.cpp +++ b/Kernel/Devices/SB16.cpp @@ -127,9 +127,7 @@ KResult SB16::ioctl(FileDescription&, unsigned request, Userspace arg) switch (request) { case SOUNDCARD_IOCTL_GET_SAMPLE_RATE: { auto output = static_ptr_cast(arg); - if (!copy_to_user(output, &m_sample_rate)) - return EFAULT; - return KSuccess; + return copy_to_user(output, &m_sample_rate); } case SOUNDCARD_IOCTL_SET_SAMPLE_RATE: { auto sample_rate_value = static_cast(arg.ptr()); diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index 3e5da1d239..7d3537d906 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -317,9 +317,7 @@ KResult Inode::can_apply_flock(FileDescription const& description, flock const& KResult Inode::apply_flock(Process const& process, FileDescription const& description, Userspace input_lock) { flock new_lock = {}; - if (!copy_from_user(&new_lock, input_lock)) - return EFAULT; - + TRY(copy_from_user(&new_lock, input_lock)); TRY(normalize_flock(description, new_lock)); MutexLocker locker(m_inode_lock); @@ -343,9 +341,7 @@ KResult Inode::apply_flock(Process const& process, FileDescription const& descri KResult Inode::get_flock(FileDescription const& description, Userspace reference_lock) const { flock lookup = {}; - if (!copy_from_user(&lookup, reference_lock)) - return EFAULT; - + TRY(copy_from_user(&lookup, reference_lock)); TRY(normalize_flock(description, lookup)); MutexLocker locker(m_inode_lock, Mutex::Mode::Shared); @@ -356,16 +352,12 @@ KResult Inode::get_flock(FileDescription const& description, Userspace r if ((lookup.l_type == F_RDLCK && lock.type == F_WRLCK) || lookup.l_type == F_WRLCK) { lookup = { lock.type, SEEK_SET, lock.start, lock.len, lock.pid }; - if (!copy_to_user(reference_lock, &lookup)) - return EFAULT; - return KSuccess; + return copy_to_user(reference_lock, &lookup); } } lookup.l_type = F_UNLCK; - if (!copy_to_user(reference_lock, &lookup)) - return EFAULT; - return KSuccess; + return copy_to_user(reference_lock, &lookup); } void Inode::remove_flocks_for_description(FileDescription const& description) diff --git a/Kernel/FileSystem/InodeFile.cpp b/Kernel/FileSystem/InodeFile.cpp index 85c9e38082..5cf971a471 100644 --- a/Kernel/FileSystem/InodeFile.cpp +++ b/Kernel/FileSystem/InodeFile.cpp @@ -64,24 +64,17 @@ KResult InodeFile::ioctl(FileDescription& description, unsigned request, Userspa auto user_block_number = static_ptr_cast(arg); int block_number = 0; - if (!copy_from_user(&block_number, user_block_number)) - return EFAULT; + TRY(copy_from_user(&block_number, user_block_number)); if (block_number < 0) return EINVAL; auto block_address = TRY(inode().get_block_address(block_number)); - if (!copy_to_user(user_block_number, &block_address)) - return EFAULT; - - return KSuccess; + return copy_to_user(user_block_number, &block_address); } case FIONREAD: { int remaining_bytes = inode().size() - description.offset(); - if (!copy_to_user(Userspace(arg), &remaining_bytes)) - return EFAULT; - - return KSuccess; + return copy_to_user(Userspace(arg), &remaining_bytes); } default: return EINVAL; diff --git a/Kernel/Graphics/FramebufferDevice.cpp b/Kernel/Graphics/FramebufferDevice.cpp index 99f5745af6..bf46344ade 100644 --- a/Kernel/Graphics/FramebufferDevice.cpp +++ b/Kernel/Graphics/FramebufferDevice.cpp @@ -164,15 +164,12 @@ KResult FramebufferDevice::ioctl(FileDescription&, unsigned request, Userspace(arg); size_t value = framebuffer_size_in_bytes(); - if (!copy_to_user(user_size, &value)) - return EFAULT; - return KSuccess; + return copy_to_user(user_size, &value); } case FB_IOCTL_GET_BUFFER: { auto user_index = static_ptr_cast(arg); int value = m_y_offset == 0 ? 0 : 1; - if (!copy_to_user(user_index, &value)) - return EFAULT; + TRY(copy_to_user(user_index, &value)); if (!m_graphics_adapter->double_framebuffering_capable()) return ENOTIMPL; return KSuccess; @@ -192,15 +189,12 @@ KResult FramebufferDevice::ioctl(FileDescription&, unsigned request, Userspace(arg); FBResolution resolution; - if (!copy_from_user(&resolution, user_resolution)) - return EFAULT; + TRY(copy_from_user(&resolution, user_resolution)); if (resolution.width > MAX_RESOLUTION_WIDTH || resolution.height > MAX_RESOLUTION_HEIGHT) return EINVAL; @@ -208,8 +202,7 @@ KResult FramebufferDevice::ioctl(FileDescription&, unsigned request, Userspace(arg); FBBufferOffset buffer_offset; - if (!copy_from_user(&buffer_offset, user_buffer_offset)) - return EFAULT; + TRY(copy_from_user(&buffer_offset, user_buffer_offset)); if (buffer_offset.buffer_index != 0 && buffer_offset.buffer_index != 1) return EINVAL; buffer_offset.offset = (size_t)buffer_offset.buffer_index * m_framebuffer_pitch * m_framebuffer_height; - if (!copy_to_user(user_buffer_offset, &buffer_offset)) - return EFAULT; - return KSuccess; + return copy_to_user(user_buffer_offset, &buffer_offset); } case FB_IOCTL_FLUSH_BUFFERS: return ENOTSUP; diff --git a/Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp b/Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp index c488d41678..263e842eb4 100644 --- a/Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp +++ b/Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp @@ -158,21 +158,16 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace(arg); size_t value = m_buffer_size * 2; - if (!copy_to_user(out, &value)) - return EFAULT; - return KSuccess; + return copy_to_user(out, &value); } case FB_IOCTL_SET_RESOLUTION: { auto user_resolution = static_ptr_cast(arg); FBResolution resolution; - if (!copy_from_user(&resolution, user_resolution)) - return EFAULT; + TRY(copy_from_user(&resolution, user_resolution)); if (!try_to_set_resolution(resolution.width, resolution.height)) return EINVAL; resolution.pitch = pitch(); - if (!copy_to_user(user_resolution, &resolution)) - return EFAULT; - return KSuccess; + return copy_to_user(user_resolution, &resolution); } case FB_IOCTL_GET_RESOLUTION: { auto user_resolution = static_ptr_cast(arg); @@ -180,9 +175,7 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace(arg.ptr()); @@ -195,8 +188,7 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace(arg); FBFlushRects flush_rects; - if (!copy_from_user(&flush_rects, user_flush_rects)) - return EFAULT; + TRY(copy_from_user(&flush_rects, user_flush_rects)); if (!is_valid_buffer_index(flush_rects.buffer_index)) return EINVAL; if (Checked::multiplication_would_overflow(flush_rects.count, sizeof(FBRect))) @@ -206,8 +198,7 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace(arg); FBBufferOffset buffer_offset; - if (!copy_from_user(&buffer_offset, user_buffer_offset)) - return EFAULT; + TRY(copy_from_user(&buffer_offset, user_buffer_offset)); if (!is_valid_buffer_index(buffer_offset.buffer_index)) return EINVAL; buffer_offset.offset = (size_t)buffer_offset.buffer_index * m_buffer_size; - if (!copy_to_user(user_buffer_offset, &buffer_offset)) - return EFAULT; - return KSuccess; + return copy_to_user(user_buffer_offset, &buffer_offset); } default: return EINVAL; diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 1bedecab38..621a440e4b 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -103,7 +103,7 @@ KResult IPv4Socket::bind(Userspace user_address, socklen_t addr return set_so_error(EINVAL); sockaddr_in address; - if (!copy_from_user(&address, user_address, sizeof(sockaddr_in))) + if (copy_from_user(&address, user_address, sizeof(sockaddr_in)).is_error()) return set_so_error(EFAULT); if (address.sin_family != AF_INET) @@ -147,7 +147,7 @@ KResult IPv4Socket::connect(FileDescription& description, Userspace(address.unsafe_userspace_ptr()); - if (!copy_from_user(&sa_family_copy, &user_address->sa_family, sizeof(u16))) + if (copy_from_user(&sa_family_copy, &user_address->sa_family, sizeof(u16)).is_error()) return set_so_error(EFAULT); if (sa_family_copy != AF_INET) return set_so_error(EINVAL); @@ -155,7 +155,7 @@ KResult IPv4Socket::connect(FileDescription& description, Userspace IPv4Socket::sendto(FileDescription&, const UserOrKernelBuffer& if (addr) { sockaddr_in ia; - if (!copy_from_user(&ia, Userspace(addr.ptr()))) + if (copy_from_user(&ia, Userspace(addr.ptr())).is_error()) return set_so_error(EFAULT); if (ia.sin_family != AF_INET) { @@ -360,12 +360,12 @@ KResultOr IPv4Socket::receive_packet_buffered(FileDescription& descripti out_addr.sin_port = htons(packet.peer_port); out_addr.sin_family = AF_INET; Userspace dest_addr = addr.ptr(); - if (!copy_to_user(dest_addr, &out_addr)) + if (copy_to_user(dest_addr, &out_addr).is_error()) return set_so_error(EFAULT); socklen_t out_length = sizeof(sockaddr_in); VERIFY(addr_length); - if (!copy_to_user(addr_length, &out_length)) + if (copy_to_user(addr_length, &out_length).is_error()) return set_so_error(EFAULT); } @@ -383,7 +383,7 @@ KResultOr IPv4Socket::recvfrom(FileDescription& description, UserOrKerne { if (user_addr_length) { socklen_t addr_length; - if (!copy_from_user(&addr_length, user_addr_length.unsafe_userspace_ptr())) + if (copy_from_user(&addr_length, user_addr_length.unsafe_userspace_ptr()).is_error()) return set_so_error(EFAULT); if (addr_length < sizeof(sockaddr_in)) return set_so_error(EINVAL); @@ -492,8 +492,7 @@ KResult IPv4Socket::setsockopt(int level, int option, Userspace use if (user_value_size < sizeof(int)) return EINVAL; int value; - if (!copy_from_user(&value, static_ptr_cast(user_value))) - return EFAULT; + TRY(copy_from_user(&value, static_ptr_cast(user_value))); if (value < 0 || value > 255) return EINVAL; m_ttl = value; @@ -503,8 +502,7 @@ KResult IPv4Socket::setsockopt(int level, int option, Userspace use if (user_value_size != 1) return EINVAL; u8 value; - if (!copy_from_user(&value, static_ptr_cast(user_value))) - return EFAULT; + TRY(copy_from_user(&value, static_ptr_cast(user_value))); if (value != 0 && value != 1) return EINVAL; m_multicast_loop = value; @@ -514,8 +512,7 @@ KResult IPv4Socket::setsockopt(int level, int option, Userspace use if (user_value_size != sizeof(ip_mreq)) return EINVAL; ip_mreq mreq; - if (!copy_from_user(&mreq, static_ptr_cast(user_value))) - return EFAULT; + TRY(copy_from_user(&mreq, static_ptr_cast(user_value))); if (mreq.imr_interface.s_addr != INADDR_ANY) return ENOTSUP; IPv4Address address { (const u8*)&mreq.imr_multiaddr.s_addr }; @@ -527,8 +524,7 @@ KResult IPv4Socket::setsockopt(int level, int option, Userspace use if (user_value_size != sizeof(ip_mreq)) return EINVAL; ip_mreq mreq; - if (!copy_from_user(&mreq, static_ptr_cast(user_value))) - return EFAULT; + TRY(copy_from_user(&mreq, static_ptr_cast(user_value))); if (mreq.imr_interface.s_addr != INADDR_ANY) return ENOTSUP; IPv4Address address { (const u8*)&mreq.imr_multiaddr.s_addr }; @@ -546,28 +542,21 @@ KResult IPv4Socket::getsockopt(FileDescription& description, int level, int opti return Socket::getsockopt(description, level, option, value, value_size); socklen_t size; - if (!copy_from_user(&size, value_size.unsafe_userspace_ptr())) - return EFAULT; + TRY(copy_from_user(&size, value_size.unsafe_userspace_ptr())); switch (option) { case IP_TTL: if (size < sizeof(int)) return EINVAL; - if (!copy_to_user(static_ptr_cast(value), (int*)&m_ttl)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), (int*)&m_ttl)); size = sizeof(int); - if (!copy_to_user(value_size, &size)) - return EFAULT; - return KSuccess; + return copy_to_user(value_size, &size); case IP_MULTICAST_LOOP: { if (size < 1) return EINVAL; - if (!copy_to_user(static_ptr_cast(value), (const u8*)&m_multicast_loop)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), (const u8*)&m_multicast_loop)); size = 1; - if (!copy_to_user(value_size, &size)) - return EFAULT; - return KSuccess; + return copy_to_user(value_size, &size); } default: return ENOPROTOOPT; @@ -581,8 +570,7 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a auto ioctl_route = [request, arg]() -> KResult { auto user_route = static_ptr_cast(arg); rtentry route; - if (!copy_from_user(&route, user_route)) - return EFAULT; + TRY(copy_from_user(&route, user_route)); Userspace user_rt_dev((FlatPtr)route.rt_dev); auto ifname = TRY(try_copy_kstring_from_user(user_rt_dev, IFNAMSIZ)); @@ -613,8 +601,7 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a auto ioctl_arp = [request, arg]() -> KResult { auto user_req = static_ptr_cast(arg); arpreq arp_req; - if (!copy_from_user(&arp_req, user_req)) - return EFAULT; + TRY(copy_from_user(&arp_req, user_req)); switch (request) { case SIOCSARP: @@ -640,8 +627,7 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a auto ioctl_interface = [request, arg]() -> KResult { auto user_ifr = static_ptr_cast(arg); ifreq ifr; - if (!copy_from_user(&ifr, user_ifr)) - return EFAULT; + TRY(copy_from_user(&ifr, user_ifr)); char namebuf[IFNAMSIZ + 1]; memcpy(namebuf, ifr.ifr_name, IFNAMSIZ); @@ -673,9 +659,7 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a auto& socket_address_in = reinterpret_cast(ifr.ifr_addr); socket_address_in.sin_family = AF_INET; socket_address_in.sin_addr.s_addr = ip4_addr; - if (!copy_to_user(user_ifr, &ifr)) - return EFAULT; - return KSuccess; + return copy_to_user(user_ifr, &ifr); } case SIOCGIFNETMASK: { @@ -685,18 +669,14 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a // NOTE: NOT ifr_netmask. socket_address_in.sin_addr.s_addr = ip4_netmask; - if (!copy_to_user(user_ifr, &ifr)) - return EFAULT; - return KSuccess; + return copy_to_user(user_ifr, &ifr); } case SIOCGIFHWADDR: { auto mac_address = adapter->mac_address(); ifr.ifr_hwaddr.sa_family = AF_INET; mac_address.copy_to(Bytes { ifr.ifr_hwaddr.sa_data, sizeof(ifr.ifr_hwaddr.sa_data) }); - if (!copy_to_user(user_ifr, &ifr)) - return EFAULT; - return KSuccess; + return copy_to_user(user_ifr, &ifr); } case SIOCGIFBRDADDR: { @@ -707,9 +687,7 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a auto& socket_address_in = reinterpret_cast(ifr.ifr_addr); socket_address_in.sin_family = AF_INET; socket_address_in.sin_addr.s_addr = broadcast_addr; - if (!copy_to_user(user_ifr, &ifr)) - return EFAULT; - return KSuccess; + return copy_to_user(user_ifr, &ifr); } case SIOCGIFMTU: { @@ -717,9 +695,7 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a ifr.ifr_addr.sa_family = AF_INET; ifr.ifr_metric = ip4_metric; - if (!copy_to_user(user_ifr, &ifr)) - return EFAULT; - return KSuccess; + return copy_to_user(user_ifr, &ifr); } case SIOCGIFFLAGS: { @@ -727,9 +703,7 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a constexpr short flags = 1; ifr.ifr_addr.sa_family = AF_INET; ifr.ifr_flags = flags; - if (!copy_to_user(user_ifr, &ifr)) - return EFAULT; - return KSuccess; + return copy_to_user(user_ifr, &ifr); } case SIOCGIFCONF: { @@ -763,10 +737,7 @@ KResult IPv4Socket::ioctl(FileDescription&, unsigned request, Userspace a case FIONREAD: { int readable = m_receive_buffer->immediately_readable(); - if (!copy_to_user(Userspace(arg), &readable)) - return EFAULT; - - return KSuccess; + return copy_to_user(Userspace(arg), &readable); } } @@ -791,4 +762,5 @@ void IPv4Socket::set_can_read(bool value) if (value) evaluate_block_conditions(); } + } diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index 7421385262..8e5fadf3ce 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -121,7 +121,7 @@ KResult LocalSocket::bind(Userspace user_address, socklen_t add return set_so_error(EINVAL); sockaddr_un address = {}; - if (!copy_from_user(&address, user_address, sizeof(sockaddr_un))) + if (copy_from_user(&address, user_address, sizeof(sockaddr_un)).is_error()) return set_so_error(EFAULT); if (address.sun_family != AF_LOCAL) @@ -162,7 +162,7 @@ KResult LocalSocket::connect(FileDescription& description, Userspace(address.unsafe_userspace_ptr()); - if (!copy_from_user(&sa_family_copy, &user_address->sa_family, sizeof(u16))) + if (copy_from_user(&sa_family_copy, &user_address->sa_family, sizeof(u16)).is_error()) return set_so_error(EFAULT); if (sa_family_copy != AF_LOCAL) return set_so_error(EINVAL); @@ -173,7 +173,7 @@ KResult LocalSocket::connect(FileDescription& description, Userspace(user_address); char safe_address[sizeof(local_address.sun_path) + 1] = { 0 }; - if (!copy_from_user(&safe_address[0], &local_address.sun_path[0], sizeof(safe_address) - 1)) + if (copy_from_user(&safe_address[0], &local_address.sun_path[0], sizeof(safe_address) - 1).is_error()) return set_so_error(EFAULT); safe_address[sizeof(safe_address) - 1] = '\0'; maybe_path = KString::try_create(safe_address); @@ -398,8 +398,7 @@ KResult LocalSocket::getsockopt(FileDescription& description, int level, int opt return Socket::getsockopt(description, level, option, value, value_size); socklen_t size; - if (!copy_from_user(&size, value_size.unsafe_userspace_ptr())) - return EFAULT; + TRY(copy_from_user(&size, value_size.unsafe_userspace_ptr())); switch (option) { case SO_SNDBUF: @@ -411,18 +410,14 @@ KResult LocalSocket::getsockopt(FileDescription& description, int level, int opt return EINVAL; switch (role(description)) { case Role::Accepted: - if (!copy_to_user(static_ptr_cast(value), &m_origin)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), &m_origin)); size = sizeof(ucred); - if (!copy_to_user(value_size, &size)) - return EFAULT; + TRY(copy_to_user(value_size, &size)); return KSuccess; case Role::Connected: - if (!copy_to_user(static_ptr_cast(value), &m_acceptor)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), &m_acceptor)); size = sizeof(ucred); - if (!copy_to_user(value_size, &size)) - return EFAULT; + TRY(copy_to_user(value_size, &size)); return KSuccess; case Role::Connecting: return ENOTCONN; @@ -441,10 +436,7 @@ KResult LocalSocket::ioctl(FileDescription& description, unsigned request, Users switch (request) { case FIONREAD: { int readable = receive_buffer_for(description)->immediately_readable(); - if (!copy_to_user(Userspace(arg), &readable)) - return EFAULT; - - return KSuccess; + return copy_to_user(Userspace(arg), &readable); } } diff --git a/Kernel/Net/Socket.cpp b/Kernel/Net/Socket.cpp index 1bad59ab6c..ffda8c4ccf 100644 --- a/Kernel/Net/Socket.cpp +++ b/Kernel/Net/Socket.cpp @@ -128,8 +128,7 @@ KResult Socket::setsockopt(int level, int option, Userspace user_va return EINVAL; { int timestamp; - if (!copy_from_user(×tamp, static_ptr_cast(user_value))) - return EFAULT; + TRY(copy_from_user(×tamp, static_ptr_cast(user_value))); m_timestamp = timestamp; } if (m_timestamp && (domain() != AF_INET || type() == SOCK_STREAM)) { @@ -147,8 +146,7 @@ KResult Socket::setsockopt(int level, int option, Userspace user_va KResult Socket::getsockopt(FileDescription&, int level, int option, Userspace value, Userspace value_size) { socklen_t size; - if (!copy_from_user(&size, value_size.unsafe_userspace_ptr())) - return EFAULT; + TRY(copy_from_user(&size, value_size.unsafe_userspace_ptr())); // FIXME: Add TCP_NODELAY, IPPROTO_TCP and IPPROTO_IP (used in OpenSSH) if (level != SOL_SOCKET) { @@ -162,34 +160,26 @@ KResult Socket::getsockopt(FileDescription&, int level, int option, Userspace(value), &tv)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), &tv)); } size = sizeof(timeval); - if (!copy_to_user(value_size, &size)) - return EFAULT; - return KSuccess; + return copy_to_user(value_size, &size); case SO_RCVTIMEO: if (size < sizeof(timeval)) return EINVAL; { timeval tv = m_send_timeout.to_timeval(); - if (!copy_to_user(static_ptr_cast(value), &tv)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), &tv)); } size = sizeof(timeval); - if (!copy_to_user(value_size, &size)) - return EFAULT; - return KSuccess; + return copy_to_user(value_size, &size); case SO_ERROR: { if (size < sizeof(int)) return EINVAL; int errno = so_error().error(); - if (!copy_to_user(static_ptr_cast(value), &errno)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), &errno)); size = sizeof(int); - if (!copy_to_user(value_size, &size)) - return EFAULT; + TRY(copy_to_user(value_size, &size)); return set_so_error(KSuccess); } case SO_BINDTODEVICE: @@ -198,28 +188,21 @@ KResult Socket::getsockopt(FileDescription&, int level, int option, Userspacename(); auto length = name.length() + 1; - if (!copy_to_user(static_ptr_cast(value), name.characters(), length)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), name.characters(), length)); size = length; - if (!copy_to_user(value_size, &size)) - return EFAULT; - return KSuccess; + return copy_to_user(value_size, &size); } else { size = 0; - if (!copy_to_user(value_size, &size)) - return EFAULT; - + TRY(copy_to_user(value_size, &size)); + // FIXME: This return value looks suspicious. return EFAULT; } case SO_TIMESTAMP: if (size < sizeof(int)) return EINVAL; - if (!copy_to_user(static_ptr_cast(value), &m_timestamp)) - return EFAULT; + TRY(copy_to_user(static_ptr_cast(value), &m_timestamp)); size = sizeof(int); - if (!copy_to_user(value_size, &size)) - return EFAULT; - return KSuccess; + return copy_to_user(value_size, &size); default: dbgln("setsockopt({}) at SOL_SOCKET not implemented.", option); return ENOPROTOOPT; diff --git a/Kernel/Process.h b/Kernel/Process.h index 3540075172..72cbd88580 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -418,7 +418,7 @@ public: KResultOr sys$map_time_page(); template - int get_sock_or_peer_name(const Params&); + KResult get_sock_or_peer_name(Params const&); static void initialize(); diff --git a/Kernel/StdLib.cpp b/Kernel/StdLib.cpp index 83874108eb..3cc73a0ea6 100644 --- a/Kernel/StdLib.cpp +++ b/Kernel/StdLib.cpp @@ -45,7 +45,7 @@ Kernel::KResultOr> try_copy_kstring_from_user(Use [[nodiscard]] Optional