diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-09-12 15:30:44 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-09-12 15:31:59 +0400 |
commit | a44d35d90ffa0cfc3eb8a8a8fc6c20ffec4e90fe (patch) | |
tree | 2650f965bb85fc7e5955e40b250a8570b51057ea | |
parent | af539319af3a2c173e275fb927c7069e6b167114 (diff) | |
parent | 49568851bf1700e3d9ea9cda29208d0df3c2c38b (diff) |
Merge commit '49568851bf1700e3d9ea9cda29208d0df3c2c38b'
* commit '49568851bf1700e3d9ea9cda29208d0df3c2c38b':
shorten: Use a checked bytestream reader for the wave header
Conflicts:
libavcodec/shorten.c
See: 5e9a56a0350c518cd4b38845aff49d41a9c952ae
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/shorten.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/libavcodec/shorten.c b/libavcodec/shorten.c index 3bba10c398..93959dc348 100644 --- a/libavcodec/shorten.c +++ b/libavcodec/shorten.c @@ -209,34 +209,36 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header, { int len, bps; short wave_format; - const uint8_t *end= header + header_size; + 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); - if (len<0 || end - header - 8 < len) + while (bytestream2_get_le32(&gb) != MKTAG('f', 'm', 't', ' ')) { + len = bytestream2_get_le32(&gb); + if (len<0 || bytestream2_get_bytes_left(&gb) - 8 < len) return AVERROR_INVALIDDATA; - header += len; + 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: @@ -246,11 +248,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) - bps = 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) + bps = bytestream2_get_le16(&gb); avctx->bits_per_coded_sample = bps; if (bps != 16 && bps != 8) { |