From 24e21ae6e9d0cc81b5fb93668848437e6a851df9 Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Sat, 3 May 2008 09:18:22 +0000 Subject: ext/gconf/: When we can't create a fakesink/fakesrc complain instead of unreffing Original commit message from CVS: * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_reset), (gst_gconf_audio_src_change_state): * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), (gst_gconf_video_sink_change_state): * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_reset), (gst_gconf_video_src_change_state): * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset), (gst_switch_commit_new_kid), (gst_switch_sink_change_state): When we can't create a fakesink/fakesrc complain instead of unreffing NULL pointers and crashing later. See bug #530535. --- ext/gconf/gstgconfaudiosrc.c | 10 ++++++++-- ext/gconf/gstgconfvideosink.c | 11 +++++++++-- ext/gconf/gstgconfvideosrc.c | 11 +++++++++-- ext/gconf/gstswitchsink.c | 13 ++++++++++--- 4 files changed, 36 insertions(+), 9 deletions(-) (limited to 'ext/gconf') diff --git a/ext/gconf/gstgconfaudiosrc.c b/ext/gconf/gstgconfaudiosrc.c index b9379c4c..589cf6af 100644 --- a/ext/gconf/gstgconfaudiosrc.c +++ b/ext/gconf/gstgconfaudiosrc.c @@ -71,7 +71,7 @@ gst_gconf_audio_src_class_init (GstGConfAudioSrcClass * klass) * Hack to make negotiation work. */ -static void +static gboolean gst_gconf_audio_src_reset (GstGConfAudioSrc * src) { GstPad *targetpad; @@ -82,6 +82,10 @@ gst_gconf_audio_src_reset (GstGConfAudioSrc * src) gst_bin_remove (GST_BIN (src), src->kid); } src->kid = gst_element_factory_make ("fakesrc", "testsrc"); + if (!src->kid) { + GST_ERROR_OBJECT (src, "Failed to create fakesrc"); + return FALSE; + } gst_bin_add (GST_BIN (src), src->kid); targetpad = gst_element_get_pad (src->kid, "src"); @@ -90,6 +94,7 @@ gst_gconf_audio_src_reset (GstGConfAudioSrc * src) g_free (src->gconf_str); src->gconf_str = NULL; + return TRUE; } static void @@ -225,7 +230,8 @@ gst_gconf_audio_src_change_state (GstElement * element, switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: - gst_gconf_audio_src_reset (src); + if (!gst_gconf_audio_src_reset (src)) + ret = GST_STATE_CHANGE_FAILURE; break; default: break; diff --git a/ext/gconf/gstgconfvideosink.c b/ext/gconf/gstgconfvideosink.c index e22791db..1e7c16e6 100644 --- a/ext/gconf/gstgconfvideosink.c +++ b/ext/gconf/gstgconfvideosink.c @@ -70,7 +70,7 @@ gst_gconf_video_sink_class_init (GstGConfVideoSinkClass * klass) * Hack to make negotiation work. */ -static void +static gboolean gst_gconf_video_sink_reset (GstGConfVideoSink * sink) { GstPad *targetpad; @@ -81,6 +81,10 @@ gst_gconf_video_sink_reset (GstGConfVideoSink * sink) gst_bin_remove (GST_BIN (sink), sink->kid); } sink->kid = gst_element_factory_make ("fakesink", "testsink"); + if (!sink->kid) { + GST_ERROR_OBJECT (sink, "Failed to create fakesink"); + return FALSE; + } gst_bin_add (GST_BIN (sink), sink->kid); targetpad = gst_element_get_pad (sink->kid, "sink"); @@ -89,6 +93,8 @@ gst_gconf_video_sink_reset (GstGConfVideoSink * sink) g_free (sink->gconf_str); sink->gconf_str = NULL; + + return TRUE; } static void @@ -223,7 +229,8 @@ gst_gconf_video_sink_change_state (GstElement * element, switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: - gst_gconf_video_sink_reset (sink); + if (!gst_gconf_video_sink_reset (sink)) + ret = GST_STATE_CHANGE_FAILURE; break; default: break; diff --git a/ext/gconf/gstgconfvideosrc.c b/ext/gconf/gstgconfvideosrc.c index 2735a901..5d5fcb11 100644 --- a/ext/gconf/gstgconfvideosrc.c +++ b/ext/gconf/gstgconfvideosrc.c @@ -71,7 +71,7 @@ gst_gconf_video_src_class_init (GstGConfVideoSrcClass * klass) * Hack to make negotiation work. */ -static void +static gboolean gst_gconf_video_src_reset (GstGConfVideoSrc * src) { GstPad *targetpad; @@ -82,6 +82,10 @@ gst_gconf_video_src_reset (GstGConfVideoSrc * src) gst_bin_remove (GST_BIN (src), src->kid); } src->kid = gst_element_factory_make ("fakesrc", "testsrc"); + if (!src->kid) { + GST_ERROR_OBJECT (src, "Failed to create fakesrc"); + return FALSE; + } gst_bin_add (GST_BIN (src), src->kid); targetpad = gst_element_get_pad (src->kid, "src"); @@ -90,6 +94,8 @@ gst_gconf_video_src_reset (GstGConfVideoSrc * src) g_free (src->gconf_str); src->gconf_str = NULL; + + return TRUE; } static void @@ -217,7 +223,8 @@ gst_gconf_video_src_change_state (GstElement * element, switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: - gst_gconf_video_src_reset (src); + if (!gst_gconf_video_src_reset (src)) + ret = GST_STATE_CHANGE_FAILURE; break; default: break; diff --git a/ext/gconf/gstswitchsink.c b/ext/gconf/gstswitchsink.c index d8da2ae0..6c9fff17 100644 --- a/ext/gconf/gstswitchsink.c +++ b/ext/gconf/gstswitchsink.c @@ -76,15 +76,17 @@ gst_switch_sink_class_init (GstSwitchSinkClass * klass) } } -static void +static gboolean gst_switch_sink_reset (GstSwitchSink * sink) { /* this will install fakesink if no other child has been set, * otherwise we rely on the subclass to know when to unset its * custom kid */ if (sink->kid == NULL) { - gst_switch_sink_set_child (sink, NULL); + return gst_switch_sink_set_child (sink, NULL); } + + return TRUE; } static void @@ -143,6 +145,10 @@ gst_switch_commit_new_kid (GstSwitchSink * sink) if (new_kid == NULL) { GST_DEBUG_OBJECT (sink, "Replacing kid with fakesink"); new_kid = gst_element_factory_make ("fakesink", "testsink"); + if (new_kid == NULL) { + GST_ERROR_OBJECT (sink, "Failed to create fakesink"); + return FALSE; + } /* Add a reference, as it would if the element came from sink->new_kid */ gst_object_ref (new_kid); g_object_set (new_kid, "sync", TRUE, NULL); @@ -299,7 +305,8 @@ gst_switch_sink_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: - gst_switch_sink_reset (sink); + if (!gst_switch_sink_reset (sink)) + ret = GST_STATE_CHANGE_FAILURE; break; default: break; -- cgit