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 <[email protected]>
This commit is contained in:
Augustin Cavalier
2024-08-26 18:25:11 +00:00
committed by waddlesplash
parent be52613c12
commit dadc497fbc
3 changed files with 11 additions and 4 deletions
+1 -1
View File
@@ -219,7 +219,7 @@ struct VMAreas {
{ return sTree.Find(id); } { return sTree.Find(id); }
static VMArea* Lookup(area_id id); static VMArea* Lookup(area_id id);
static area_id Find(const char* name); static area_id Find(const char* name);
static void Insert(VMArea* area); static status_t Insert(VMArea* area);
static void Remove(VMArea* area); static void Remove(VMArea* area);
static VMAreasTree::Iterator GetIterator() static VMAreasTree::Iterator GetIterator()
+3 -2
View File
@@ -244,12 +244,13 @@ VMAreas::Find(const char* name)
} }
/*static*/ void /*static*/ status_t
VMAreas::Insert(VMArea* area) VMAreas::Insert(VMArea* area)
{ {
WriteLock(); WriteLock();
sTree.Insert(area); status_t status = sTree.Insert(area);
WriteUnlock(); WriteUnlock();
return status;
} }
+7 -1
View File
@@ -1219,7 +1219,9 @@ map_backing_store(VMAddressSpace* addressSpace, VMCache* cache, off_t offset,
cache->Unlock(); cache->Unlock();
// insert the area in the global areas map // 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) // grab a ref to the address space (the area holds this)
addressSpace->Get(); addressSpace->Get();
@@ -1230,6 +1232,10 @@ map_backing_store(VMAddressSpace* addressSpace, VMCache* cache, off_t offset,
*_area = area; *_area = area;
return B_OK; return B_OK;
err3:
cache->Lock();
cache->RemoveArea(area);
area->cache = NULL;
err2: err2:
if (mapping == REGION_PRIVATE_MAP) { if (mapping == REGION_PRIVATE_MAP) {
// We created this cache, so we must delete it again. Note, that we // We created this cache, so we must delete it again. Note, that we