From 033b49e02d57ffa29e208f153102ae2c0abae912 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 17 Jan 2016 18:01:33 +0100 Subject: [PATCH] avcodec/libaacplus: Cleanup in case of init failure Fixes: memleak Fixes: 6b343214a0c12d94c1ea0ae9c3102dba/signal_sigsegv_262857d_8792_71ba605ad9ca9068b8218a6ce3628c25.mov Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind Signed-off-by: Michael Niedermayer --- libavcodec/libaacplus.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libavcodec/libaacplus.c b/libavcodec/libaacplus.c index fe380871b1..5d27e71804 100644 --- a/libavcodec/libaacplus.c +++ b/libavcodec/libaacplus.c @@ -35,6 +35,8 @@ typedef struct aacPlusAudioContext { unsigned long samples_input; } aacPlusAudioContext; +static int aacPlus_encode_close(AVCodecContext *avctx); + static av_cold int aacPlus_encode_init(AVCodecContext *avctx) { aacPlusAudioContext *s = avctx->priv_data; @@ -67,6 +69,7 @@ static av_cold int aacPlus_encode_init(AVCodecContext *avctx) aacplus_cfg->inputFormat = avctx->sample_fmt == AV_SAMPLE_FMT_FLT ? AACPLUS_INPUT_FLOAT : AACPLUS_INPUT_16BIT; if (!aacplusEncSetConfiguration(s->aacplus_handle, aacplus_cfg)) { av_log(avctx, AV_LOG_ERROR, "libaacplus doesn't support this output format!\n"); + aacPlus_encode_close(avctx); return AVERROR(EINVAL); } @@ -84,6 +87,7 @@ static av_cold int aacPlus_encode_init(AVCodecContext *avctx) avctx->extradata = av_malloc(decoder_specific_info_size + AV_INPUT_BUFFER_PADDING_SIZE); if (!avctx->extradata) { free(buffer); + aacPlus_encode_close(avctx); return AVERROR(ENOMEM); } avctx->extradata_size = decoder_specific_info_size; @@ -117,6 +121,7 @@ static av_cold int aacPlus_encode_close(AVCodecContext *avctx) av_freep(&avctx->extradata); aacplusEncClose(s->aacplus_handle); + s->aacplus_handle = NULL; return 0; }