sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit d335c366f7a2ef74ab8da19b721707110ec821c8
parent 6b9da17eb42e671946bf9326476a20f1b9497bdc
Author: Randy Palamar <randy@rnpnr.xyz>
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:
Mexpr.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;