From cf3f19501220ab859910417520b530c26ea84389 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Mon, 11 Sep 2017 20:24:27 +0200 Subject: [PATCH] matroskademux: search_cluster should find preceding cluster before target ... since failing this constraint takes search_pos by surprise which might then end up in an infinite loop. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=787538 --- gst/matroska/matroska-demux.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index a8bac1b406..fe528a5508 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -1703,15 +1703,23 @@ gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos, while (1) { GstByteReader reader; gint cluster_pos; + guint toread = chunk; - if (!forward) - newpos = MAX (0, newpos - chunk); + if (!forward) { + /* never read beyond the requested target */ + if (G_UNLIKELY (newpos < chunk)) { + toread = newpos; + newpos = 0; + } else { + newpos -= chunk; + } + } if (buf != NULL) { gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); buf = NULL; } - ret = gst_pad_pull_range (demux->common.sinkpad, newpos, chunk, &buf); + ret = gst_pad_pull_range (demux->common.sinkpad, newpos, toread, &buf); if (ret != GST_FLOW_OK) break; GST_DEBUG_OBJECT (demux,