diff options
author | Andreas Kling <kling@serenityos.org> | 2021-09-05 17:38:37 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-09-05 17:38:37 +0200 |
commit | 48a0b31c478cb78dece459369610e0f993c8f6f0 (patch) | |
tree | f08fde80936619aa94f84edb0973878d8810d147 /Kernel/Graphics/VirtIOGPU | |
parent | 9903f5c6ef76dfd3c15e63205e307c9519c32ff3 (diff) | |
download | serenity-48a0b31c478cb78dece459369610e0f993c8f6f0.zip |
Kernel: Make copy_{from,to}_user() return KResult and use TRY()
This makes EFAULT propagation flow much more naturally. :^)
Diffstat (limited to 'Kernel/Graphics/VirtIOGPU')
-rw-r--r-- | Kernel/Graphics/VirtIOGPU/FrameBufferDevice.cpp | 28 |
1 files changed, 8 insertions, 20 deletions
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<v case FB_IOCTL_GET_SIZE_IN_BYTES: { auto out = static_ptr_cast<size_t*>(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<FBResolution*>(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<FBResolution*>(arg); @@ -180,9 +175,7 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace<v resolution.pitch = pitch(); resolution.width = width(); resolution.height = height(); - if (!copy_to_user(user_resolution, &resolution)) - return EFAULT; - return KSuccess; + return copy_to_user(user_resolution, &resolution); } case FB_IOCTL_SET_BUFFER: { auto buffer_index = static_cast<int>(arg.ptr()); @@ -195,8 +188,7 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace<v case FB_IOCTL_FLUSH_BUFFERS: { auto user_flush_rects = static_ptr_cast<FBFlushRects*>(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<unsigned>::multiplication_would_overflow(flush_rects.count, sizeof(FBRect))) @@ -206,8 +198,7 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace<v MutexLocker locker(m_gpu.operation_lock()); for (unsigned i = 0; i < flush_rects.count; i++) { FBRect user_dirty_rect; - if (!copy_from_user(&user_dirty_rect, &flush_rects.rects[i])) - return EFAULT; + TRY(copy_from_user(&user_dirty_rect, &flush_rects.rects[i])); Protocol::Rect dirty_rect { .x = user_dirty_rect.x, .y = user_dirty_rect.y, @@ -238,14 +229,11 @@ KResult FrameBufferDevice::ioctl(FileDescription&, unsigned request, Userspace<v case FB_IOCTL_GET_BUFFER_OFFSET: { auto user_buffer_offset = static_ptr_cast<FBBufferOffset*>(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; |