[vlc-commits] demux: fix multiple frees

Rémi Denis-Courmont git at videolan.org
Sat Jul 8 15:49:47 CEST 2017


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Jul  8 16:49:31 2017 +0300| [1ba591f0537b1fc2b37cc03da8c5c23ffdeb222e] | committer: Rémi Denis-Courmont

demux: fix multiple frees

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

 src/input/demux.c | 10 +---------
 src/input/input.c | 19 ++++++++++++-------
 2 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/src/input/demux.c b/src/input/demux.c
index f0a7b76912..f8cac46438 100644
--- a/src/input/demux.c
+++ b/src/input/demux.c
@@ -689,8 +689,6 @@ demux_t *demux_FilterChainNew( demux_t *p_demux, const char *psz_chain )
     }
 
     size_t i = vlc_array_count(&name);
-    vlc_array_t module;
-    vlc_array_init(&module);
     while(i--)
     {
         const char *p_name = vlc_array_item_at_index(&name, i);
@@ -698,22 +696,16 @@ demux_t *demux_FilterChainNew( demux_t *p_demux, const char *psz_chain )
         if(!p_next)
             goto error;
 
-        vlc_array_append(&module, p_next);
         p_demux = p_next;
     }
 
     vlc_array_clear(&name);
-    vlc_array_clear(&module);
 
     return p_demux;
  error:
     i++;    /* last module couldn't be created */
 
-    /* destroy all modules created, starting with the last one */
-    int modules = vlc_array_count(&module);
-    while(modules--)
-        demux_Delete(vlc_array_item_at_index(&module, modules));
-    vlc_array_clear(&module);
+    demux_Delete(p_demux);
 
     while(i--)
         free(vlc_array_item_at_index(&name, i));
diff --git a/src/input/input.c b/src/input/input.c
index 665a25986f..7b1b24d64a 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -2466,13 +2466,18 @@ static input_source_t *InputSourceNew( input_thread_t *p_input,
     }
 
     char *psz_demux_chain = var_GetNonEmptyString(p_input, "demux-filter");
-    /* add the chain of demux filters */
-    demux_t *p_filtered_demux = demux_FilterChainNew( in->p_demux, psz_demux_chain );
-    if ( p_filtered_demux != NULL )
-        in->p_demux = p_filtered_demux;
-    else if ( psz_demux_chain != NULL )
-        msg_Dbg(p_input, "Failed to create demux filter %s", psz_demux_chain);
-    free( psz_demux_chain );
+    if( psz_demux_chain != NULL ) /* add the chain of demux filters */
+    {
+        in->p_demux = demux_FilterChainNew( in->p_demux, psz_demux_chain );
+        free( psz_demux_chain );
+
+        if( in->p_demux == NULL )
+        {
+            msg_Err(p_input, "Failed to create demux filter");
+            vlc_object_release( in );
+            return NULL;
+        }
+    }
 
     /* Get infos from (access_)demux */
     bool b_can_seek;



More information about the vlc-commits mailing list