]> granicus.if.org Git - graphviz/commitdiff
eval: avoid sfprintf in integer-to-string dynamic
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 24 Jul 2021 02:26:37 +0000 (19:26 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Wed, 4 Aug 2021 01:41:49 +0000 (18:41 -0700)
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

index 0bc040ff7ca10c041071ec69a270a0e7d59b05aa..ea7fc9e331a1e1ea8601f6bcdfaca7f01d287338 100644 (file)
@@ -1787,11 +1787,12 @@ eval(Expr_t* ex, Exnode_t* expr, void* env)
                                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)) {
+                               char *str = NULL;
                                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;
                        }
                        tmp.type = STRING;
                        return tmp.data.constant.value;