From 803225fa694cbf520b6c8e3ab27ee479bf4dc619 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
---
 .../HashTables/HashPtrTable/HashPtrTableI.H      | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 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;
 }
 
 
-- 
GitLab