[SCM] libav/experimental: Fix some potential segfaults.

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:14:24 UTC 2013


The following commit has been merged in the experimental branch:
commit 7d0e1392a72a0fe9e6856dbf219f6362b0f53459
Author: Vitor Sessak <vitor1001 at gmail.com>
Date:   Fri Feb 15 21:36:57 2008 +0000

    Fix some potential segfaults.
    
    Commited in SoC by Bobby Bingham on 2007-07-30 15:53:33
    
    Originally committed as revision 11992 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index d65e639..62e8d7a 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -64,7 +64,10 @@ AVFilterPicRef *avfilter_default_get_video_buffer(AVFilterLink *link, int perms)
 
 void avfilter_default_start_frame(AVFilterLink *link, AVFilterPicRef *picref)
 {
-    AVFilterLink *out = link->dst->outputs[0];
+    AVFilterLink *out = NULL;
+
+    if(link->dst->output_count)
+        out = link->dst->outputs[0];
 
     link->cur_pic = picref;
 
@@ -77,7 +80,10 @@ void avfilter_default_start_frame(AVFilterLink *link, AVFilterPicRef *picref)
 
 void avfilter_default_end_frame(AVFilterLink *link)
 {
-    AVFilterLink *out = link->dst->outputs[0];
+    AVFilterLink *out = NULL;
+
+    if(link->dst->output_count)
+        out = link->dst->outputs[0];
 
     avfilter_unref_pic(link->cur_pic);
     link->cur_pic = NULL;
@@ -110,8 +116,15 @@ void avfilter_unref_pic(AVFilterPicRef *ref)
  * the implementation of one input one output video filters */
 static int default_config_output_link(AVFilterLink *link)
 {
+    if(link->src->input_count && link->src->inputs[0]) {
     link->w = link->src->inputs[0]->w;
     link->h = link->src->inputs[0]->h;
+    } else {
+        /* XXX: any non-simple filter which would cause this branch to be taken
+         * really should implement its own config_props() for this link. */
+        link->w =
+        link->h = 0;
+    }
 
     return 0;
 }
@@ -121,7 +134,12 @@ static int default_config_output_link(AVFilterLink *link)
  * the implementation of one input one output video filters */
 static int *default_query_output_formats(AVFilterLink *link)
 {
+    if(link->src->input_count && link->src->inputs[0])
     return avfilter_make_format_list(1, link->src->inputs[0]->format);
+    else
+        /* XXX: any non-simple filter which would cause this branch to be taken
+         * really should implement its own query_formats() for this link */
+        return avfilter_make_format_list(0);
 }
 
 int avfilter_link(AVFilterContext *src, unsigned srcpad,
@@ -130,7 +148,8 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
     AVFilterLink *link;
     int *fmts[2], i, j;
 
-    if(src->outputs[srcpad] || dst->inputs[dstpad])
+    if(src->output_count <= srcpad || dst->input_count <= dstpad ||
+       src->outputs[srcpad]        || dst->inputs[dstpad])
         return -1;
 
     src->outputs[srcpad] =
@@ -227,6 +246,9 @@ void avfilter_end_frame(AVFilterLink *link)
 
 void avfilter_draw_slice(AVFilterLink *link, uint8_t *data[4], int y, int h)
 {
+    if(!link->dst->filter->inputs[link->dstpad].draw_slice)
+        return;
+
     link->dst->filter->inputs[link->dstpad].draw_slice(link, data, y, h);
 }
 
@@ -296,10 +318,13 @@ AVFilterContext *avfilter_create(AVFilter *filter, char *inst_name)
     ret->av_class->item_name = filter_name;
     ret->filter   = filter;
     ret->name     = inst_name ? av_strdup(inst_name) : NULL;
-    ret->inputs   = av_mallocz(sizeof(AVFilterLink*) * pad_count(filter->inputs));
-    ret->outputs  = av_mallocz(sizeof(AVFilterLink*) * pad_count(filter->outputs));
     ret->priv     = av_mallocz(filter->priv_size);
 
+    ret->input_count  = pad_count(filter->inputs);
+    ret->inputs       = av_mallocz(sizeof(AVFilterLink*) * ret->input_count);
+    ret->output_count = pad_count(filter->outputs);
+    ret->outputs      = av_mallocz(sizeof(AVFilterLink*) * ret->output_count);
+
     return ret;
 }
 

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list