aiff: Fix infinite loop in header parsing.
authorMartin Theriault <mtheriault@espial.com>
Mon, 15 Jul 2019 19:48:08 +0000 (15:48 -0400)
committerTim-Philipp Müller <tim@centricular.com>
Fri, 9 Aug 2019 23:20:49 +0000 (00:20 +0100)
gst/aiff/aiffparse.c

index b1b1167..8543b0e 100644 (file)
@@ -643,14 +643,17 @@ gst_aiff_parse_calculate_duration (GstAiffParse * aiff)
   return FALSE;
 }
 
-static void
+static gboolean
 gst_aiff_parse_ignore_chunk (GstAiffParse * aiff, guint32 tag, guint32 size)
 {
   guint flush;
 
   if (aiff->streaming) {
-    if (!gst_aiff_parse_peek_chunk (aiff, &tag, &size))
-      return;
+    if (!gst_aiff_parse_peek_chunk (aiff, &tag, &size)) {
+      GST_LOG_OBJECT (aiff, "Not enough data to skip tag %" GST_FOURCC_FORMAT,
+          GST_FOURCC_ARGS (tag));
+      return FALSE;
+    }
   }
   GST_WARNING_OBJECT (aiff, "Ignoring tag %" GST_FOURCC_FORMAT,
       GST_FOURCC_ARGS (tag));
@@ -659,6 +662,7 @@ gst_aiff_parse_ignore_chunk (GstAiffParse * aiff, guint32 tag, guint32 size)
   if (aiff->streaming) {
     gst_adapter_flush (aiff->adapter, flush);
   }
+  return TRUE;
 }
 
 static double
@@ -1116,11 +1120,15 @@ gst_aiff_parse_stream_headers (GstAiffParse * aiff)
       }
       case GST_MAKE_FOURCC ('C', 'H', 'A', 'N'):{
         GST_FIXME_OBJECT (aiff, "Handle CHAN chunk with channel layouts");
-        gst_aiff_parse_ignore_chunk (aiff, tag, size);
+        if (!gst_aiff_parse_ignore_chunk (aiff, tag, size)) {
+          return GST_FLOW_OK;
+        }
         break;
       }
       default:
-        gst_aiff_parse_ignore_chunk (aiff, tag, size);
+        if (!gst_aiff_parse_ignore_chunk (aiff, tag, size)) {
+          return GST_FLOW_OK;
+        }
     }
 
     buf = NULL;