[FFmpeg-cvslog] avconv: make sure the filtergraph is freed on init failure

Anton Khirnov git at videolan.org
Wed Mar 22 16:54:12 EET 2017


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sat Oct  1 17:06:25 2016 +0200| [f6772e9bf8251d3943f52f6f34d97d2ce6c4b8af] | committer: Anton Khirnov

avconv: make sure the filtergraph is freed on init failure

The filtergraph's existence is used in several places to mean that the
filtergraph is fully configured. This causes problems if it's allocated,
but the initialization fails (e.g. if a non-existent filter is
specified).

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

 avconv_filter.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/avconv_filter.c b/avconv_filter.c
index 4330802..e53dcd2 100644
--- a/avconv_filter.c
+++ b/avconv_filter.c
@@ -709,7 +709,7 @@ int configure_filtergraph(FilterGraph *fg)
     }
 
     if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
-        return ret;
+        goto fail;
 
     if (hw_device_ctx) {
         for (i = 0; i < fg->graph->nb_filters; i++) {
@@ -720,12 +720,13 @@ int configure_filtergraph(FilterGraph *fg)
     if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
         av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' does not have "
                "exactly one input and output.\n", graph_desc);
-        return AVERROR(EINVAL);
+        ret = AVERROR(EINVAL);
+        goto fail;
     }
 
     for (cur = inputs, i = 0; cur; cur = cur->next, i++)
         if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0)
-            return ret;
+            goto fail;
     avfilter_inout_free(&inputs);
 
     for (cur = outputs, i = 0; cur; cur = cur->next, i++) {
@@ -737,7 +738,7 @@ int configure_filtergraph(FilterGraph *fg)
     avfilter_inout_free(&outputs);
 
     if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
-        return ret;
+        goto fail;
 
     /* limit the lists of allowed formats to the ones selected, to
      * make sure they stay the same if the filtergraph is reconfigured later */
@@ -761,7 +762,7 @@ int configure_filtergraph(FilterGraph *fg)
             ret = av_buffersrc_add_frame(fg->inputs[i]->filter, tmp);
             av_frame_free(&tmp);
             if (ret < 0)
-                return ret;
+                goto fail;
         }
     }
 
@@ -770,11 +771,14 @@ int configure_filtergraph(FilterGraph *fg)
         if (fg->inputs[i]->eof) {
             ret = av_buffersrc_add_frame(fg->inputs[i]->filter, NULL);
             if (ret < 0)
-                return ret;
+                goto fail;
         }
     }
 
     return 0;
+fail:
+    avfilter_graph_free(&fg->graph);
+    return ret;
 }
 
 int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame)



More information about the ffmpeg-cvslog mailing list