[FFmpeg-cvslog] avfilter/drawtext: make command processing error-resilient

Gyan Doshi git at videolan.org
Mon May 13 08:05:34 EEST 2019


ffmpeg | branch: master | Gyan Doshi <ffmpeg at gyani.pro> | Fri May 10 19:31:33 2019 +0530| [87db1ca632bfbb66329c5729301d88ca30bed9b3] | committer: Gyan Doshi

avfilter/drawtext: make command processing error-resilient

Prevents crash or interruption in text rendering
if new option string contains invalid values.

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

 libavfilter/vf_drawtext.c | 47 ++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 38 insertions(+), 9 deletions(-)

diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
index cca2cbcb88..b166574d71 100644
--- a/libavfilter/vf_drawtext.c
+++ b/libavfilter/vf_drawtext.c
@@ -862,20 +862,49 @@ static int config_input(AVFilterLink *inlink)
 
 static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
 {
-    DrawTextContext *s = ctx->priv;
+    DrawTextContext *old = ctx->priv;
+    DrawTextContext *new = NULL;
+    int ret;
 
     if (!strcmp(cmd, "reinit")) {
-        int ret;
+        new = av_mallocz(sizeof(DrawTextContext));
+        if (!new)
+            return AVERROR(ENOMEM);
+
+        new->class = &drawtext_class;
+        ret = av_opt_copy(new, old);
+        if (ret < 0)
+            goto fail;
+
+        ctx->priv = new;
+        ret = av_set_options_string(ctx, arg, "=", ":");
+        if (ret < 0) {
+            ctx->priv = old;
+            goto fail;
+        }
+
+        ret = init(ctx);
+        if (ret < 0) {
+            uninit(ctx);
+            ctx->priv = old;
+            goto fail;
+        }
+
+        new->reinit = 1;
+
+        ctx->priv = old;
         uninit(ctx);
-        s->reinit = 1;
-        if ((ret = av_set_options_string(ctx, arg, "=", ":")) < 0)
-            return ret;
-        if ((ret = init(ctx)) < 0)
-            return ret;
+        av_freep(old);
+
+        ctx->priv = new;
         return config_input(ctx->inputs[0]);
-    }
+    } else
+        return AVERROR(ENOSYS);
 
-    return AVERROR(ENOSYS);
+fail:
+    av_log(ctx, AV_LOG_ERROR, "Failed to process command. Continuing with existing parameters.\n");
+    av_freep(new);
+    return ret;
 }
 
 static int func_pict_type(AVFilterContext *ctx, AVBPrint *bp,



More information about the ffmpeg-cvslog mailing list