From 459333b3c0080d7b5ceafaa62067d21176a00304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 23 Mar 2006 16:50:32 +0000 Subject: [PATCH] gst/wavparse/gstwavparse.c: Don't try to read beyond the end of the file just because the header claims a bigger size... 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 | 7 +++++++ common | 2 +- gst/wavparse/gstwavparse.c | 36 ++++++++++++++++++++++++++++++++---- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index c5e6a85b31..6cf0f8c51e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-03-23 Tim-Philipp Müller + + * 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 * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), diff --git a/common b/common index 658b511898..252846b570 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 658b51189850df022f032a4310c4ad477a76465f +Subproject commit 252846b570144570a0aee25b5adefbfac3f5d4eb diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c index fcb773eb46..a6aac5c30e 100644 --- a/gst/wavparse/gstwavparse.c +++ b/gst/wavparse/gstwavparse.c @@ -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: