Browse Source

shorten: Use a checked bytestream reader for the wave header

Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
tags/n2.1
Martin Storsjö 12 years ago
parent
commit
49568851bf
1 changed files with 16 additions and 13 deletions
  1. +16
    -13
      libavcodec/shorten.c

+ 16
- 13
libavcodec/shorten.c View File

@@ -202,31 +202,34 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
{
int len;
short wave_format;
GetByteContext gb;

if (bytestream_get_le32(&header) != MKTAG('R', 'I', 'F', 'F')) {
bytestream2_init(&gb, header, header_size);

if (bytestream2_get_le32(&gb) != MKTAG('R', 'I', 'F', 'F')) {
av_log(avctx, AV_LOG_ERROR, "missing RIFF tag\n");
return AVERROR_INVALIDDATA;
}

header += 4; /* chunk size */
bytestream2_skip(&gb, 4); /* chunk size */

if (bytestream_get_le32(&header) != MKTAG('W', 'A', 'V', 'E')) {
if (bytestream2_get_le32(&gb) != MKTAG('W', 'A', 'V', 'E')) {
av_log(avctx, AV_LOG_ERROR, "missing WAVE tag\n");
return AVERROR_INVALIDDATA;
}

while (bytestream_get_le32(&header) != MKTAG('f', 'm', 't', ' ')) {
len = bytestream_get_le32(&header);
header += len;
while (bytestream2_get_le32(&gb) != MKTAG('f', 'm', 't', ' ')) {
len = bytestream2_get_le32(&gb);
bytestream2_skip(&gb, len);
}
len = bytestream_get_le32(&header);
len = bytestream2_get_le32(&gb);

if (len < 16) {
av_log(avctx, AV_LOG_ERROR, "fmt chunk was too short\n");
return AVERROR_INVALIDDATA;
}

wave_format = bytestream_get_le16(&header);
wave_format = bytestream2_get_le16(&gb);

switch (wave_format) {
case WAVE_FORMAT_PCM:
@@ -236,11 +239,11 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
return AVERROR(ENOSYS);
}

header += 2; // skip channels (already got from shorten header)
avctx->sample_rate = bytestream_get_le32(&header);
header += 4; // skip bit rate (represents original uncompressed bit rate)
header += 2; // skip block align (not needed)
avctx->bits_per_coded_sample = bytestream_get_le16(&header);
bytestream2_skip(&gb, 2); // skip channels (already got from shorten header)
avctx->sample_rate = bytestream2_get_le32(&gb);
bytestream2_skip(&gb, 4); // skip bit rate (represents original uncompressed bit rate)
bytestream2_skip(&gb, 2); // skip block align (not needed)
avctx->bits_per_coded_sample = bytestream2_get_le16(&gb);

if (avctx->bits_per_coded_sample != 16) {
av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample\n");


Loading…
Cancel
Save