From: Matthew Fernandez Date: Sat, 24 Jul 2021 02:13:45 +0000 (-0700) Subject: eval: avoid sfprintf in float-to-string dynamic X-Git-Tag: 2.49.0~31^2~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=676acbab0dd00b3d5b6c4d683bdaaa1bac5d4beb;p=graphviz eval: avoid sfprintf in float-to-string dynamic Instead of constructing a string in the `tmp` buffer and then eventually allocating vmalloc space to copy this into, we can simply compute the number of bytes in advance, allocate vmalloc space, and then directly emit the output into the vmalloc buffer. Related to #1873, #1998. --- diff --git a/lib/expr/exeval.c b/lib/expr/exeval.c index 602a4f343..926567bfc 100644 --- a/lib/expr/exeval.c +++ b/lib/expr/exeval.c @@ -1615,8 +1615,7 @@ eval(Expr_t* ex, Exnode_t* expr, void* env) tmp.data.constant.value.string = exprintf(ex->ve, "%g", v.floating); } else if ((*ex->disc->convertf)(ex, &tmp, STRING, expr->data.operand.right ? expr->data.operand.right->data.variable.symbol : (Exid_t*)0, 0, ex->disc)) { - sfprintf(ex->tmp, "%g", v.floating); - tmp.data.constant.value.string = exstash(ex->tmp, ex->ve); + tmp.data.constant.value.string = exprintf(ex->ve, "%g", v.floating); } tmp.type = STRING; return tmp.data.constant.value;