connectivity/source/drivers/macab/MacabHeader.cxx    |   12 +++++++++++
 connectivity/source/drivers/macab/MacabRecord.cxx    |   18 ++++++++---------
 connectivity/source/drivers/macab/MacabRecords.cxx   |   20 +++++++++++++++++++
 connectivity/source/drivers/macab/MacabResultSet.cxx |    9 ++++++++
 connectivity/source/drivers/macab/MacabResultSet.hxx |    1 
 5 files changed, 51 insertions(+), 9 deletions(-)

New commits:
commit 128e2c009e4c13821bbe371e949eaf8a979bc2bb
Author:     Patrick Luby <guibmac...@gmail.com>
AuthorDate: Fri Aug 22 21:27:41 2025 -0400
Commit:     Adolfo Jayme Barrientos <fit...@ubuntu.com>
CommitDate: Mon Aug 25 17:22:04 2025 +0200

    tdf#111634 Eliminate some macOS Address Book driver memory leaks
    
    The memory leaks that have been eliminated were found using the
    steps in the following post:
    
    https://bugs.documentfoundation.org/show_bug.cgi?id=111634#c0
    
    Change-Id: Ifb4ec1837737fe5430ade571e1a45e0aa76078ee
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190100
    Reviewed-by: Patrick Luby <guibomac...@gmail.com>
    Tested-by: Jenkins
    (cherry picked from commit 67e05014a293eece25d781ace0af875b81dea2ad)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190103
    Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com>

diff --git a/connectivity/source/drivers/macab/MacabHeader.cxx 
b/connectivity/source/drivers/macab/MacabHeader.cxx
index da270dd05ac8..916fff74cde6 100644
--- a/connectivity/source/drivers/macab/MacabHeader.cxx
+++ b/connectivity/source/drivers/macab/MacabHeader.cxx
@@ -68,6 +68,18 @@ MacabHeader::MacabHeader()
 
 MacabHeader::~MacabHeader()
 {
+    if(fields != nullptr)
+    {
+        sal_Int32 i;
+        for(i = 0; i < size; i++)
+        {
+            if(fields[i] != nullptr && fields[i]->value != nullptr)
+            {
+                CFRelease(fields[i]->value);
+                fields[i]->value = nullptr;
+            }
+        }
+    }
 }
 
 
diff --git a/connectivity/source/drivers/macab/MacabRecord.cxx 
b/connectivity/source/drivers/macab/MacabRecord.cxx
index 3072e1eaa2f4..5ac2a3c65252 100644
--- a/connectivity/source/drivers/macab/MacabRecord.cxx
+++ b/connectivity/source/drivers/macab/MacabRecord.cxx
@@ -51,15 +51,7 @@ MacabRecord::MacabRecord(const sal_Int32 _size)
 MacabRecord::~MacabRecord()
 {
     if(size > 0)
-    {
         releaseFields();
-        int i;
-        for(i = 0; i < size; i++)
-        {
-            delete fields[i];
-            fields[i] = nullptr;
-        }
-    }
 }
 
 
@@ -155,7 +147,15 @@ void MacabRecord::releaseFields()
      */
     sal_Int32 i;
     for(i = 0; i < size; i++)
-        CFRelease(fields[i]->value);
+    {
+        if(fields[i] != nullptr)
+        {
+            if(fields[i]->value != nullptr)
+                CFRelease(fields[i]->value);
+            delete fields[i];
+            fields[i] = nullptr;
+        }
+    }
 }
 
 
diff --git a/connectivity/source/drivers/macab/MacabRecords.cxx 
b/connectivity/source/drivers/macab/MacabRecords.cxx
index 07d462425e65..612b6e9d7796 100644
--- a/connectivity/source/drivers/macab/MacabRecords.cxx
+++ b/connectivity/source/drivers/macab/MacabRecords.cxx
@@ -163,6 +163,17 @@ void MacabRecords::initialize()
 
 MacabRecords::~MacabRecords()
 {
+    if(header != nullptr)
+        delete header;
+
+    if(records != nullptr)
+    {
+        sal_Int32 i;
+        for(i = 0; i < recordsSize; i++)
+            delete records[i];
+
+        delete [] records;
+    }
 }
 
 
@@ -492,6 +503,9 @@ MacabHeader *MacabRecords::createHeaderForProperty(const 
ABRecordRef _record, co
     if(propertyValue != nullptr)
         CFRelease(propertyValue);
 
+    if(localizedPropertyName != nullptr)
+        CFRelease(localizedPropertyName);
+
     return result;
 }
 
@@ -516,6 +530,8 @@ MacabHeader *MacabRecords::createHeaderForProperty(const 
ABPropertyType _propert
             headerNames = new macabfield *[1];
             headerNames[0] = new macabfield;
             headerNames[0]->value = _propertyName;
+            if(headerNames[0]->value)
+                CFRetain(_propertyName);
             headerNames[0]->type = _propertyType;
             break;
 
@@ -797,7 +813,11 @@ MacabHeader *MacabRecords::createHeaderForProperty(const 
ABPropertyType _propert
         manageDuplicateHeaders(headerNames, length);
         MacabHeader *headerResult = new MacabHeader(length, headerNames);
         for(sal_Int32 i = 0; i < length; ++i)
+        {
+            if(headerNames[i]->value)
+                CFRelease(headerNames[i]->value);
             delete headerNames[i];
+        }
         delete [] headerNames;
         return headerResult;
     }
diff --git a/connectivity/source/drivers/macab/MacabResultSet.cxx 
b/connectivity/source/drivers/macab/MacabResultSet.cxx
index e8784ba3a8a8..65e2642d6928 100644
--- a/connectivity/source/drivers/macab/MacabResultSet.cxx
+++ b/connectivity/source/drivers/macab/MacabResultSet.cxx
@@ -53,6 +53,7 @@ MacabResultSet::MacabResultSet(MacabCommonStatement* pStmt)
       OPropertySetHelper(MacabResultSet_BASE::rBHelper),
       m_xStatement(pStmt),
       m_aMacabRecords(),
+      m_bMacabRecordsNeedsDelete(false),
       m_nRowPos(-1),
       m_bWasNull(true),
       m_sTableName(MacabAddressBook::getDefaultTableName())
@@ -61,12 +62,19 @@ MacabResultSet::MacabResultSet(MacabCommonStatement* pStmt)
 
 MacabResultSet::~MacabResultSet()
 {
+    if(m_aMacabRecords != nullptr && m_bMacabRecordsNeedsDelete)
+        delete m_aMacabRecords;
 }
 
 void MacabResultSet::allMacabRecords()
 {
     rtl::Reference<MacabConnection> pConnection = static_cast< MacabConnection 
*>(m_xStatement->getConnection().get());
 
+    if(m_aMacabRecords != nullptr && m_bMacabRecordsNeedsDelete)
+    {
+        m_bMacabRecordsNeedsDelete = false;
+        delete m_aMacabRecords;
+    }
     m_aMacabRecords = 
pConnection->getAddressBook()->getMacabRecords(m_sTableName);
 }
 
@@ -87,6 +95,7 @@ void MacabResultSet::someMacabRecords(const MacabCondition 
*pCondition)
     // The copy constructor copies everything but records (including the
     // maximum allocated size, which means that we'll never have to resize)
     m_aMacabRecords = new MacabRecords(allRecords);
+    m_bMacabRecordsNeedsDelete = true;
 
     if(pCondition->isAlwaysFalse())
     {
diff --git a/connectivity/source/drivers/macab/MacabResultSet.hxx 
b/connectivity/source/drivers/macab/MacabResultSet.hxx
index c3c949afc414..645ecc077304 100644
--- a/connectivity/source/drivers/macab/MacabResultSet.hxx
+++ b/connectivity/source/drivers/macab/MacabResultSet.hxx
@@ -59,6 +59,7 @@ namespace connectivity::macab
         ::rtl::Reference< MacabCommonStatement >        m_xStatement;       // 
the statement that has created this result set
         ::rtl::Reference< MacabResultSetMetaData >  m_xMetaData;        // the 
description of the columns in this result set
         MacabRecords *                      m_aMacabRecords;    // address 
book entries matching the query
+        bool                                m_bMacabRecordsNeedsDelete;
         sal_Int32                                   m_nRowPos;          // the 
current row within the result set
         bool                                    m_bWasNull;         // last 
entry retrieved from this result set was NULL
         OUString                     m_sTableName;

Reply via email to