mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 02:08:11 +00:00
Kernel: Fix munmap() bad splitting of already-split Regions
When splitting an Region that's already the result of an earlier split, we have to take the Region's offset-in-VMObject into account since it may be non-zero.
This commit is contained in:
parent
4bfd4dc6c7
commit
c58d1868cb
2 changed files with 7 additions and 2 deletions
|
@ -246,8 +246,8 @@ int Process::sys$munmap(void* addr, size_t size)
|
||||||
auto make_replacement_region = [&](const Range& new_range) -> Region& {
|
auto make_replacement_region = [&](const Range& new_range) -> Region& {
|
||||||
ASSERT(new_range.base() >= old_region_range.base());
|
ASSERT(new_range.base() >= old_region_range.base());
|
||||||
ASSERT(new_range.end() <= old_region_range.end());
|
ASSERT(new_range.end() <= old_region_range.end());
|
||||||
size_t new_range_offset_in_old_region = new_range.base().get() - old_region_range.base().get();
|
size_t new_range_offset_in_vmobject = old_region->offset_in_vmobject() + (new_range.base().get() - old_region_range.base().get());
|
||||||
return allocate_split_region(*old_region, new_range, new_range_offset_in_old_region);
|
return allocate_split_region(*old_region, new_range, new_range_offset_in_vmobject);
|
||||||
};
|
};
|
||||||
Vector<Region*, 2> new_regions;
|
Vector<Region*, 2> new_regions;
|
||||||
for (auto& new_range : remaining_ranges_after_unmap) {
|
for (auto& new_range : remaining_ranges_after_unmap) {
|
||||||
|
|
|
@ -79,6 +79,11 @@ public:
|
||||||
return size() / PAGE_SIZE;
|
return size() / PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t offset_in_vmobject() const
|
||||||
|
{
|
||||||
|
return m_offset_in_vmo;
|
||||||
|
}
|
||||||
|
|
||||||
int commit();
|
int commit();
|
||||||
|
|
||||||
size_t amount_resident() const;
|
size_t amount_resident() const;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue