From 464d9f1252a638eee63ca5cdf72e5cd321df47e1 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 24 Feb 2010 19:04:41 +0000 Subject: [PATCH] Changed object_depot_store() return value to void. It is now always takes over ownership of the object. Fixes double free introduced in r35605. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35608 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/slab/ObjectDepot.h | 2 +- src/system/kernel/slab/ObjectDepot.cpp | 6 +++--- src/system/kernel/slab/Slab.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/headers/private/kernel/slab/ObjectDepot.h b/headers/private/kernel/slab/ObjectDepot.h index 9c2fe557a9..4ed0591606 100644 --- a/headers/private/kernel/slab/ObjectDepot.h +++ b/headers/private/kernel/slab/ObjectDepot.h @@ -41,7 +41,7 @@ status_t object_depot_init(object_depot* depot, size_t capacity, void object_depot_destroy(object_depot* depot, uint32 flags); void* object_depot_obtain(object_depot* depot); -int object_depot_store(object_depot* depot, void* object, uint32 flags); +void object_depot_store(object_depot* depot, void* object, uint32 flags); void object_depot_make_empty(object_depot* depot, uint32 flags); diff --git a/src/system/kernel/slab/ObjectDepot.cpp b/src/system/kernel/slab/ObjectDepot.cpp index fa65d47d71..a67b93593e 100644 --- a/src/system/kernel/slab/ObjectDepot.cpp +++ b/src/system/kernel/slab/ObjectDepot.cpp @@ -249,7 +249,7 @@ object_depot_obtain(object_depot* depot) } -int +void object_depot_store(object_depot* depot, void* object, uint32 flags) { DepotMagazine* freeMagazine = NULL; @@ -266,7 +266,7 @@ object_depot_store(object_depot* depot, void* object, uint32 flags) while (true) { if (store->loaded != NULL && store->loaded->Push(object)) - return 1; + return; if ((store->previous != NULL && store->previous->IsEmpty()) || exchange_with_empty(depot, store->previous, freeMagazine)) { @@ -292,7 +292,7 @@ object_depot_store(object_depot* depot, void* object, uint32 flags) DepotMagazine* magazine = alloc_magazine(depot, flags); if (magazine == NULL) { depot->return_object(depot, depot->cookie, object, flags); - return 0; + return; } readLocker.Lock(); diff --git a/src/system/kernel/slab/Slab.cpp b/src/system/kernel/slab/Slab.cpp index 2180056704..7a97ba332c 100644 --- a/src/system/kernel/slab/Slab.cpp +++ b/src/system/kernel/slab/Slab.cpp @@ -696,8 +696,8 @@ object_cache_free(object_cache* cache, void* object, uint32 flags) T(Free(cache, object)); if (!(cache->flags & CACHE_NO_DEPOT)) { - if (object_depot_store(&cache->depot, object, flags)) - return; + object_depot_store(&cache->depot, object, flags); + return; } MutexLocker _(cache->lock);