From 0e02771f45e9d1168db8091f5be066a20a8136a0 Mon Sep 17 00:00:00 2001 From: Matthew Fernandez Date: Fri, 23 Jul 2021 19:24:48 -0700 Subject: [PATCH] eval: avoid sfprintf in integer-to-string static 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. --- lib/expr/exeval.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/expr/exeval.c b/lib/expr/exeval.c index 926567bfc..0bc040ff7 100644 --- a/lib/expr/exeval.c +++ b/lib/expr/exeval.c @@ -1779,11 +1779,12 @@ eval(Expr_t* ex, Exnode_t* expr, void* env) tmp.data.constant.value = v; if (expr->data.operand.left->op != DYNAMIC && expr->data.operand.left->op != ID) { + char *str; if (expr->data.operand.left->type == UNSIGNED) - sfprintf(ex->tmp, "%I*u", sizeof(v.integer), v.integer); + str = exprintf(ex->ve, "%llu", (unsigned long long)v.integer); else - sfprintf(ex->tmp, "%I*d", sizeof(v.integer), v.integer); - tmp.data.constant.value.string = exstash(ex->tmp, ex->ve); + str = exprintf(ex->ve, "%lld", (long long)v.integer); + tmp.data.constant.value.string = str; } 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)) { if (expr->data.operand.left->type == UNSIGNED) -- 2.50.0