summaryrefslogtreecommitdiff
path: root/Kernel/VM
diff options
context:
space:
mode:
authorLuke <luke.wilde@live.co.uk>2020-12-29 00:24:33 +0000
committerAndreas Kling <kling@serenityos.org>2020-12-29 01:41:16 +0100
commiteb38fe4a82e77e7bc97fd2f6310b6168e8feb5db (patch)
tree7df7440e5609768eaa3616d7b22c2c7d2156ae53 /Kernel/VM
parentc006952aeb41bbfa4b478e89a699d9f80dd068ba (diff)
downloadserenity-eb38fe4a82e77e7bc97fd2f6310b6168e8feb5db.zip
Kernel/VM: Make local_offset in PhysicalRegion::free_page_at unsigned
Anything above or equal to the 2 GB mark has the left most bit set (0x8000...), which was falsely interpreted as negative due to local_offset being signed. This makes it unsigned by using FlatPtr. To check for underflow as was intended, lets use Checked instead. Fixes #4585
Diffstat (limited to 'Kernel/VM')
-rw-r--r--Kernel/VM/PhysicalRegion.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/Kernel/VM/PhysicalRegion.cpp b/Kernel/VM/PhysicalRegion.cpp
index 1c61350874..8cac4d77e4 100644
--- a/Kernel/VM/PhysicalRegion.cpp
+++ b/Kernel/VM/PhysicalRegion.cpp
@@ -156,11 +156,12 @@ void PhysicalRegion::free_page_at(PhysicalAddress addr)
ASSERT_NOT_REACHED();
}
- ptrdiff_t local_offset = addr.get() - m_lower.get();
- ASSERT(local_offset >= 0);
- ASSERT((FlatPtr)local_offset < (FlatPtr)(m_pages * PAGE_SIZE));
+ Checked<FlatPtr> local_offset = addr.get();
+ local_offset -= m_lower.get();
+ ASSERT(!local_offset.has_overflow());
+ ASSERT(local_offset.value() < (FlatPtr)(m_pages * PAGE_SIZE));
- auto page = (FlatPtr)local_offset / PAGE_SIZE;
+ auto page = local_offset.value() / PAGE_SIZE;
m_bitmap.set(page, false);
m_free_hint = page; // We know we can find one here for sure
m_used--;