From c90b88090c260a0af018b6c1e955266e24ebf6f4 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sat, 24 Jun 2017 18:36:46 +0200 Subject: [PATCH] avfilter: do not leak AVFrame on failed buffer allocation Signed-off-by: Paul B Mahol --- libavfilter/af_aphaser.c | 4 +++- libavfilter/af_aresample.c | 4 +++- libavfilter/af_atempo.c | 4 +++- libavfilter/af_bs2b.c | 4 +++- libavfilter/af_pan.c | 4 +++- libavfilter/af_volume.c | 4 +++- libavfilter/vf_eq.c | 4 +++- libavfilter/vf_fftfilt.c | 4 +++- 8 files changed, 24 insertions(+), 8 deletions(-) diff --git a/libavfilter/af_aphaser.c b/libavfilter/af_aphaser.c index 780407e924..dcffc216dd 100644 --- a/libavfilter/af_aphaser.c +++ b/libavfilter/af_aphaser.c @@ -248,8 +248,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inbuf) outbuf = inbuf; } else { outbuf = ff_get_audio_buffer(inlink, inbuf->nb_samples); - if (!outbuf) + if (!outbuf) { + av_frame_free(&inbuf); return AVERROR(ENOMEM); + } av_frame_copy_props(outbuf, inbuf); } diff --git a/libavfilter/af_aresample.c b/libavfilter/af_aresample.c index 0216432470..ef10621c35 100644 --- a/libavfilter/af_aresample.c +++ b/libavfilter/af_aresample.c @@ -195,8 +195,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamplesref) outsamplesref = ff_get_audio_buffer(outlink, n_out); - if(!outsamplesref) + if(!outsamplesref) { + av_frame_free(&insamplesref); return AVERROR(ENOMEM); + } av_frame_copy_props(outsamplesref, insamplesref); outsamplesref->format = outlink->format; diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c index d90910598c..76410221d6 100644 --- a/libavfilter/af_atempo.c +++ b/libavfilter/af_atempo.c @@ -1090,8 +1090,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *src_buffer) while (src < src_end) { if (!atempo->dst_buffer) { atempo->dst_buffer = ff_get_audio_buffer(outlink, n_out); - if (!atempo->dst_buffer) + if (!atempo->dst_buffer) { + av_frame_free(&src_buffer); return AVERROR(ENOMEM); + } av_frame_copy_props(atempo->dst_buffer, src_buffer); atempo->dst = atempo->dst_buffer->data[0]; diff --git a/libavfilter/af_bs2b.c b/libavfilter/af_bs2b.c index 531a27bd73..b7cfd3815b 100644 --- a/libavfilter/af_bs2b.c +++ b/libavfilter/af_bs2b.c @@ -134,8 +134,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) out_frame = frame; } else { out_frame = ff_get_audio_buffer(inlink, frame->nb_samples); - if (!out_frame) + if (!out_frame) { + av_frame_free(&frame); return AVERROR(ENOMEM); + } av_frame_copy(out_frame, frame); ret = av_frame_copy_props(out_frame, frame); if (ret < 0) { diff --git a/libavfilter/af_pan.c b/libavfilter/af_pan.c index 63d7750f35..23b29419b6 100644 --- a/libavfilter/af_pan.c +++ b/libavfilter/af_pan.c @@ -383,8 +383,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) AVFrame *outsamples = ff_get_audio_buffer(outlink, n); PanContext *pan = inlink->dst->priv; - if (!outsamples) + if (!outsamples) { + av_frame_free(&insamples); return AVERROR(ENOMEM); + } swr_convert(pan->swr, outsamples->extended_data, n, (void *)insamples->extended_data, n); av_frame_copy_props(outsamples, insamples); diff --git a/libavfilter/af_volume.c b/libavfilter/af_volume.c index 9ed2dbace3..3d76f12f2c 100644 --- a/libavfilter/af_volume.c +++ b/libavfilter/af_volume.c @@ -411,8 +411,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf) out_buf = buf; } else { out_buf = ff_get_audio_buffer(inlink, nb_samples); - if (!out_buf) + if (!out_buf) { + av_frame_free(&buf); return AVERROR(ENOMEM); + } ret = av_frame_copy_props(out_buf, buf); if (ret < 0) { av_frame_free(&out_buf); diff --git a/libavfilter/vf_eq.c b/libavfilter/vf_eq.c index e8b4a46195..2c4c7e4d54 100644 --- a/libavfilter/vf_eq.c +++ b/libavfilter/vf_eq.c @@ -259,8 +259,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) int i; out = ff_get_video_buffer(outlink, inlink->w, inlink->h); - if (!out) + if (!out) { + av_frame_free(&in); return AVERROR(ENOMEM); + } av_frame_copy_props(out, in); desc = av_pix_fmt_desc_get(inlink->format); diff --git a/libavfilter/vf_fftfilt.c b/libavfilter/vf_fftfilt.c index c0c5eb400f..8a47ed5be4 100644 --- a/libavfilter/vf_fftfilt.c +++ b/libavfilter/vf_fftfilt.c @@ -255,8 +255,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) int i, j, plane; out = ff_get_video_buffer(outlink, inlink->w, inlink->h); - if (!out) + if (!out) { + av_frame_free(&in); return AVERROR(ENOMEM); + } av_frame_copy_props(out, in);