From 16565d4c0449d9a2cd132c20578a18145b31af60 Mon Sep 17 00:00:00 2001 From: Thomas Guillem Date: Tue, 20 Jan 2015 10:46:29 +0100 Subject: [PATCH] libvlc: media: fix leak if it has subitems Don't call libvlc_media_list_set_media from media since it causes p_md->p_subitems to retain p_md while p_md is already retaining p_md->p_subitems, therefore these 2 objects won't be releasable. Add a new internal variable: p_internal_md that is set from media without retaining it. Signed-off-by: Jean-Baptiste Kempf --- lib/media.c | 2 +- lib/media_list.c | 8 +++++++- lib/media_list_internal.h | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/media.c b/lib/media.c index c73c5b1859..b8b7620c1b 100644 --- a/lib/media.c +++ b/lib/media.c @@ -115,7 +115,7 @@ static libvlc_media_list_t *media_get_subitems( libvlc_media_t * p_md ) if( p_md->p_subitems != NULL ) { p_md->p_subitems->b_read_only = true; - libvlc_media_list_set_media( p_md->p_subitems, p_md ); + p_md->p_subitems->p_internal_md = p_md; } } p_subitems = p_md->p_subitems; diff --git a/lib/media_list.c b/lib/media_list.c index dff4edb5ec..62f0c31d21 100644 --- a/lib/media_list.c +++ b/lib/media_list.c @@ -184,6 +184,7 @@ libvlc_media_list_new( libvlc_instance_t * p_inst ) assert( p_mlist->items.i_count == 0 ); p_mlist->i_refcount = 1; p_mlist->p_md = NULL; + p_mlist->p_internal_md = NULL; return p_mlist; } @@ -285,6 +286,11 @@ void libvlc_media_list_set_media( libvlc_media_list_t * p_mlist, { vlc_mutex_lock( &p_mlist->object_lock ); + if( p_mlist->p_internal_md ) + { + vlc_mutex_unlock( &p_mlist->object_lock ); + return; + } libvlc_media_release( p_mlist->p_md ); libvlc_media_retain( p_md ); p_mlist->p_md = p_md; @@ -306,7 +312,7 @@ libvlc_media_list_media( libvlc_media_list_t * p_mlist ) libvlc_media_t *p_md; vlc_mutex_lock( &p_mlist->object_lock ); - p_md = p_mlist->p_md; + p_md = p_mlist->p_internal_md ? p_mlist->p_internal_md : p_mlist->p_md; if( p_md ) libvlc_media_retain( p_md ); vlc_mutex_unlock( &p_mlist->object_lock ); diff --git a/lib/media_list_internal.h b/lib/media_list_internal.h index 9c2412b355..47d2fbf807 100644 --- a/lib/media_list_internal.h +++ b/lib/media_list_internal.h @@ -44,6 +44,7 @@ struct libvlc_media_list_t vlc_mutex_t refcount_lock; libvlc_media_t * p_md; /* The media from which the * mlist comes, if any. */ + libvlc_media_t * p_internal_md; /* media set from media.c */ vlc_array_t items; /* This indicates if this media list is read-only -- 2.39.2