gst/wavparse/gstwavparse.c: Don't try to read beyond the end of the file just because...
authorTim-Philipp Müller <tim@centricular.net>
Thu, 23 Mar 2006 16:50:32 +0000 (16:50 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Thu, 23 Mar 2006 16:50:32 +0000 (16:50 +0000)
Original commit message from CVS:
* gst/wavparse/gstwavparse.c: (gst_wavparse_get_upstream_size),
(gst_wavparse_stream_headers), (gst_wavparse_stream_data):
Don't try to read beyond the end of the file just because
the header claims a bigger size (like with truncated files).

ChangeLog
common
gst/wavparse/gstwavparse.c

index c5e6a85b31186565296138ee4f13013e16b68ba2..6cf0f8c51eb2a3602f965da0e48ca2e919268bde 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-03-23  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * gst/wavparse/gstwavparse.c: (gst_wavparse_get_upstream_size),
+       (gst_wavparse_stream_headers), (gst_wavparse_stream_data):
+         Don't try to read beyond the end of the file just because
+         the header claims a bigger size (like with truncated files).
+
 2006-03-23  Tim-Philipp Müller  <tim at centricular dot net>
 
        * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek),
diff --git a/common b/common
index 658b51189850df022f032a4310c4ad477a76465f..252846b570144570a0aee25b5adefbfac3f5d4eb 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit 658b51189850df022f032a4310c4ad477a76465f
+Subproject commit 252846b570144570a0aee25b5adefbfac3f5d4eb
index fcb773eb4677a0f7e31149f2d065d3aa25120ba8..a6aac5c30e17aecf2b3579fef4bc513a7a22d689 100644 (file)
@@ -868,6 +868,21 @@ no_format:
   }
 }
 
+static gboolean
+gst_wavparse_get_upstream_size (GstWavParse * wav, gint64 * len)
+{
+  gboolean res = FALSE;
+  GstFormat fmt = GST_FORMAT_BYTES;
+  GstPad *peer;
+
+  if ((peer = gst_pad_get_peer (wav->sinkpad))) {
+    res = gst_pad_query_duration (peer, &fmt, len);
+    gst_object_unref (peer);
+  }
+
+  return res;
+}
+
 static GstFlowReturn
 gst_wavparse_stream_headers (GstWavParse * wav)
 {
@@ -925,6 +940,11 @@ gst_wavparse_stream_headers (GstWavParse * wav)
   if (!caps)
     goto unknown_format;
 
+  GST_DEBUG_OBJECT (wav, "blockalign = %u", (guint) wav->blockalign);
+  GST_DEBUG_OBJECT (wav, "width      = %u", (guint) wav->width);
+  GST_DEBUG_OBJECT (wav, "depth      = %u", (guint) wav->depth);
+  GST_DEBUG_OBJECT (wav, "bps        = %u", (guint) wav->bps);
+
   /* create pad later so we can sniff the first few bytes
    * of the real data and correct our caps if necessary */
   gst_caps_replace (&wav->caps, caps);
@@ -961,19 +981,27 @@ gst_wavparse_stream_headers (GstWavParse * wav)
 
     switch (tag) {
         /* TODO : Implement the various cases */
-      case GST_RIFF_TAG_data:
+      case GST_RIFF_TAG_data:{
+        gint64 upstream_size;
+
         GST_DEBUG_OBJECT (wav, "Got 'data' TAG, size : %d", size);
         gotdata = TRUE;
         wav->offset += 8;
         wav->datastart = wav->offset;
+        /* file might be truncated */
+        if (gst_wavparse_get_upstream_size (wav, &upstream_size)) {
+          size = MIN (size, (upstream_size - wav->datastart));
+        }
         wav->datasize = size;
         wav->dataleft = size;
         wav->end_offset = size + wav->datastart;
         break;
+      }
       default:
         GST_DEBUG_OBJECT (wav, "Ignoring tag %" GST_FOURCC_FORMAT,
             GST_FOURCC_ARGS (tag));
         wav->offset += 8 + ((size + 1) & ~1);
+        break;
     }
     gst_buffer_unref (buf);
   }
@@ -1145,7 +1173,7 @@ gst_wavparse_stream_data (GstWavParse * wav, gboolean first)
       wav->offset, wav->end_offset);
 
   /* Get the next n bytes and output them */
-  if (wav->dataleft == 0)
+  if (wav->dataleft == 0 || wav->dataleft < wav->blockalign)
     goto found_eos;
 
   /* scale the amount of data by the segment rate so we get equal
@@ -1228,8 +1256,8 @@ found_eos:
   }
 pull_error:
   {
-    GST_DEBUG_OBJECT (wav, "Error getting %ldd bytes from the sinkpad!",
-        desired);
+    GST_DEBUG_OBJECT (wav, "Error getting %" G_GINT64_FORMAT " bytes from the "
+        "sinkpad (dataleft = %" G_GINT64_FORMAT ")", desired, wav->dataleft);
     return res;
   }
 push_error: