diff options
-rw-r--r-- | Kernel/Heap/kmalloc.cpp | 10 | ||||
-rw-r--r-- | Kernel/Thread.h | 4 |
2 files changed, 12 insertions, 2 deletions
diff --git a/Kernel/Heap/kmalloc.cpp b/Kernel/Heap/kmalloc.cpp index 6a3c21211f..5f8800acdb 100644 --- a/Kernel/Heap/kmalloc.cpp +++ b/Kernel/Heap/kmalloc.cpp @@ -362,8 +362,12 @@ void* kmalloc(size_t size) Thread* current_thread = Thread::current(); if (!current_thread) current_thread = Processor::idle_thread(); - if (current_thread) + if (current_thread) { + // FIXME: By the time we check this, we have already allocated above. + // This means that in the case of an infinite recursion, we can't catch it this way. + VERIFY(current_thread->is_allocation_enabled()); PerformanceManager::add_kmalloc_perf_event(*current_thread, size, (FlatPtr)ptr); + } return ptr; } @@ -384,8 +388,10 @@ void kfree_sized(void* ptr, size_t size) Thread* current_thread = Thread::current(); if (!current_thread) current_thread = Processor::idle_thread(); - if (current_thread) + if (current_thread) { + VERIFY(current_thread->is_allocation_enabled()); PerformanceManager::add_kfree_perf_event(*current_thread, 0, (FlatPtr)ptr); + } } g_kmalloc_global->deallocate(ptr, size); diff --git a/Kernel/Thread.h b/Kernel/Thread.h index 21de4a3439..a88a0be927 100644 --- a/Kernel/Thread.h +++ b/Kernel/Thread.h @@ -1244,6 +1244,9 @@ public: bool is_promise_violation_pending() const { return m_is_promise_violation_pending; } void set_promise_violation_pending(bool value) { m_is_promise_violation_pending = value; } + bool is_allocation_enabled() const { return m_allocation_enabled; } + void set_allocation_enabled(bool value) { m_allocation_enabled = value; } + String backtrace(); private: @@ -1348,6 +1351,7 @@ private: u32 m_lock_requested_count { 0 }; IntrusiveListNode<Thread> m_blocked_threads_list_node; LockRank m_lock_rank_mask { LockRank::None }; + bool m_allocation_enabled { true }; #if LOCK_DEBUG struct HoldingLockInfo { |