From 0fa380b19996cde70af50ba247474779e746b833 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 21 Jun 2010 19:39:54 +0200 Subject: [PATCH] qtmux: Remove the pad from our internal list before calling collectpads Previously we would end up with the collectpaddata structure already freed. This would result in a bogus iteration of mux->sinkpads (all the GstQTPad being freed) and it wouldn't be removed from that list. Finally, due to it not being removed from that list, we would end up calling a bogus gst_qt_mux_pad_reset on those structures => SEGFAULT --- gst/quicktime/gstqtmux.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/gst/quicktime/gstqtmux.c b/gst/quicktime/gstqtmux.c index 64f71ff4bd..ce5a433bdb 100644 --- a/gst/quicktime/gstqtmux.c +++ b/gst/quicktime/gstqtmux.c @@ -2498,24 +2498,21 @@ gst_qt_mux_release_pad (GstElement * element, GstPad * pad) { GstQTMux *mux = GST_QT_MUX_CAST (element); GSList *walk; - gboolean to_remove; - /* let GstCollectPads complain if it is some unknown pad */ - if (gst_collect_pads_remove_pad (mux->collect, pad)) { - gst_element_remove_pad (element, pad); - to_remove = TRUE; - for (walk = mux->sinkpads; walk; walk = g_slist_next (walk)) { - GstQTPad *qtpad = (GstQTPad *) walk->data; - if (qtpad->collect.pad == pad) { - /* this is it, remove */ - mux->sinkpads = g_slist_delete_link (mux->sinkpads, walk); - to_remove = FALSE; - break; - } + GST_DEBUG_OBJECT (element, "Releasing %s:%s", GST_DEBUG_PAD_NAME (pad)); + + for (walk = mux->sinkpads; walk; walk = g_slist_next (walk)) { + GstQTPad *qtpad = (GstQTPad *) walk->data; + GST_DEBUG ("Checking %s:%s", GST_DEBUG_PAD_NAME (qtpad->collect.pad)); + if (qtpad->collect.pad == pad) { + /* this is it, remove */ + mux->sinkpads = g_slist_delete_link (mux->sinkpads, walk); + gst_element_remove_pad (element, pad); + break; } - if (to_remove) - GST_WARNING_OBJECT (mux, "Released pad not in internal sinkpad list"); } + + gst_collect_pads_remove_pad (mux->collect, pad); } static GstPad *