avfilter/drawtext: make command processing error-resilient
Prevents crash or interruption in text rendering if new option string contains invalid values.
This commit is contained in:
@@ -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)
|
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")) {
|
if (!strcmp(cmd, "reinit")) {
|
||||||
int ret;
|
new = av_mallocz(sizeof(DrawTextContext));
|
||||||
uninit(ctx);
|
if (!new)
|
||||||
s->reinit = 1;
|
return AVERROR(ENOMEM);
|
||||||
if ((ret = av_set_options_string(ctx, arg, "=", ":")) < 0)
|
|
||||||
return ret;
|
|
||||||
if ((ret = init(ctx)) < 0)
|
|
||||||
return ret;
|
|
||||||
return config_input(ctx->inputs[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return AVERROR(ENOSYS);
|
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);
|
||||||
|
av_freep(old);
|
||||||
|
|
||||||
|
ctx->priv = new;
|
||||||
|
return config_input(ctx->inputs[0]);
|
||||||
|
} else
|
||||||
|
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,
|
static int func_pict_type(AVFilterContext *ctx, AVBPrint *bp,
|
||||||
|
Reference in New Issue
Block a user