From 4d8c0f1980673b3c3e11a79de925d5fb0b063cde Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Date: Fri, 14 Mar 2025 02:58:33 +0100 Subject: [PATCH 17/17] avcodec/qdm2: Use explicit overread checks instead of implicit ones If there were not enough data, checksum_size would be read as zero (due to the implicit checks of the bytestream2 API) and run into a "data block size invalid" error. Erroring out earlier via "not enough extradata" is better. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/qdm2.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/libavcodec/qdm2.c b/libavcodec/qdm2.c index ffb44015ec..b2136c6824 100644 --- a/libavcodec/qdm2.c +++ b/libavcodec/qdm2.c @@ -1661,20 +1661,20 @@ static av_cold int qdm2_decode_init(AVCodecContext *avctx) bytestream2_init(&gb, avctx->extradata, avctx->extradata_size); while (bytestream2_get_bytes_left(&gb) > 8) { - if (bytestream2_peek_be64(&gb) == (((uint64_t)MKBETAG('f','r','m','a') << 32) | + if (bytestream2_peek_be64u(&gb) == (((uint64_t)MKBETAG('f','r','m','a') << 32) | (uint64_t)MKBETAG('Q','D','M','2'))) break; - bytestream2_skip(&gb, 1); + bytestream2_skipu(&gb, 1); } - if (bytestream2_get_bytes_left(&gb) < 12) { + if (bytestream2_get_bytes_left(&gb) < 44) { av_log(avctx, AV_LOG_ERROR, "not enough extradata (%i)\n", bytestream2_get_bytes_left(&gb)); return AVERROR_INVALIDDATA; } - bytestream2_skip(&gb, 8); - size = bytestream2_get_be32(&gb); + bytestream2_skipu(&gb, 8); + size = bytestream2_get_be32u(&gb); if (size > bytestream2_get_bytes_left(&gb)) { av_log(avctx, AV_LOG_ERROR, "extradata size too small, %i < %i\n", @@ -1683,14 +1683,14 @@ static av_cold int qdm2_decode_init(AVCodecContext *avctx) } av_log(avctx, AV_LOG_DEBUG, "size: %d\n", size); - if (bytestream2_get_be32(&gb) != MKBETAG('Q','D','C','A')) { + if (bytestream2_get_be32u(&gb) != MKBETAG('Q','D','C','A')) { av_log(avctx, AV_LOG_ERROR, "invalid extradata, expecting QDCA\n"); return AVERROR_INVALIDDATA; } - bytestream2_skip(&gb, 4); + bytestream2_skipu(&gb, 4); - s->nb_channels = s->channels = bytestream2_get_be32(&gb); + s->nb_channels = s->channels = bytestream2_get_be32u(&gb); if (s->channels <= 0 || s->channels > MPA_MAX_CHANNELS) { av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n"); return AVERROR_INVALIDDATA; @@ -1698,11 +1698,11 @@ static av_cold int qdm2_decode_init(AVCodecContext *avctx) av_channel_layout_uninit(&avctx->ch_layout); av_channel_layout_default(&avctx->ch_layout, s->channels); - avctx->sample_rate = bytestream2_get_be32(&gb); - avctx->bit_rate = bytestream2_get_be32(&gb); - s->group_size = bytestream2_get_be32(&gb); - s->fft_size = bytestream2_get_be32(&gb); - s->checksum_size = bytestream2_get_be32(&gb); + avctx->sample_rate = bytestream2_get_be32u(&gb); + avctx->bit_rate = bytestream2_get_be32u(&gb); + s->group_size = bytestream2_get_be32u(&gb); + s->fft_size = bytestream2_get_be32u(&gb); + s->checksum_size = bytestream2_get_be32u(&gb); if (s->checksum_size >= 1U << 28 || s->checksum_size <= 1) { av_log(avctx, AV_LOG_ERROR, "data block size invalid (%u)\n", s->checksum_size); return AVERROR_INVALIDDATA; -- 2.45.2