matroskademux: search_cluster should find preceding cluster before target
authorMark Nauwelaerts <mnauw@users.sourceforge.net>
Mon, 11 Sep 2017 18:24:27 +0000 (20:24 +0200)
committerMark Nauwelaerts <mnauw@users.sourceforge.net>
Mon, 11 Sep 2017 18:39:22 +0000 (20:39 +0200)
... 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

index a8bac1b..fe528a5 100644 (file)
@@ -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,