diff --git a/Kernel/Heap/kmalloc.cpp b/Kernel/Heap/kmalloc.cpp index 538f791754..8ee983c321 100644 --- a/Kernel/Heap/kmalloc.cpp +++ b/Kernel/Heap/kmalloc.cpp @@ -255,9 +255,6 @@ void* kmalloc(size_t size) } void* ptr = g_kmalloc_global->m_heap.allocate(size); - if (!ptr) { - PANIC("kmalloc: Out of memory (requested size: {})", size); - } Thread* current_thread = Thread::current(); if (!current_thread) diff --git a/Kernel/Heap/kmalloc.h b/Kernel/Heap/kmalloc.h index f05766ff21..f7af78577b 100644 --- a/Kernel/Heap/kmalloc.h +++ b/Kernel/Heap/kmalloc.h @@ -75,14 +75,16 @@ void operator delete(void* ptr, size_t, std::align_val_t) noexcept; void operator delete[](void* ptrs) noexcept DISALLOW("All deletes in the kernel should have a known size."); void operator delete[](void* ptr, size_t) noexcept; -[[gnu::malloc, gnu::returns_nonnull, gnu::alloc_size(1)]] void* kmalloc(size_t); +[[gnu::malloc, gnu::alloc_size(1)]] void* kmalloc(size_t); template -[[gnu::malloc, gnu::returns_nonnull, gnu::alloc_size(1)]] inline void* kmalloc_aligned(size_t size) +[[gnu::malloc, gnu::alloc_size(1)]] inline void* kmalloc_aligned(size_t size) { static_assert(ALIGNMENT > sizeof(ptrdiff_t)); static_assert(ALIGNMENT <= 4096); void* ptr = kmalloc(size + ALIGNMENT + sizeof(ptrdiff_t)); + if (ptr == nullptr) + return ptr; size_t max_addr = (size_t)ptr + ALIGNMENT; void* aligned_ptr = (void*)(max_addr - (max_addr % ALIGNMENT)); ((ptrdiff_t*)aligned_ptr)[-1] = (ptrdiff_t)((u8*)aligned_ptr - (u8*)ptr);