From 1dc42050185d63c1de5d16146fbaee92640af187 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 15 Jul 2012 11:16:53 +0200 Subject: [PATCH] lavfi: check all avfilter_ref_buffer() calls for errors. --- libavfilter/fifo.c | 3 +++ libavfilter/split.c | 17 +++++++++++++---- libavfilter/vf_delogo.c | 9 +++++++-- libavfilter/vf_frei0r.c | 9 ++++++++- libavfilter/vf_gradfun.c | 9 +++++++-- libavfilter/vf_overlay.c | 3 +++ libavfilter/vf_pixdesctest.c | 9 +++++++-- libavfilter/vf_scale.c | 14 +++++++++++--- libavfilter/vf_select.c | 6 +++++- libavfilter/vf_transpose.c | 6 +++++- libavfilter/vf_vflip.c | 3 +++ libavfilter/vf_yadif.c | 11 +++++++++-- libavfilter/video.c | 7 ++++++- libavfilter/vsrc_color.c | 9 ++++++++- libavfilter/vsrc_movie.c | 5 +++++ 15 files changed, 100 insertions(+), 20 deletions(-) diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c index 8264d53..3226a0d 100644 --- a/libavfilter/fifo.c +++ b/libavfilter/fifo.c @@ -169,6 +169,9 @@ static int return_audio_frame(AVFilterContext *ctx) queue_pop(s); } else { buf_out = avfilter_ref_buffer(head, AV_PERM_READ); + if (!buf_out) + return AVERROR(ENOMEM); + buf_out->audio->nb_samples = link->request_samples; buffer_offset(link, head, link->request_samples); } diff --git a/libavfilter/split.c b/libavfilter/split.c index 469f69d..084d555 100644 --- a/libavfilter/split.c +++ b/libavfilter/split.c @@ -69,8 +69,11 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) int i, ret = 0; for (i = 0; i < ctx->nb_outputs; i++) { - ret = ff_start_frame(ctx->outputs[i], - avfilter_ref_buffer(picref, ~AV_PERM_WRITE)); + AVFilterBufferRef *buf_out = avfilter_ref_buffer(picref, ~AV_PERM_WRITE); + if (!buf_out) + return AVERROR(ENOMEM); + + ret = ff_start_frame(ctx->outputs[i], buf_out); if (ret < 0) break; } @@ -126,8 +129,14 @@ static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *samplesref) int i, ret = 0; for (i = 0; i < ctx->nb_outputs; i++) { - ret = ff_filter_samples(inlink->dst->outputs[i], - avfilter_ref_buffer(samplesref, ~AV_PERM_WRITE)); + AVFilterBufferRef *buf_out = avfilter_ref_buffer(samplesref, + ~AV_PERM_WRITE); + if (!buf_out) { + ret = AVERROR(ENOMEM); + break; + } + + ret = ff_filter_samples(inlink->dst->outputs[i], buf_out); if (ret < 0) break; } diff --git a/libavfilter/vf_delogo.c b/libavfilter/vf_delogo.c index 81f33b7..343585f 100644 --- a/libavfilter/vf_delogo.c +++ b/libavfilter/vf_delogo.c @@ -217,7 +217,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) { AVFilterLink *outlink = inlink->dst->outputs[0]; - AVFilterBufferRef *outpicref = NULL; + AVFilterBufferRef *outpicref = NULL, *for_next_filter; int ret = 0; if (inpicref->perms & AV_PERM_PRESERVE) { @@ -235,7 +235,12 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) return AVERROR(ENOMEM); } - ret = ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0)); + for_next_filter = avfilter_ref_buffer(outpicref, ~0); + if (for_next_filter) + ret = ff_start_frame(outlink, for_next_filter); + else + ret = AVERROR(ENOMEM); + if (ret < 0) { avfilter_unref_bufferp(&outpicref); return ret; diff --git a/libavfilter/vf_frei0r.c b/libavfilter/vf_frei0r.c index f5e9128..152795f 100644 --- a/libavfilter/vf_frei0r.c +++ b/libavfilter/vf_frei0r.c @@ -438,13 +438,20 @@ static int source_request_frame(AVFilterLink *outlink) { Frei0rContext *frei0r = outlink->src->priv; AVFilterBufferRef *picref = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h); + AVFilterBufferRef *buf_out; int ret; picref->video->pixel_aspect = (AVRational) {1, 1}; picref->pts = frei0r->pts++; picref->pos = -1; - ret = ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0)); + buf_out = avfilter_ref_buffer(picref, ~0); + if (!buf_out) { + ret = AVERROR(ENOMEM); + goto fail; + } + + ret = ff_start_frame(outlink, buf_out); if (ret < 0) goto fail; diff --git a/libavfilter/vf_gradfun.c b/libavfilter/vf_gradfun.c index d73e833..52dcb70 100644 --- a/libavfilter/vf_gradfun.c +++ b/libavfilter/vf_gradfun.c @@ -183,7 +183,7 @@ static int config_input(AVFilterLink *inlink) static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) { AVFilterLink *outlink = inlink->dst->outputs[0]; - AVFilterBufferRef *outpicref = NULL; + AVFilterBufferRef *outpicref = NULL, *for_next_filter; int ret = 0; if (inpicref->perms & AV_PERM_PRESERVE) { @@ -200,7 +200,12 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) return AVERROR(ENOMEM); } - ret = ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0)); + for_next_filter = avfilter_ref_buffer(outpicref, ~0); + if (for_next_filter) + ret = ff_start_frame(outlink, for_next_filter); + else + ret = AVERROR(ENOMEM); + if (ret < 0) { avfilter_unref_bufferp(&outpicref); return ret; diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c index 951ea7a..14304c1 100644 --- a/libavfilter/vf_overlay.c +++ b/libavfilter/vf_overlay.c @@ -213,6 +213,9 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) AVFilterContext *ctx = inlink->dst; OverlayContext *over = ctx->priv; + if (!outpicref) + return AVERROR(ENOMEM); + outpicref->pts = av_rescale_q(outpicref->pts, ctx->inputs[MAIN]->time_base, ctx->outputs[0]->time_base); diff --git a/libavfilter/vf_pixdesctest.c b/libavfilter/vf_pixdesctest.c index caf0852..11905e6 100644 --- a/libavfilter/vf_pixdesctest.c +++ b/libavfilter/vf_pixdesctest.c @@ -55,7 +55,7 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) { PixdescTestContext *priv = inlink->dst->priv; AVFilterLink *outlink = inlink->dst->outputs[0]; - AVFilterBufferRef *outpicref; + AVFilterBufferRef *outpicref, *for_next_filter; int i, ret = 0; outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE, @@ -80,7 +80,12 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) priv->pix_desc->flags & PIX_FMT_PSEUDOPAL) memcpy(outpicref->data[1], outpicref->data[1], 256*4); - ret = ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0)); + for_next_filter = avfilter_ref_buffer(outpicref, ~0); + if (for_next_filter) + ret = ff_start_frame(outlink, for_next_filter); + else + ret = AVERROR(ENOMEM); + if (ret < 0) { avfilter_unref_bufferp(&outpicref); return ret; diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 73f31a6..6600530 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -256,11 +256,14 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref) { ScaleContext *scale = link->dst->priv; AVFilterLink *outlink = link->dst->outputs[0]; - AVFilterBufferRef *outpicref; + AVFilterBufferRef *outpicref, *for_next_filter; int ret = 0; if (!scale->sws) { - return ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0)); + outpicref = avfilter_ref_buffer(picref, ~0); + if (!outpicref) + return AVERROR(ENOMEM); + return ff_start_frame(outlink, outpicref); } scale->hsub = av_pix_fmt_descriptors[link->format].log2_chroma_w; @@ -281,7 +284,12 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref) INT_MAX); scale->slice_y = 0; - ret = ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0)); + for_next_filter = avfilter_ref_buffer(outpicref, ~0); + if (for_next_filter) + ret = ff_start_frame(outlink, for_next_filter); + else + ret = AVERROR(ENOMEM); + if (ret < 0) { avfilter_unref_bufferp(&outpicref); return ret; diff --git a/libavfilter/vf_select.c b/libavfilter/vf_select.c index b4a424e..59030eb 100644 --- a/libavfilter/vf_select.c +++ b/libavfilter/vf_select.c @@ -233,6 +233,7 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) select->select = select_frame(inlink->dst, picref); if (select->select) { + AVFilterBufferRef *buf_out; /* frame was requested through poll_frame */ if (select->cache_frames) { if (!av_fifo_space(select->pending_frames)) @@ -243,7 +244,10 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) sizeof(picref), NULL); return 0; } - return ff_start_frame(inlink->dst->outputs[0], avfilter_ref_buffer(picref, ~0)); + buf_out = avfilter_ref_buffer(picref, ~0); + if (!buf_out) + return AVERROR(ENOMEM); + return ff_start_frame(inlink->dst->outputs[0], buf_out); } return 0; diff --git a/libavfilter/vf_transpose.c b/libavfilter/vf_transpose.c index 49b54d7..90f08e4 100644 --- a/libavfilter/vf_transpose.c +++ b/libavfilter/vf_transpose.c @@ -120,6 +120,7 @@ static int config_props_output(AVFilterLink *outlink) static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) { AVFilterLink *outlink = inlink->dst->outputs[0]; + AVFilterBufferRef *buf_out; outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h); @@ -135,7 +136,10 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) outlink->out_buf->video->pixel_aspect.den = picref->video->pixel_aspect.num; } - return ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0)); + buf_out = avfilter_ref_buffer(outlink->out_buf, ~0); + if (!buf_out) + return AVERROR(ENOMEM); + return ff_start_frame(outlink, buf_out); } static int end_frame(AVFilterLink *inlink) diff --git a/libavfilter/vf_vflip.c b/libavfilter/vf_vflip.c index dc7604c..b314322 100644 --- a/libavfilter/vf_vflip.c +++ b/libavfilter/vf_vflip.c @@ -70,6 +70,9 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref) AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0); int i; + if (!outpicref) + return AVERROR(ENOMEM); + for (i = 0; i < 4; i ++) { int vsub = i == 1 || i == 2 ? flip->vsub : 0; diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c index 1025ba1..db4956c 100644 --- a/libavfilter/vf_yadif.c +++ b/libavfilter/vf_yadif.c @@ -224,14 +224,18 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref) if (yadif->auto_enable && !yadif->cur->video->interlaced) { yadif->out = avfilter_ref_buffer(yadif->cur, AV_PERM_READ); + if (!yadif->out) + return AVERROR(ENOMEM); + avfilter_unref_bufferp(&yadif->prev); if (yadif->out->pts != AV_NOPTS_VALUE) yadif->out->pts *= 2; return ff_start_frame(ctx->outputs[0], yadif->out); } - if (!yadif->prev) - yadif->prev = avfilter_ref_buffer(yadif->cur, AV_PERM_READ); + if (!yadif->prev && + !(yadif->prev = avfilter_ref_buffer(yadif->cur, AV_PERM_READ))) + return AVERROR(ENOMEM); yadif->out = ff_get_video_buffer(ctx->outputs[0], AV_PERM_WRITE | AV_PERM_PRESERVE | AV_PERM_REUSE, link->w, link->h); @@ -282,6 +286,9 @@ static int request_frame(AVFilterLink *link) if (ret == AVERROR_EOF && yadif->next) { AVFilterBufferRef *next = avfilter_ref_buffer(yadif->next, AV_PERM_READ); + if (!next) + return AVERROR(ENOMEM); + next->pts = yadif->next->pts * 2 - yadif->cur->pts; start_frame(link->src->inputs[0], next); diff --git a/libavfilter/video.c b/libavfilter/video.c index 8dd5bf4..6e50637 100644 --- a/libavfilter/video.c +++ b/libavfilter/video.c @@ -176,12 +176,17 @@ static int default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) outlink = inlink->dst->outputs[0]; if (outlink) { + AVFilterBufferRef *buf_out; outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h); if (!outlink->out_buf) return AVERROR(ENOMEM); avfilter_copy_buffer_ref_props(outlink->out_buf, picref); - return ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0)); + buf_out = avfilter_ref_buffer(outlink->out_buf, ~0); + if (!buf_out) + return AVERROR(ENOMEM); + + return ff_start_frame(outlink, buf_out); } return 0; } diff --git a/libavfilter/vsrc_color.c b/libavfilter/vsrc_color.c index c17f54f..0fa6853 100644 --- a/libavfilter/vsrc_color.c +++ b/libavfilter/vsrc_color.c @@ -142,13 +142,20 @@ static int color_request_frame(AVFilterLink *link) { ColorContext *color = link->src->priv; AVFilterBufferRef *picref = ff_get_video_buffer(link, AV_PERM_WRITE, color->w, color->h); + AVFilterBufferRef *buf_out; int ret; picref->video->pixel_aspect = (AVRational) {1, 1}; picref->pts = color->pts++; picref->pos = -1; - ret = ff_start_frame(link, avfilter_ref_buffer(picref, ~0)); + buf_out = avfilter_ref_buffer(picref, ~0); + if (!buf_out) { + ret = AVERROR(ENOMEM); + goto fail; + } + + ret = ff_start_frame(link, buf_out); if (ret < 0) goto fail; diff --git a/libavfilter/vsrc_movie.c b/libavfilter/vsrc_movie.c index b0f191f..926d57d 100644 --- a/libavfilter/vsrc_movie.c +++ b/libavfilter/vsrc_movie.c @@ -289,6 +289,11 @@ static int request_frame(AVFilterLink *outlink) return ret; outpicref = avfilter_ref_buffer(movie->picref, ~0); + if (!outpicref) { + ret = AVERROR(ENOMEM); + goto fail; + } + ret = ff_start_frame(outlink, outpicref); if (ret < 0) goto fail; -- 2.7.4