ソースを参照

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.
Andreas Kling 5 年 前
コミット
c58d1868cb
2 ファイル変更7 行追加2 行削除
  1. 2 2
      Kernel/Process.cpp
  2. 5 0
      Kernel/VM/Region.h

+ 2 - 2
Kernel/Process.cpp

@@ -246,8 +246,8 @@ int Process::sys$munmap(void* addr, size_t size)
         auto make_replacement_region = [&](const Range& new_range) -> Region& {
             ASSERT(new_range.base() >= old_region_range.base());
             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();
-            return allocate_split_region(*old_region, new_range, new_range_offset_in_old_region);
+            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_vmobject);
         };
         Vector<Region*, 2> new_regions;
         for (auto& new_range : remaining_ranges_after_unmap) {

+ 5 - 0
Kernel/VM/Region.h

@@ -79,6 +79,11 @@ public:
         return size() / PAGE_SIZE;
     }
 
+    size_t offset_in_vmobject() const
+    {
+        return m_offset_in_vmo;
+    }
+
     int commit();
 
     size_t amount_resident() const;