macOS: Fix memory leak in systemCaCertificates

We were releasing only the memory of latest iteration since cfCerts
was being rewritten in every iteration, invalidating the RAII.
Hence, we need to define the variable within the loop to ensure the
object is released for every iteration.

Task-number: QTBUG-66937
Change-Id: Iaa9365168728337c6cdaac4aef686652903cf5a9
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Pablo Marcos Oltra 2018-03-08 09:34:25 +01:00 committed by Timur Pocheptsov
parent c7c41fa1c6
commit c2373fce3c

View File

@ -128,10 +128,10 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
QList<QSslCertificate> systemCerts; QList<QSslCertificate> systemCerts;
// SecTrustSettingsCopyCertificates is not defined on iOS. // SecTrustSettingsCopyCertificates is not defined on iOS.
#ifdef Q_OS_OSX #ifdef Q_OS_OSX
QCFType<CFArrayRef> cfCerts;
// iterate through all enum members, order: // iterate through all enum members, order:
// kSecTrustSettingsDomainUser, kSecTrustSettingsDomainAdmin, kSecTrustSettingsDomainSystem // kSecTrustSettingsDomainUser, kSecTrustSettingsDomainAdmin, kSecTrustSettingsDomainSystem
for (int dom = kSecTrustSettingsDomainUser; dom <= int(kSecTrustSettingsDomainSystem); dom++) { for (int dom = kSecTrustSettingsDomainUser; dom <= int(kSecTrustSettingsDomainSystem); dom++) {
QCFType<CFArrayRef> cfCerts;
OSStatus status = SecTrustSettingsCopyCertificates(SecTrustSettingsDomain(dom), &cfCerts); OSStatus status = SecTrustSettingsCopyCertificates(SecTrustSettingsDomain(dom), &cfCerts);
if (status == noErr) { if (status == noErr) {
const CFIndex size = CFArrayGetCount(cfCerts); const CFIndex size = CFArrayGetCount(cfCerts);