BXVGADevice+MBVGADevice: Correctly check page-aligned mmaps

In ab14b0ac64, 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.
This commit is contained in:
Peter Elliott 2021-01-27 21:23:20 -07:00 committed by Andreas Kling
parent f2decb6665
commit 985ce3b701
Notes: sideshowbarker 2024-07-18 22:48:15 +09:00
2 changed files with 10 additions and 4 deletions

View File

@ -177,8 +177,11 @@ KResultOr<Region*> BXVGADevice::mmap(Process& process, FileDescription&, const R
REQUIRE_PROMISE(video); REQUIRE_PROMISE(video);
if (!shared) if (!shared)
return ENODEV; return ENODEV;
ASSERT(offset == 0); if (offset != 0)
ASSERT(range.size() == framebuffer_size_in_bytes()); 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()); auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes());
if (!vmobject) if (!vmobject)
return ENOMEM; return ENOMEM;

View File

@ -56,8 +56,11 @@ KResultOr<Region*> MBVGADevice::mmap(Process& process, FileDescription&, const R
REQUIRE_PROMISE(video); REQUIRE_PROMISE(video);
if (!shared) if (!shared)
return ENODEV; return ENODEV;
ASSERT(offset == 0); if (offset != 0)
ASSERT(range.size() == framebuffer_size_in_bytes()); 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()); auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes());
if (!vmobject) if (!vmobject)
return ENOMEM; return ENOMEM;