diff options
author | Vittorio Giovara <vittorio.giovara@gmail.com> | 2013-12-18 11:45:01 +0100 |
---|---|---|
committer | Vittorio Giovara <vittorio.giovara@gmail.com> | 2014-01-09 23:13:05 +0100 |
commit | abb5e37f64c48bba8bd0fde2bada0f7544defa24 (patch) | |
tree | 2c27658b471023882a5d6c5e3e40078767c1d45f | |
parent | 5655732c77f2df9c1dfbddc30cd4844390a6921f (diff) | |
download | ffmpeg-abb5e37f64c48bba8bd0fde2bada0f7544defa24.tar.gz |
avfilter: fix leaks on error in ff_filter_frame
-rw-r--r-- | libavfilter/avfilter.c | 25 |
1 files changed, 19 insertions, 6 deletions
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) |