From 3455d556c431582474872e00ab85c0812f54ec51 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> 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 5c76321ab63..733c11cd067 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<T, Key, Hash>::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<T*>(old); + } + + return ok; } diff --git a/src/OpenFOAM/containers/PtrLists/PtrListOps/PtrListOpsTemplates.C b/src/OpenFOAM/containers/PtrLists/PtrListOps/PtrListOpsTemplates.C index 7d5471ebb2e..0feeb4bba87 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<class T> void Foam::sort(UPtrList<T>& 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<T>& list) template<class T, class Compare> void Foam::sort(UPtrList<T>& list, const Compare& comp) { - labelList order(input.size()); + labelList order(list.size()); sortedOrder(list, order, comp); list.sortOrder(order, false); // false = allow nullptr } -- GitLab