From abb5e37f64c48bba8bd0fde2bada0f7544defa24 Mon Sep 17 00:00:00 2001 From: Vittorio Giovara Date: Wed, 18 Dec 2013 11:45:01 +0100 Subject: avfilter: fix leaks on error in ff_filter_frame --- libavfilter/avfilter.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'libavfilter/avfilter.c') diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index b18c0cb31e..f02358f9fc 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -729,7 +729,8 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) { int (*filter_frame)(AVFilterLink *, AVFrame *); AVFilterPad *dst = link->dstpad; - AVFrame *out; + AVFrame *out = NULL; + int ret; FF_DPRINTF_START(NULL, filter_frame); ff_dlog_link(NULL, link, 1); @@ -748,13 +749,18 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) case AVMEDIA_TYPE_AUDIO: out = ff_get_audio_buffer(link, frame->nb_samples); break; - default: return AVERROR(EINVAL); + default: + ret = AVERROR(EINVAL); + goto fail; } if (!out) { - av_frame_free(&frame); - return AVERROR(ENOMEM); + ret = AVERROR(ENOMEM); + goto fail; } - av_frame_copy_props(out, frame); + + ret = av_frame_copy_props(out, frame); + if (ret < 0) + goto fail; switch (link->type) { case AVMEDIA_TYPE_VIDEO: @@ -767,7 +773,9 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) av_get_channel_layout_nb_channels(frame->channel_layout), frame->format); break; - default: return AVERROR(EINVAL); + default: + ret = AVERROR(EINVAL); + goto fail; } av_frame_free(&frame); @@ -775,6 +783,11 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) out = frame; return filter_frame(link, out); + +fail: + av_frame_free(&out); + av_frame_free(&frame); + return ret; } const AVClass *avfilter_get_class(void) -- cgit v1.2.3