[FFmpeg-cvslog] lavfi: check all avfilter_ref_buffer() calls for errors.

Anton Khirnov git at videolan.org
Sun Jul 22 23:56:50 CEST 2012


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sun Jul 15 11:16:53 2012 +0200| [1dc42050185d63c1de5d16146fbaee92640af187] | committer: Anton Khirnov

lavfi: check all avfilter_ref_buffer() calls for errors.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1dc42050185d63c1de5d16146fbaee92640af187
---

 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;



More information about the ffmpeg-cvslog mailing list