summaryrefslogtreecommitdiff
path: root/libavfilter/avfilter.c
diff options
context:
space:
mode:
authorVittorio Giovara <vittorio.giovara@gmail.com>2013-12-18 11:45:01 +0100
committerVittorio Giovara <vittorio.giovara@gmail.com>2014-01-09 23:13:05 +0100
commitabb5e37f64c48bba8bd0fde2bada0f7544defa24 (patch)
tree2c27658b471023882a5d6c5e3e40078767c1d45f /libavfilter/avfilter.c
parent5655732c77f2df9c1dfbddc30cd4844390a6921f (diff)
avfilter: fix leaks on error in ff_filter_frame
Diffstat (limited to 'libavfilter/avfilter.c')
-rw-r--r--libavfilter/avfilter.c25
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)