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;