From 955aec3c7c7be39b659197e1ec379a09f2b7c41c Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 9 Oct 2015 15:16:46 +0200 Subject: mpegaudiodecheader: check the header in avpriv_mpegaudio_decode_header Almost all the places from which this function is called already check the header manually and in the two that don't (the mp3 muxer) the check should not cause any problems. --- libavcodec/mpegaudiodec_template.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'libavcodec/mpegaudiodec_template.c') diff --git a/libavcodec/mpegaudiodec_template.c b/libavcodec/mpegaudiodec_template.c index ba1f82b99f..184d67bf3b 100644 --- a/libavcodec/mpegaudiodec_template.c +++ b/libavcodec/mpegaudiodec_template.c @@ -1631,12 +1631,12 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *got_frame_ptr, return AVERROR_INVALIDDATA; header = AV_RB32(buf); - if (ff_mpa_check_header(header) < 0) { + + ret = avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header); + if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Header missing\n"); return AVERROR_INVALIDDATA; - } - - if (avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header) == 1) { + } else if (ret == 1) { /* free format: prepare to compute frame size */ s->frame_size = -1; return AVERROR_INVALIDDATA; @@ -1706,12 +1706,11 @@ static int decode_frame_adu(AVCodecContext *avctx, void *data, // Get header and restore sync word header = AV_RB32(buf) | 0xffe00000; - if (ff_mpa_check_header(header) < 0) { // Bad header, discard frame + ret = avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header); + if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Invalid frame header\n"); - return AVERROR_INVALIDDATA; + return ret; } - - avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header); /* update codec info */ avctx->sample_rate = s->sample_rate; avctx->channels = s->nb_channels; @@ -1903,11 +1902,10 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, } header = (AV_RB32(buf) & 0x000fffff) | s->syncword; // patch header - if (ff_mpa_check_header(header) < 0) // Bad header, discard block + ret = avpriv_mpegaudio_decode_header((MPADecodeHeader *)m, header); + if (ret < 0) // Bad header, discard block break; - avpriv_mpegaudio_decode_header((MPADecodeHeader *)m, header); - if (ch + m->nb_channels > avctx->channels || s->coff[fr] + m->nb_channels > avctx->channels) { av_log(avctx, AV_LOG_ERROR, "frame channel count exceeds codec " -- cgit v1.2.3