Fix retain crash when calling managerForDomain
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Wed, 1 Nov 2023 06:33:05 +0000 (14:33 +0800)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 19 Feb 2024 14:45:16 +0000 (22:45 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/gui/macOS/fileproviderutils_mac.mm

index fbb40f42fb153e00720aaaf7196f3a251941d6e3..1f3d046d9fcf49b7ff1123bbd9d8acb844138ba1 100644 (file)
@@ -47,8 +47,9 @@ NSFileProviderDomain *domainForIdentifier(const QString &domainIdentifier)
 
         for (NSFileProviderDomain *const domain in domains) {
             if ([domain.identifier isEqualToString:nsDomainIdentifier]) {
-                 foundDomain = domain;
-                 break;
+                [domain retain];
+                foundDomain = domain;
+                break;
             }
         }
 
@@ -56,6 +57,7 @@ NSFileProviderDomain *domainForIdentifier(const QString &domainIdentifier)
     }];
 
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
+    dispatch_release(semaphore);
 
     if (foundDomain == nil) {
         qCWarning(lcMacFileProviderUtils) << "No matching item domain for identifier"
@@ -68,13 +70,20 @@ NSFileProviderDomain *domainForIdentifier(const QString &domainIdentifier)
 NSFileProviderManager *managerForDomainIdentifier(const QString &domainIdentifier)
 {
     NSFileProviderDomain * const domain = domainForIdentifier(domainIdentifier);
-    NSFileProviderManager * const manager = [NSFileProviderManager managerForDomain:domain];
+    if (domain == nil) {
+        qCWarning(lcMacFileProviderUtils) << "Received null domain for identifier"
+                                          << domainIdentifier
+                                          << "cannot acquire manager";
+        return nil;
+    }
 
+    NSFileProviderManager * const manager = [NSFileProviderManager managerForDomain:domain];
     if (manager == nil) {
         qCWarning(lcMacFileProviderUtils) << "Received null manager for domain"
                                           << domainIdentifier;
     }
 
+    [domain release];
     return manager;
 }