summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-02-04 09:33:57 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-02-04 09:33:57 +0000
commit8fdb1522a2b3eb61ccaea0e5f507a18d5bb0b2ff (patch)
tree6691ab5c69b4dc36f5fa912cc1ef1b22a5b88e2f /libmpdemux
parentf0ae1f2dcef446bc9eb0bd158bce57d2a69d47a1 (diff)
downloadmpv-8fdb1522a2b3eb61ccaea0e5f507a18d5bb0b2ff.tar.bz2
mpv-8fdb1522a2b3eb61ccaea0e5f507a18d5bb0b2ff.tar.xz
Do not read beyond end of data chunk if chunk_size is set.
Sample: http://samples.mplayerhq.hu/A-codecs/wavpcm/ahh.wav git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22121 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_audio.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c
index 5c0bd7f94b..315e583ec9 100644
--- a/libmpdemux/demux_audio.c
+++ b/libmpdemux/demux_audio.c
@@ -454,7 +454,7 @@ static int demux_audio_open(demuxer_t* demuxer) {
stream_skip(demuxer->stream, chunk_size);
} while (chunk_type != mmioFOURCC('d', 'a', 't', 'a'));
demuxer->movi_start = stream_tell(s);
- demuxer->movi_end = s->end_pos;
+ demuxer->movi_end = chunk_size ? demuxer->movi_start + chunk_size : s->end_pos;
// printf("wav: %X .. %X\n",(int)demuxer->movi_start,(int)demuxer->movi_end);
// Check if it contains dts audio
if((w->wFormatTag == 0x01) && (w->nChannels == 2) && (w->nSamplesPerSec == 44100)) {
@@ -598,6 +598,11 @@ static int demux_audio_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) {
case WAV : {
unsigned align = sh_audio->wf->nBlockAlign;
l = sh_audio->wf->nAvgBytesPerSec;
+ if (demux->movi_end && l > demux->movi_end - stream_tell(s)) {
+ // do not read beyond end, there might be junk after data chunk
+ l = demux->movi_end - stream_tell(s);
+ if (l <= 0) return 0;
+ }
if (align)
l = (l + align - 1) / align * align;
dp = new_demux_packet(l);