expr: tonum: handle case where result was previously calculated - sbase - suckl… | |
git clone git://git.suckless.org/sbase | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit d335c366f7a2ef74ab8da19b721707110ec821c8 | |
parent 6b9da17eb42e671946bf9326476a20f1b9497bdc | |
Author: Randy Palamar <[email protected]> | |
Date: Mon, 22 Jan 2024 14:18:10 -0700 | |
expr: tonum: handle case where result was previously calculated | |
As pointed out in a mail to dev expr was segfaulting when multiple | |
math operations were specified on the command line: eg. 'expr 3 \* | |
2 + 1'. This happens because the tonum(), introduced in e50d533, | |
assumed that v->str was always non null. parse() guarantees this | |
for user input but this is not the case when doop() is called with | |
the result of a previous calculation. However in that case we know | |
that v->num is already valid so we can simply return. | |
Diffstat: | |
M expr.c | 8 +++++++- | |
1 file changed, 7 insertions(+), 1 deletion(-) | |
--- | |
diff --git a/expr.c b/expr.c | |
@@ -21,7 +21,13 @@ static void | |
tonum(struct val *v) | |
{ | |
const char *errstr; | |
- long long d = strtonum(v->str, LLONG_MIN, LLONG_MAX, &errstr); | |
+ long long d; | |
+ | |
+ /* check if val is the result of an earlier calculation */ | |
+ if (!v->str) | |
+ return; | |
+ | |
+ d = strtonum(v->str, LLONG_MIN, LLONG_MAX, &errstr); | |
if (errstr) | |
enprintf(2, "error: expected integer, got %s\n", v->str); | |
v->num = d; |