From dadc497fbc2fdabad970bf70847c10bcdd3d0fc7 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Mon, 26 Aug 2024 14:24:10 -0400 Subject: [PATCH] kernel/vm: Insertion into the Areas AVL tree can fail. So we need to check that it didn't when creating areas. Change-Id: I4342463113046b543722faa7a51ca269ed67e8bf Reviewed-on: https://review.haiku-os.org/c/haiku/+/8137 Reviewed-by: waddlesplash --- headers/private/kernel/vm/VMArea.h | 2 +- src/system/kernel/vm/VMArea.cpp | 5 +++-- src/system/kernel/vm/vm.cpp | 8 +++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/headers/private/kernel/vm/VMArea.h b/headers/private/kernel/vm/VMArea.h index cc180acd7c..c888bd7465 100644 --- a/headers/private/kernel/vm/VMArea.h +++ b/headers/private/kernel/vm/VMArea.h @@ -219,7 +219,7 @@ struct VMAreas { { return sTree.Find(id); } static VMArea* Lookup(area_id id); static area_id Find(const char* name); - static void Insert(VMArea* area); + static status_t Insert(VMArea* area); static void Remove(VMArea* area); static VMAreasTree::Iterator GetIterator() diff --git a/src/system/kernel/vm/VMArea.cpp b/src/system/kernel/vm/VMArea.cpp index fb6a909d74..e2256595cf 100644 --- a/src/system/kernel/vm/VMArea.cpp +++ b/src/system/kernel/vm/VMArea.cpp @@ -244,12 +244,13 @@ VMAreas::Find(const char* name) } -/*static*/ void +/*static*/ status_t VMAreas::Insert(VMArea* area) { WriteLock(); - sTree.Insert(area); + status_t status = sTree.Insert(area); WriteUnlock(); + return status; } diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index b3572b2738..b2496b1ed7 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -1219,7 +1219,9 @@ map_backing_store(VMAddressSpace* addressSpace, VMCache* cache, off_t offset, cache->Unlock(); // insert the area in the global areas map - VMAreas::Insert(area); + status = VMAreas::Insert(area); + if (status != B_OK) + goto err3; // grab a ref to the address space (the area holds this) addressSpace->Get(); @@ -1230,6 +1232,10 @@ map_backing_store(VMAddressSpace* addressSpace, VMCache* cache, off_t offset, *_area = area; return B_OK; +err3: + cache->Lock(); + cache->RemoveArea(area); + area->cache = NULL; err2: if (mapping == REGION_PRIVATE_MAP) { // We created this cache, so we must delete it again. Note, that we