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