[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