[FFmpeg-devel] [PATCH] avcodec/aacenc: Check all coefficients for finiteness
Claudio Freire
klaussfreire at gmail.com
Wed Jan 20 19:32:13 CET 2016
On Wed, Jan 20, 2016 at 11:05 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
> From: Michael Niedermayer <michael at niedermayer.cc>
>
> This is needed as near infinite values on the input side result in only some
> output to be non finite.
> Also it may still be insufficient if subsequent computations overflow
>
> Fixes null pointer dereference
> Fixes: ae66c0f6c12ac1cd5c2c237031240f57/signal_sigsegv_2618c99_9516_6007026f2185a26d7afea895fbed6e38.ogg
>
> Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> ---
> libavcodec/aacenc.c | 17 ++++++-----------
> 1 file changed, 6 insertions(+), 11 deletions(-)
>
> diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
> index 688b131..0dcf404 100644
> --- a/libavcodec/aacenc.c
> +++ b/libavcodec/aacenc.c
> @@ -544,6 +544,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
> chans = tag == TYPE_CPE ? 2 : 1;
> cpe = &s->cpe[i];
> for (ch = 0; ch < chans; ch++) {
> + int k;
> float clip_avoidance_factor;
> sce = &cpe->ch[ch];
> ics = &sce->ics;
> @@ -607,17 +608,11 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
> s->mdct1024.mdct_calc(&s->mdct1024, sce->lcoeffs, sce->ret_buf);
> }
>
> - if (!(isfinite(cpe->ch[ch].coeffs[ 0]) &&
> - isfinite(cpe->ch[ch].coeffs[ 128]) &&
> - isfinite(cpe->ch[ch].coeffs[2*128]) &&
> - isfinite(cpe->ch[ch].coeffs[3*128]) &&
> - isfinite(cpe->ch[ch].coeffs[4*128]) &&
> - isfinite(cpe->ch[ch].coeffs[5*128]) &&
> - isfinite(cpe->ch[ch].coeffs[6*128]) &&
> - isfinite(cpe->ch[ch].coeffs[7*128]))
> - ) {
> - av_log(avctx, AV_LOG_ERROR, "Input contains NaN/+-Inf\n");
> - return AVERROR(EINVAL);
> + for (k = 0; k < 1024; k++) {
> + if (!isfinite(cpe->ch[ch].coeffs[k])) {
> + av_log(avctx, AV_LOG_ERROR, "Input contains NaN/+-Inf\n");
> + return AVERROR(EINVAL);
> + }
> }
> avoid_clipping(s, sce);
> }
LGTM.
I was actually wondering whether it would be needed to do exactly this.
More information about the ffmpeg-devel
mailing list