[vlc-commits] commit: Qt4: fix x11_display double free and leaks ( Rémi Denis-Courmont )

git at videolan.org git at videolan.org
Mon Mar 8 18:51:08 CET 2010


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Mar  8 19:50:54 2010 +0200| [ab3dce8b11a2c4c10ba3eb3d022e5ba78f859655] | committer: Rémi Denis-Courmont 

Qt4: fix x11_display double free and leaks

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ab3dce8b11a2c4c10ba3eb3d022e5ba78f859655
---

 modules/gui/qt4/qt4.cpp |   20 ++++++++++++--------
 1 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/modules/gui/qt4/qt4.cpp b/modules/gui/qt4/qt4.cpp
index 256557e..0d46328 100644
--- a/modules/gui/qt4/qt4.cpp
+++ b/modules/gui/qt4/qt4.cpp
@@ -293,15 +293,19 @@ static int Open( vlc_object_t *p_this, bool isDialogProvider )
 #ifdef Q_WS_X11
     if( !XInitThreads() )
         return VLC_EGENERIC;
-    x11_display = var_CreateGetNonEmptyString( p_intf, "x11-display" );
+
+    char *display = var_CreateGetNonEmptyString( p_intf, "x11-display" );
     Display *p_display = XOpenDisplay( x11_display );
     if( !p_display )
     {
         msg_Err( p_intf, "Could not connect to X server" );
+        free (display);
         return VLC_EGENERIC;
     }
     XCloseDisplay( p_display );
     putenv( (char *)"XLIB_SKIP_ARGB_VISUALS=1" );
+#else
+    char *display = NULL;
 #endif
 
     bool busy;
@@ -312,6 +316,7 @@ static int Open( vlc_object_t *p_this, bool isDialogProvider )
     if (busy)
     {
         msg_Err (p_this, "cannot start Qt4 multiple times");
+        free (display);
         return VLC_EGENERIC;
     }
 
@@ -327,11 +332,13 @@ static int Open( vlc_object_t *p_this, bool isDialogProvider )
     if( vlc_clone( &p_sys->thread, Thread, p_intf, VLC_THREAD_PRIORITY_LOW ) )
     {
         delete p_sys;
+        free (display);
         vlc_mutex_lock (&one.lock);
         one.busy = false;
         vlc_mutex_unlock (&one.lock);
         return VLC_ENOMEM;
     }
+    x11_display = display;
 
     /* */
     vlc_sem_wait (&ready);
@@ -369,13 +376,14 @@ static void Close( vlc_object_t *p_this )
     QVLCApp::triggerQuit();
 
     vlc_join (p_sys->thread, NULL);
+#ifdef Q_WS_X11
+    free (x11_display);
+    x11_display = NULL;
+#endif
     delete p_sys;
     vlc_mutex_lock (&one.lock);
     one.busy = false;
     vlc_mutex_unlock (&one.lock);
-#ifdef Q_WS_X11
-    free (x11_display);
-#endif
 }
 
 static void *Thread( void *obj )
@@ -503,11 +511,7 @@ static void *Thread( void *obj )
     /* Destroy the MainInputManager */
     MainInputManager::killInstance();
 
-
     /* Delete the application automatically */
-#ifdef Q_WS_X11
-    free( x11_display );
-#endif
     return NULL;
 }
 



More information about the vlc-commits mailing list