exchange_with_empty() did not set the freeMagazine return value to NULL when
the maximum magazine count wasn't reached yet. With object_depot_store() not resetting its local variable, a magazine could thus be emptied and freed twice. Fixes #5489 and #5497. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35752 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -143,6 +143,7 @@ exchange_with_empty(object_depot* depot, DepotMagazine*& magazine,
|
|||||||
if (depot->full_count < depot->max_count) {
|
if (depot->full_count < depot->max_count) {
|
||||||
_push(depot->full, magazine);
|
_push(depot->full, magazine);
|
||||||
depot->full_count++;
|
depot->full_count++;
|
||||||
|
freeMagazine = NULL;
|
||||||
} else
|
} else
|
||||||
freeMagazine = magazine;
|
freeMagazine = magazine;
|
||||||
}
|
}
|
||||||
@@ -252,8 +253,6 @@ object_depot_obtain(object_depot* depot)
|
|||||||
void
|
void
|
||||||
object_depot_store(object_depot* depot, void* object, uint32 flags)
|
object_depot_store(object_depot* depot, void* object, uint32 flags)
|
||||||
{
|
{
|
||||||
DepotMagazine* freeMagazine = NULL;
|
|
||||||
|
|
||||||
ReadLocker readLocker(depot->outer_lock);
|
ReadLocker readLocker(depot->outer_lock);
|
||||||
InterruptsLocker interruptsLocker;
|
InterruptsLocker interruptsLocker;
|
||||||
|
|
||||||
@@ -268,6 +267,7 @@ object_depot_store(object_depot* depot, void* object, uint32 flags)
|
|||||||
if (store->loaded != NULL && store->loaded->Push(object))
|
if (store->loaded != NULL && store->loaded->Push(object))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
DepotMagazine* freeMagazine = NULL;
|
||||||
if ((store->previous != NULL && store->previous->IsEmpty())
|
if ((store->previous != NULL && store->previous->IsEmpty())
|
||||||
|| exchange_with_empty(depot, store->previous, freeMagazine)) {
|
|| exchange_with_empty(depot, store->previous, freeMagazine)) {
|
||||||
std::swap(store->loaded, store->previous);
|
std::swap(store->loaded, store->previous);
|
||||||
|
|||||||
Reference in New Issue
Block a user