From 65a298fdeee5b9214f83878a6d757e90d45562cb Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Mon, 17 Jan 2011 15:30:08 +0530 Subject: [PATCH] discoverer: Validate timeouts before processing them This avoids a race where the timeout callback is scheduled to run but we get sufficient information to finish discovery before actually getting around to executing the callback. See the documentation of g_source_is_destroyed() for more details. https://bugzilla.gnome.org/show_bug.cgi?id=639730 --- gst-libs/gst/pbutils/gstdiscoverer.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/gst-libs/gst/pbutils/gstdiscoverer.c b/gst-libs/gst/pbutils/gstdiscoverer.c index ab32b915ed..46e2cfbb6b 100644 --- a/gst-libs/gst/pbutils/gstdiscoverer.c +++ b/gst-libs/gst/pbutils/gstdiscoverer.c @@ -1153,12 +1153,14 @@ discoverer_bus_cb (GstBus * bus, GstMessage * msg, GstDiscoverer * dc) static gboolean async_timeout_cb (GstDiscoverer * dc) { - dc->priv->timeoutid = 0; - GST_DEBUG ("Setting result to TIMEOUT"); - dc->priv->current_info->result = GST_DISCOVERER_TIMEOUT; - dc->priv->processing = FALSE; - discoverer_collect (dc); - discoverer_cleanup (dc); + if (!g_source_is_destroyed (g_main_current_source ())) { + dc->priv->timeoutid = 0; + GST_DEBUG ("Setting result to TIMEOUT"); + dc->priv->current_info->result = GST_DISCOVERER_TIMEOUT; + dc->priv->processing = FALSE; + discoverer_collect (dc); + discoverer_cleanup (dc); + } return FALSE; }