From 1b6eed694ce2bcde8e4b903901d8d2ccd8db01d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 13 Aug 2018 14:50:09 +0300 Subject: [PATCH] audioaggregator: Properly propagate caps negotiation failures Otherwise we'll end up doing a division by zero when clipping buffers, and might even accept buffers for which we don't know the caps. https://bugzilla.gnome.org/show_bug.cgi?id=796951 --- gst-libs/gst/audio/gstaudioaggregator.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/gst-libs/gst/audio/gstaudioaggregator.c b/gst-libs/gst/audio/gstaudioaggregator.c index 742a8acf9c..79aa448d52 100644 --- a/gst-libs/gst/audio/gstaudioaggregator.c +++ b/gst-libs/gst/audio/gstaudioaggregator.c @@ -1014,6 +1014,12 @@ gst_audio_aggregator_sink_event (GstAggregator * agg, break; } + if (!res) { + if (event) + gst_event_unref (event); + return res; + } + if (event != NULL) return GST_AGGREGATOR_CLASS (gst_audio_aggregator_parent_class)->sink_event @@ -1276,10 +1282,13 @@ gst_audio_aggregator_do_clip (GstAggregator * agg, GstAudioAggregatorPad *pad = GST_AUDIO_AGGREGATOR_PAD (bpad); gint rate, bpf; - rate = GST_AUDIO_INFO_RATE (&pad->info); - bpf = GST_AUDIO_INFO_BPF (&pad->info); + /* Guard against invalid audio info, we just don't clip here then */ + if (!GST_AUDIO_INFO_IS_VALID (&pad->info)) + return buffer; GST_OBJECT_LOCK (bpad); + rate = GST_AUDIO_INFO_RATE (&pad->info); + bpf = GST_AUDIO_INFO_BPF (&pad->info); buffer = gst_audio_buffer_clip (buffer, &bpad->segment, rate, bpf); GST_OBJECT_UNLOCK (bpad); @@ -1775,6 +1784,10 @@ gst_audio_aggregator_aggregate (GstAggregator * agg, gboolean timeout) } GST_OBJECT_UNLOCK (pad); continue; + } else if (!GST_AUDIO_INFO_IS_VALID (&pad->info)) { + GST_OBJECT_UNLOCK (pad); + GST_OBJECT_UNLOCK (agg); + goto not_negotiated; } /* New buffer? */