[vlc-commits] [Git][videolan/vlc][3.0.x] macosx: Correctly release dialog windows created by extension dialog provider

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Tue Mar 31 04:49:28 UTC 2026



Felix Paul Kühne pushed to branch 3.0.x at VideoLAN / VLC


Commits:
5690802d by Claudio Cambra at 2026-03-31T06:36:05+02:00
macosx: Correctly release dialog windows created by extension dialog provider

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -


1 changed file:

- modules/gui/macosx/VLCExtensionsDialogProvider.m


Changes:

=====================================
modules/gui/macosx/VLCExtensionsDialogProvider.m
=====================================
@@ -389,6 +389,14 @@ static void extensionDialogCallback(extension_dialog_t *p_ext_dialog,
     extension_dialog_t *dialog = [window dialog];
     extension_DialogClosed(dialog);
     dialog->p_sys_intf = NULL;
+
+    vlc_mutex_lock(&dialog->lock);
+    if (dialog->p_sys_intf) {
+        CFRelease(dialog->p_sys_intf);
+        dialog->p_sys_intf = NULL;
+    }
+    vlc_mutex_unlock(&dialog->lock);
+
     return YES;
 }
 
@@ -470,6 +478,7 @@ static void extensionDialogCallback(extension_dialog_t *p_ext_dialog,
                                                           styleMask:NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask
                                                             backing:NSBackingStoreBuffered
                                                               defer:NO];
+        [dialogWindow setReleasedWhenClosed:NO];
         [dialogWindow setDelegate:self];
         [dialogWindow setDialog:p_dialog];
         [dialogWindow setTitle:toNSStr(p_dialog->psz_title)];
@@ -499,9 +508,6 @@ static void extensionDialogCallback(extension_dialog_t *p_ext_dialog,
 {
     assert(p_dialog);
 
-    /* FIXME: Creating the dialog, we CFBridgingRetain p_sys_intf but we can't
-     *        just CFBridgingRelease it here, as that causes a crash.
-     */
     VLCDialogWindow *dialogWindow = (__bridge VLCDialogWindow*)p_dialog->p_sys_intf;
     if (!dialogWindow) {
         msg_Warn(getIntf(), "dialog window not found");
@@ -512,6 +518,13 @@ static void extensionDialogCallback(extension_dialog_t *p_ext_dialog,
     [dialogWindow close];
     dialogWindow = nil;
 
+    /* Release the reference retained by CFBridgingRetain in
+     * createExtensionDialog. We use CFRelease rather than
+     * CFBridgingRelease to avoid transferring ownership back
+     * to ARC, which would crash as the pointer is still live
+     * on the call stack.
+     */
+    CFRelease(p_dialog->p_sys_intf);
     p_dialog->p_sys_intf = NULL;
     vlc_cond_signal(&p_dialog->cond);
     return VLC_SUCCESS;



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/5690802d903538ea2ffffd880b43afb25a3647a5

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/5690802d903538ea2ffffd880b43afb25a3647a5
You're receiving this email because of your account on code.videolan.org.




More information about the vlc-commits mailing list