From 985ce3b7010e72bf8daa63b7c9e3ec8096dd900c Mon Sep 17 00:00:00 2001 From: Peter Elliott Date: Wed, 27 Jan 2021 21:23:20 -0700 Subject: [PATCH] BXVGADevice+MBVGADevice: Correctly check page-aligned mmaps In ab14b0ac64cd8bcaf7060050a7ec5a99cf7bd121, mmap was changed so that the size of the region is aligned before it was passed to the device driver. The previous logic would assert when the framebuffer size was not a multiple of the page size. I've also taken the liberty of returning an error on mmap failure rather than asserting. --- Kernel/Devices/BXVGADevice.cpp | 7 +++++-- Kernel/Devices/MBVGADevice.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Kernel/Devices/BXVGADevice.cpp b/Kernel/Devices/BXVGADevice.cpp index 727dcd67ef..328d2776d5 100644 --- a/Kernel/Devices/BXVGADevice.cpp +++ b/Kernel/Devices/BXVGADevice.cpp @@ -177,8 +177,11 @@ KResultOr BXVGADevice::mmap(Process& process, FileDescription&, const R REQUIRE_PROMISE(video); if (!shared) return ENODEV; - ASSERT(offset == 0); - ASSERT(range.size() == framebuffer_size_in_bytes()); + if (offset != 0) + return ENXIO; + if (range.size() != PAGE_ROUND_UP(framebuffer_size_in_bytes())) + return EOVERFLOW; + auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes()); if (!vmobject) return ENOMEM; diff --git a/Kernel/Devices/MBVGADevice.cpp b/Kernel/Devices/MBVGADevice.cpp index b255c1739e..55e7d176e8 100644 --- a/Kernel/Devices/MBVGADevice.cpp +++ b/Kernel/Devices/MBVGADevice.cpp @@ -56,8 +56,11 @@ KResultOr MBVGADevice::mmap(Process& process, FileDescription&, const R REQUIRE_PROMISE(video); if (!shared) return ENODEV; - ASSERT(offset == 0); - ASSERT(range.size() == framebuffer_size_in_bytes()); + if (offset != 0) + return ENXIO; + if (range.size() != PAGE_ROUND_UP(framebuffer_size_in_bytes())) + return EOVERFLOW; + auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes()); if (!vmobject) return ENOMEM;