[vlc-commits] playlist tree: fix potential memleak

Rafaël Carré git at videolan.org
Mon Aug 8 01:58:29 CEST 2011


vlc | branch: master | Rafaël Carré <rafael.carre at gmail.com> | Sun Aug  7 19:23:40 2011 -0400| [7d84269bff28a7e173ef521a56fff5acca2590cf] | committer: Rafaël Carré

playlist tree: fix potential memleak

also remove one level of indentation

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

 src/playlist/tree.c |   75 +++++++++++++++++++++++---------------------------
 1 files changed, 35 insertions(+), 40 deletions(-)

diff --git a/src/playlist/tree.c b/src/playlist/tree.c
index fd7233a..e306572 100644
--- a/src/playlist/tree.c
+++ b/src/playlist/tree.c
@@ -141,60 +141,55 @@ int playlist_NodeDelete( playlist_t *p_playlist, playlist_item_t *p_root,
                          bool b_delete_items, bool b_force )
 {
     PL_ASSERT_LOCKED;
-    int i;
 
     /* Delete the children */
-    for( i = p_root->i_children - 1 ; i >= 0; i-- )
-    {
-        if( b_delete_items || p_root->pp_children[i]->i_children > -1 )
-        {
+    for( int i = p_root->i_children - 1 ; i >= 0; i-- )
+        if( b_delete_items || p_root->pp_children[i]->i_children >= 0 )
             playlist_NodeDelete( p_playlist, p_root->pp_children[i],
                                  b_delete_items, b_force );
-        }
-    }
+
     /* Delete the node */
     if( p_root->i_flags & PLAYLIST_RO_FLAG && !b_force )
-    {
+        return VLC_SUCCESS;
+
+    pl_priv(p_playlist)->b_reset_currently_playing = true;
+
+    int i;
+    var_SetInteger( p_playlist, "playlist-item-deleted", p_root->i_id );
+    ARRAY_BSEARCH( p_playlist->all_items, ->i_id, int, p_root->i_id, i );
+    if( i != -1 ) {
+        vlc_gc_decref(p_playlist->all_items.p_elems[i]->p_input);
+        printf("deleting %d %p\n", i, p_playlist->all_items.p_elems[i]->p_input);
+        ARRAY_REMOVE( p_playlist->all_items, i );
     }
-    else
-    {
-        pl_priv(p_playlist)->b_reset_currently_playing = true;
 
-        int i;
-        var_SetInteger( p_playlist, "playlist-item-deleted", p_root->i_id );
-        ARRAY_BSEARCH( p_playlist->all_items, ->i_id, int,
-                       p_root->i_id, i );
+    if( p_root->i_children == -1 ) {
+        ARRAY_BSEARCH( p_playlist->items,->i_id, int, p_root->i_id, i );
         if( i != -1 )
-            ARRAY_REMOVE( p_playlist->all_items, i );
-
-        if( p_root->i_children == -1 ) {
-            ARRAY_BSEARCH( p_playlist->items,->i_id, int, p_root->i_id, i );
-            if( i != -1 )
-                ARRAY_REMOVE( p_playlist->items, i );
-        }
+            ARRAY_REMOVE( p_playlist->items, i );
+    }
 
-        /* Check if it is the current item */
-        if( get_current_status_item( p_playlist ) == p_root )
-        {
-            /* Stop */
-            playlist_Control( p_playlist, PLAYLIST_STOP, pl_Locked );
-            msg_Info( p_playlist, "stopping playback" );
-            /* This item can't be the next one to be played ! */
-            set_current_status_item( p_playlist, NULL );
-        }
+    /* Check if it is the current item */
+    if( get_current_status_item( p_playlist ) == p_root )
+    {
+        /* Stop */
+        playlist_Control( p_playlist, PLAYLIST_STOP, pl_Locked );
+        msg_Info( p_playlist, "stopping playback" );
+        /* This item can't be the next one to be played ! */
+        set_current_status_item( p_playlist, NULL );
+    }
 
-        ARRAY_BSEARCH( p_playlist->current,->i_id, int, p_root->i_id, i );
-        if( i != -1 )
-            ARRAY_REMOVE( p_playlist->current, i );
+    ARRAY_BSEARCH( p_playlist->current,->i_id, int, p_root->i_id, i );
+    if( i != -1 )
+        ARRAY_REMOVE( p_playlist->current, i );
 
-        PL_DEBUG( "deleting item `%s'", p_root->p_input->psz_name );
+    PL_DEBUG( "deleting item `%s'", p_root->p_input->psz_name );
 
-        /* Remove the item from its parent */
-        if( p_root->p_parent )
-            playlist_NodeRemoveItem( p_playlist, p_root, p_root->p_parent );
+    /* Remove the item from its parent */
+    if( p_root->p_parent )
+        playlist_NodeRemoveItem( p_playlist, p_root, p_root->p_parent );
 
-        playlist_ItemRelease( p_root );
-    }
+    playlist_ItemRelease( p_root );
     return VLC_SUCCESS;
 }
 



More information about the vlc-commits mailing list