]> git.sesse.net Git - vlc/blobdiff - src/config/core.c
Save one memory copy and fix the helper module leak
[vlc] / src / config / core.c
index 8d7e48c76186dba4bf9e2091eaee010a47f6a5b9..0caaa6fae10ca45b49c9e08f253b114113eb48f8 100644 (file)
@@ -89,7 +89,7 @@ int IsConfigStringType (int type)
 }
 
 
-static int IsConfigIntegerType (int type)
+int IsConfigIntegerType (int type)
 {
     static const unsigned char config_types[] =
     {
@@ -101,12 +101,6 @@ static int IsConfigIntegerType (int type)
 }
 
 
-static inline int IsConfigFloatType (int type)
-{
-    return type == CONFIG_ITEM_FLOAT;
-}
-
-
 /*****************************************************************************
  * config_GetType: get the type of a variable (bool, int, float, string)
  *****************************************************************************
@@ -470,7 +464,9 @@ module_config_t *config_FindConfig( vlc_object_t *p_this, const char *psz_name )
             if( p_item->i_type & CONFIG_HINT )
                 /* ignore hints */
                 continue;
-            if( !strcmp( psz_name, p_item->psz_name ) )
+            if( !strcmp( psz_name, p_item->psz_name )
+             || ( p_item->psz_oldname
+              && !strcmp( psz_name, p_item->psz_oldname ) ) )
             {
                 vlc_list_release( p_list );
                 return p_item;
@@ -483,34 +479,6 @@ module_config_t *config_FindConfig( vlc_object_t *p_this, const char *psz_name )
     return NULL;
 }
 
-/*****************************************************************************
- * config_FindModule: find a specific module structure.
- *****************************************************************************/
-module_t *config_FindModule( vlc_object_t *p_this, const char *psz_name )
-{
-    vlc_list_t *p_list;
-    module_t *p_module, *p_result = NULL;
-    int i_index;
-
-    if( !psz_name ) return NULL;
-
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
-
-    for( i_index = 0; i_index < p_list->i_count; i_index++ )
-    {
-        p_module = (module_t *)p_list->p_values[i_index].p_object;
-        if( !strcmp( p_module->psz_object_name, psz_name ) )
-        {
-             p_result = p_module;
-             break;
-        }
-    }
-
-    vlc_list_release( p_list );
-
-    return p_result;
-}
-
 /*****************************************************************************
  * config_Duplicate: creates a duplicate of a module's configuration data.
  *****************************************************************************
@@ -521,13 +489,9 @@ module_t *config_FindModule( vlc_object_t *p_this, const char *psz_name )
 int config_Duplicate( module_t *p_module, const module_config_t *p_orig,
                       size_t n )
 {
-    int j;
     const module_config_t *p_item, *p_end = p_orig + n;
 
     /* Calculate the structure length */
-    p_module->i_config_items = 0;
-    p_module->i_bool_items = 0;
-
     for( p_item = p_orig; p_item < p_end; p_item++ )
     {
         if( p_item->i_type & CONFIG_ITEM )
@@ -541,107 +505,13 @@ int config_Duplicate( module_t *p_module, const module_config_t *p_orig,
         }
     }
 
-    /* Allocate memory */
-    p_module->p_config = (module_config_t *)calloc( n, sizeof(*p_orig) );
-    if( p_module->p_config == NULL )
-    {
-        msg_Err( p_module, "config error: can't duplicate p_config" );
-        return VLC_ENOMEM;
-    }
+    p_module->p_config = p_orig;
     p_module->confsize = n;
 
     /* Do the duplication job */
     for( size_t i = 0; i < n ; i++ )
     {
-        p_module->p_config[i] = p_orig[i];
-
-        if (IsConfigIntegerType (p_module->p_config[i].i_type))
-        {
-            p_module->p_config[i].orig.i = p_orig[i].value.i;
-            p_module->p_config[i].saved.i = p_orig[i].value.i;
-        }
-        else
-        if (IsConfigFloatType (p_module->p_config[i].i_type))
-        {
-            p_module->p_config[i].orig.f = p_orig[i].value.f;
-            p_module->p_config[i].saved.f = p_orig[i].value.f;
-        }
-        else
-        if (IsConfigStringType (p_module->p_config[i].i_type))
-        {
-            p_module->p_config[i].value.psz = strdupnull (p_orig[i].value.psz);
-            p_module->p_config[i].orig.psz = strdupnull (p_orig[i].value.psz);
-            p_module->p_config[i].saved.psz = NULL;
-        }
-
-        p_module->p_config[i].psz_type = strdupnull (p_orig[i].psz_type);
-        p_module->p_config[i].psz_name = strdupnull (p_orig[i].psz_name);
-        p_module->p_config[i].psz_current = strdupnull (p_orig[i].psz_current);
-        p_module->p_config[i].psz_text = _strdupnull (p_orig[i].psz_text);
-        p_module->p_config[i].psz_longtext = _strdupnull (p_orig[i].psz_longtext);
-
         p_module->p_config[i].p_lock = &p_module->object_lock;
-
-        /* duplicate the string list */
-        if( p_orig[i].i_list )
-        {
-            if( p_orig[i].ppsz_list )
-            {
-                p_module->p_config[i].ppsz_list =
-                    malloc( (p_orig[i].i_list + 1) * sizeof(char *) );
-                if( p_module->p_config[i].ppsz_list )
-                {
-                    for( j = 0; j < p_orig[i].i_list; j++ )
-                        p_module->p_config[i].ppsz_list[j] =
-                                strdupnull (p_orig[i].ppsz_list[j]);
-                    p_module->p_config[i].ppsz_list[j] = NULL;
-                }
-            }
-            if( p_orig[i].ppsz_list_text )
-            {
-                p_module->p_config[i].ppsz_list_text =
-                    calloc( (p_orig[i].i_list + 1), sizeof(char *) );
-                if( p_module->p_config[i].ppsz_list_text )
-                {
-                    for( j = 0; j < p_orig[i].i_list; j++ )
-                        p_module->p_config[i].ppsz_list_text[j] =
-                                strdupnull (_(p_orig[i].ppsz_list_text[j]));
-                    p_module->p_config[i].ppsz_list_text[j] = NULL;
-                }
-            }
-            if( p_orig[i].pi_list )
-            {
-                p_module->p_config[i].pi_list =
-                    malloc( (p_orig[i].i_list + 1) * sizeof(int) );
-                if( p_module->p_config[i].pi_list )
-                {
-                    for( j = 0; j < p_orig[i].i_list; j++ )
-                        p_module->p_config[i].pi_list[j] =
-                            p_orig[i].pi_list[j];
-                }
-            }
-        }
-
-        /* duplicate the actions list */
-        if( p_orig[i].i_action )
-        {
-            int j;
-
-            p_module->p_config[i].ppf_action =
-                malloc( p_orig[i].i_action * sizeof(void *) );
-            p_module->p_config[i].ppsz_action_text =
-                malloc( p_orig[i].i_action * sizeof(char *) );
-
-            for( j = 0; j < p_orig[i].i_action; j++ )
-            {
-                p_module->p_config[i].ppf_action[j] =
-                    p_orig[i].ppf_action[j];
-                p_module->p_config[i].ppsz_action_text[j] =
-                    strdupnull (p_orig[i].ppsz_action_text[j]);
-            }
-        }
-
-        p_module->p_config[i].pf_callback = p_orig[i].pf_callback;
     }
     return VLC_SUCCESS;
 }
@@ -660,49 +530,42 @@ void config_Free( module_t *p_module )
     {
         module_config_t *p_item = p_module->p_config + j;
 
-        free( (char*) p_item->psz_type );
-        free( (char*) p_item->psz_name );
-        free( (char*) p_item->psz_current );
-        free( (char*) p_item->psz_text );
-        free( (char*) p_item->psz_longtext );
+        free( p_item->psz_type );
+        free( p_item->psz_name );
+        free( p_item->psz_text );
+        free( p_item->psz_longtext );
+        free( p_item->psz_oldname );
 
         if (IsConfigStringType (p_item->i_type))
         {
-            free ((char *)p_item->value.psz);
-            free ((char *)p_item->orig.psz);
-            free ((char *)p_item->saved.psz);
+            free (p_item->value.psz);
+            free (p_item->orig.psz);
+            free (p_item->saved.psz);
         }
 
-        if( p_item->i_list )
-        {
+        if( p_item->ppsz_list )
             for( i = 0; i < p_item->i_list; i++ )
-            {
-                if( p_item->ppsz_list && p_item->ppsz_list[i] )
-                    free( (char*) p_item->ppsz_list[i] );
-                if( p_item->ppsz_list_text && p_item->ppsz_list_text[i] )
-                    free( (char*) p_item->ppsz_list_text[i] );
-            }
-            if( p_item->ppsz_list ) free( p_item->ppsz_list );
-            if( p_item->ppsz_list_text ) free( p_item->ppsz_list_text );
-            if( p_item->pi_list ) free( p_item->pi_list );
-        }
+                free( p_item->ppsz_list[i] );
+        if( p_item->ppsz_list_text )
+            for( i = 0; i < p_item->i_list; i++ )
+                free( p_item->ppsz_list_text[i] );
+        free( p_item->ppsz_list );
+        free( p_item->ppsz_list_text );
+        free( p_item->pi_list );
 
         if( p_item->i_action )
         {
             for( i = 0; i < p_item->i_action; i++ )
             {
-                free( (char*) p_item->ppsz_action_text[i] );
+                free( p_item->ppsz_action_text[i] );
             }
-            if( p_item->ppf_action ) free( p_item->ppf_action );
-            if( p_item->ppsz_action_text ) free( p_item->ppsz_action_text );
+            free( p_item->ppf_action );
+            free( p_item->ppsz_action_text );
         }
     }
 
-    if (p_module->p_config != NULL)
-    {
-        free (p_module->p_config);
-        p_module->p_config = NULL;
-    }
+    free (p_module->p_config);
+    p_module->p_config = NULL;
 }
 
 /*****************************************************************************