浏览代码

LibJS: Add some basic freelist validation for the GC heap

When using the freelist, we now validate that the entries are actual
cell pointers within the current HeapBlock.
Andreas Kling 4 年之前
父节点
当前提交
e1dbf74f15
共有 2 个文件被更改,包括 8 次插入0 次删除
  1. 2 0
      Userland/Libraries/LibJS/Heap/HeapBlock.cpp
  2. 6 0
      Userland/Libraries/LibJS/Heap/HeapBlock.h

+ 2 - 0
Userland/Libraries/LibJS/Heap/HeapBlock.cpp

@@ -75,6 +75,8 @@ HeapBlock::HeapBlock(Heap& heap, size_t cell_size)
 
 void HeapBlock::deallocate(Cell* cell)
 {
+    ASSERT(is_valid_cell_pointer(cell));
+    ASSERT(!m_freelist || is_valid_cell_pointer(m_freelist));
     ASSERT(cell->is_live());
     ASSERT(!cell->is_marked());
     cell->~Cell();

+ 6 - 0
Userland/Libraries/LibJS/Heap/HeapBlock.h

@@ -51,6 +51,7 @@ public:
     {
         if (!m_freelist)
             return nullptr;
+        ASSERT(is_valid_cell_pointer(m_freelist));
         return exchange(m_freelist, m_freelist->next);
     }
 
@@ -80,6 +81,11 @@ public:
         return cell(cell_index);
     }
 
+    bool is_valid_cell_pointer(const Cell* cell)
+    {
+        return cell_from_possible_pointer((FlatPtr)cell);
+    }
+
     IntrusiveListNode m_list_node;
 
 private: