diff options
author | Janne Grunau <janne-libav@jannau.net> | 2012-10-09 21:28:32 +0200 |
---|---|---|
committer | Janne Grunau <janne-libav@jannau.net> | 2012-10-25 15:00:15 +0200 |
commit | 285b706b551b94e18f875ed01163926c8b98e68b (patch) | |
tree | 0e8bdf66ac353be08d3b86cd5df60c8fc193431c /libavfilter/graphparser.c | |
parent | 587874ef1c94a9b863d2f2db0e5d341e086ee232 (diff) | |
download | ffmpeg-285b706b551b94e18f875ed01163926c8b98e68b.tar.gz |
avfilter: fix graphparser memleaks on error paths
Fixes CID700635, CID700636 and CID732274.
Diffstat (limited to 'libavfilter/graphparser.c')
-rw-r--r-- | libavfilter/graphparser.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/libavfilter/graphparser.c b/libavfilter/graphparser.c index 3921189aa9..04339c8138 100644 --- a/libavfilter/graphparser.c +++ b/libavfilter/graphparser.c @@ -238,10 +238,11 @@ static int link_filter_inouts(AVFilterContext *filt_ctx, return AVERROR(ENOMEM); if (p->filter_ctx) { - if ((ret = link_filter(p->filter_ctx, p->pad_idx, filt_ctx, pad, log_ctx)) < 0) - return ret; + ret = link_filter(p->filter_ctx, p->pad_idx, filt_ctx, pad, log_ctx); av_free(p->name); av_free(p); + if (ret < 0) + return ret; } else { p->filter_ctx = filt_ctx; p->pad_idx = pad; @@ -289,8 +290,10 @@ static int parse_inputs(const char **buf, AVFilterInOut **curr_inputs, av_free(name); } else { /* Not in the list, so add it as an input */ - if (!(match = av_mallocz(sizeof(AVFilterInOut)))) + if (!(match = av_mallocz(sizeof(AVFilterInOut)))) { + av_free(name); return AVERROR(ENOMEM); + } match->name = name; match->pad_idx = pad; } @@ -318,24 +321,27 @@ static int parse_outputs(const char **buf, AVFilterInOut **curr_inputs, AVFilterInOut *match; AVFilterInOut *input = *curr_inputs; + + if (!name) + return AVERROR(EINVAL); + if (!input) { av_log(log_ctx, AV_LOG_ERROR, - "No output pad can be associated to link label '%s'.\n", - name); + "No output pad can be associated to link label '%s'.\n", name); + av_free(name); return AVERROR(EINVAL); } *curr_inputs = (*curr_inputs)->next; - if (!name) - return AVERROR(EINVAL); - /* First check if the label is not in the open_inputs list */ match = extract_inout(name, open_inputs); if (match) { if ((ret = link_filter(input->filter_ctx, input->pad_idx, - match->filter_ctx, match->pad_idx, log_ctx)) < 0) + match->filter_ctx, match->pad_idx, log_ctx)) < 0) { + av_free(name); return ret; + } av_free(match->name); av_free(name); av_free(match); |