From f04af472b41cc33c7a32675b6a806669adf93114 Mon Sep 17 00:00:00 2001 From: Amir Ramez Date: Tue, 24 Feb 2026 18:57:03 +0000 Subject: [PATCH] runtime_loader: fix heap address reservation The runtime_loader previously used resize_area without properly reserving address space first. This worked in most cases but failed when ASLR was disabled or when address space was crowded. * Add kHeapReservationSize constant (1MB) for virtual address space. * Create area at exact address within reservation fixes #19345 Change-Id: I952f11475ad041056833de6a248bfea4a9a2e397 Reviewed-on: https://review.haiku-os.org/c/haiku/+/10360 Reviewed-by: waddlesplash Tested-by: Commit checker robot --- src/system/runtime_loader/heap.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/system/runtime_loader/heap.cpp b/src/system/runtime_loader/heap.cpp index 37ca75bef9..7e7fccdc68 100644 --- a/src/system/runtime_loader/heap.cpp +++ b/src/system/runtime_loader/heap.cpp @@ -27,6 +27,7 @@ const static size_t kAlignment = 8; const static size_t kInitialHeapSize = 64 * 1024; const static size_t kHeapGrowthAlignment = 32 * 1024; +const static size_t kHeapReservationSize = 1 * 1024 * 1024; static const char* const kLockName = "runtime_loader heap"; static recursive_lock sLock = RECURSIVE_LOCK_INITIALIZER(kLockName); @@ -54,11 +55,19 @@ add_area(size_t size) } } - void* base; + void* reservedBase; + status_t status = _kern_reserve_address_range((addr_t*)&reservedBase, + B_RANDOMIZED_ANY_ADDRESS, kHeapReservationSize); + if (status != B_OK) + return status; + + void* base = reservedBase; area_id area = _kern_create_area("rld heap", &base, - B_RANDOMIZED_ANY_ADDRESS, size, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); - if (area < 0) + B_EXACT_ADDRESS, size, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); + if (area < 0) { + _kern_unreserve_address_range((addr_t)reservedBase, kHeapReservationSize); return area; + } sLastHeapBase = base; sLastHeapArea = area;