Browse Source

avfilter: fix leaks on error in ff_filter_frame

tags/n2.2-rc1
Vittorio Giovara 12 years ago
parent
commit
abb5e37f64
1 changed files with 19 additions and 6 deletions
  1. +19
    -6
      libavfilter/avfilter.c

+ 19
- 6
libavfilter/avfilter.c View File

@@ -729,7 +729,8 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
{ {
int (*filter_frame)(AVFilterLink *, AVFrame *); int (*filter_frame)(AVFilterLink *, AVFrame *);
AVFilterPad *dst = link->dstpad; AVFilterPad *dst = link->dstpad;
AVFrame *out;
AVFrame *out = NULL;
int ret;


FF_DPRINTF_START(NULL, filter_frame); FF_DPRINTF_START(NULL, filter_frame);
ff_dlog_link(NULL, link, 1); ff_dlog_link(NULL, link, 1);
@@ -748,13 +749,18 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
case AVMEDIA_TYPE_AUDIO: case AVMEDIA_TYPE_AUDIO:
out = ff_get_audio_buffer(link, frame->nb_samples); out = ff_get_audio_buffer(link, frame->nb_samples);
break; break;
default: return AVERROR(EINVAL);
default:
ret = AVERROR(EINVAL);
goto fail;
} }
if (!out) { 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) { switch (link->type) {
case AVMEDIA_TYPE_VIDEO: 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), av_get_channel_layout_nb_channels(frame->channel_layout),
frame->format); frame->format);
break; break;
default: return AVERROR(EINVAL);
default:
ret = AVERROR(EINVAL);
goto fail;
} }


av_frame_free(&frame); av_frame_free(&frame);
@@ -775,6 +783,11 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
out = frame; out = frame;


return filter_frame(link, out); return filter_frame(link, out);

fail:
av_frame_free(&out);
av_frame_free(&frame);
return ret;
} }


const AVClass *avfilter_get_class(void) const AVClass *avfilter_get_class(void)


Loading…
Cancel
Save