Ensure the dispatch source only gets deallocated after the dispatch_source_cancel...
authorClaudio Cambra <claudio.cambra@gmail.com>
Wed, 15 Jun 2022 10:06:41 +0000 (12:06 +0200)
committerClaudio Cambra <claudio.cambra@gmail.com>
Fri, 1 Jul 2022 11:15:40 +0000 (13:15 +0200)
Signed-off-by: Claudio Cambra <claudio.cambra@gmail.com>
shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/LocalSocketClient.m

index 37c39cc7b24c851875b6260ff21427b07e481b63..ab43a5df2f98b3939bcc26a12c8cd352c171d8c6 100644 (file)
     NSLog(@"Closing connection.");
     
     if(self.readSource) {
+        // Since dispatch_source_cancel works asynchronously, if we deallocate the dispatch source here then we can
+        // cause a crash. So instead we strongly hold a reference to the read source and deallocate it asynchronously
+        // with the handler.
+        __block dispatch_source_t previousReadSource = self.readSource;
+        dispatch_source_set_cancel_handler(self.readSource, ^{
+            previousReadSource = nil;
+        });
         dispatch_source_cancel(self.readSource);
+        // The readSource is still alive due to the other reference and will be deallocated by the cancel handler
         self.readSource = nil;
     }
     
     if(self.writeSource) {
+        // Same deal with the write source
+        __block dispatch_source_t previousWriteSource = self.writeSource;
+        dispatch_source_set_cancel_handler(self.writeSource, ^{
+            previousWriteSource = nil;
+        });
         dispatch_source_cancel(self.writeSource);
         self.writeSource = nil;
     }