[vlc-devel] [PATCH] Qt: do not free module config too early

Edward Wang edward.c.wang at compdigitec.com
Mon Aug 19 05:17:16 CEST 2013


Fix regression introduced in 95f145933a553e082eb42577d72dbf8bdea9972b

ConfigControl::getName() uses memory of p_item which is a part of p_config memory. This was causing a crash when trying to save the preferences, as the constructor had already destroyed it upon creation.

Instead, free the p_config memory on the destructor, which is automatically called when the dialog closes, saved or cancelled. Verified to not leak any memory.

Close #9214
---
 Backport to 2.1 requested, as it is affected as well

 modules/gui/qt4/components/complete_preferences.cpp | 13 +++++++------
 modules/gui/qt4/components/complete_preferences.hpp |  1 +
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/modules/gui/qt4/components/complete_preferences.cpp b/modules/gui/qt4/components/complete_preferences.cpp
index 8269212..c4e98f7 100644
--- a/modules/gui/qt4/components/complete_preferences.cpp
+++ b/modules/gui/qt4/components/complete_preferences.cpp
@@ -580,7 +580,9 @@ bool PrefsItemData::contains( const QString &text, Qt::CaseSensitivity cs )
  * The Panel
  *********************************************************************/
 AdvPrefsPanel::AdvPrefsPanel( QWidget *_parent ) : QWidget( _parent )
-{}
+{
+    p_config = NULL;
+}
 
 AdvPrefsPanel::AdvPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent,
                         PrefsItemData * data ) :
@@ -588,6 +590,7 @@ AdvPrefsPanel::AdvPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent,
 {
     /* Find our module */
     module_t *p_module = NULL;
+    p_config = NULL;
     if( data->i_type == PrefsItemData::TYPE_CATEGORY )
         return;
     else if( data->i_type == PrefsItemData::TYPE_MODULE )
@@ -599,8 +602,8 @@ AdvPrefsPanel::AdvPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent,
     }
 
     unsigned confsize;
-    module_config_t *const p_config = module_config_get( p_module, &confsize ),
-                    *p_item = p_config,
+    p_config = module_config_get( p_module, &confsize );
+    module_config_t *p_item = p_config,
                     *p_end = p_config + confsize;
 
     if( data->i_type == PrefsItemData::TYPE_SUBCATEGORY ||
@@ -730,8 +733,6 @@ AdvPrefsPanel::AdvPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent,
     scroller->setWidgetResizable( true );
     global_layout->addWidget( scroller );
     setLayout( global_layout );
-
-    module_config_free( p_config );
 }
 
 void AdvPrefsPanel::apply()
@@ -746,5 +747,5 @@ void AdvPrefsPanel::clean()
 AdvPrefsPanel::~AdvPrefsPanel()
 {
     qDeleteAll( controls ); controls.clear();
+    module_config_free( p_config );
 }
-
diff --git a/modules/gui/qt4/components/complete_preferences.hpp b/modules/gui/qt4/components/complete_preferences.hpp
index acf4823..3b32c3a 100644
--- a/modules/gui/qt4/components/complete_preferences.hpp
+++ b/modules/gui/qt4/components/complete_preferences.hpp
@@ -100,6 +100,7 @@ public:
     void apply();
     void clean();
 private:
+    module_config_t *p_config;
     intf_thread_t *p_intf;
     QList<ConfigControl *> controls;
     QVBoxLayout *global_layout;
-- 
1.8.4.rc3




More information about the vlc-devel mailing list