[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