From 3455d556c431582474872e00ab85c0812f54ec51 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Mon, 27 Jul 2020 10:00:58 +0200 Subject: [PATCH] BUG: potential memory leaks in HashPtrTable::set (#1787) - backported fix from develop COMP: incorrect variable names in PtrListOpsTemplates.C --- .../HashTables/HashPtrTable/HashPtrTableI.H | 16 ++++++++++++++-- .../PtrLists/PtrListOps/PtrListOpsTemplates.C | 6 +++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H index 5c76321ab6..733c11cd06 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2018 OpenCFD Ltd. + Copyright (C) 2018-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -86,7 +86,19 @@ inline bool Foam::HashPtrTable::set T* ptr ) { - return this->parent_type::set(key, ptr); + // Newer: const T* old = this->get(key); + + iterator iter(this->find(key)); + const T* old = (iter.good() ? iter.val() : nullptr); + + const bool ok = this->parent_type::set(key, ptr); + + if (ok && old != ptr) + { + delete const_cast(old); + } + + return ok; } diff --git a/src/OpenFOAM/containers/PtrLists/PtrListOps/PtrListOpsTemplates.C b/src/OpenFOAM/containers/PtrLists/PtrListOps/PtrListOpsTemplates.C index 7d5471ebb2..0feeb4bba8 100644 --- a/src/OpenFOAM/containers/PtrLists/PtrListOps/PtrListOpsTemplates.C +++ b/src/OpenFOAM/containers/PtrLists/PtrListOps/PtrListOpsTemplates.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -79,7 +79,7 @@ void Foam::sortedOrder template void Foam::sort(UPtrList& list) { - labelList order(input.size()); + labelList order(list.size()); sortedOrder(list, order); list.sortOrder(order, false); // false = allow nullptr } @@ -88,7 +88,7 @@ void Foam::sort(UPtrList& list) template void Foam::sort(UPtrList& list, const Compare& comp) { - labelList order(input.size()); + labelList order(list.size()); sortedOrder(list, order, comp); list.sortOrder(order, false); // false = allow nullptr }