diff options
author | Denys Vlasenko | 2023-06-18 20:13:22 +0200 |
---|---|---|
committer | Denys Vlasenko | 2023-06-18 20:15:35 +0200 |
commit | 79b90cbece5d69c4d370347c347f3d17bd1156c6 (patch) | |
tree | 04122fddeda0c1cc413b9780a0cc507d6873f5d5 | |
parent | 10cce8ae35654585a09d6e839dd502f04b81599d (diff) | |
download | busybox-79b90cbece5d69c4d370347c347f3d17bd1156c6.zip busybox-79b90cbece5d69c4d370347c347f3d17bd1156c6.tar.gz |
shell/math: add note on ERANGE
function old new delta
evaluate_string 1488 1478 -10
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/math.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/shell/math.c b/shell/math.c index 0b30e08..e5447e7 100644 --- a/shell/math.c +++ b/shell/math.c @@ -667,6 +667,7 @@ evaluate_string(arith_state_t *math_state, const char *expr) /* At this point, we're done with the expression */ if (numstackptr != numstack + 1) { /* if there is not exactly one result, it's bad */ + /* Example: $((1 2)) */ goto syntax_err; } return numstack->val; @@ -691,9 +692,10 @@ evaluate_string(arith_state_t *math_state, const char *expr) } } else { dbg("[%d] var:IGNORED", (int)(numstackptr - numstack)); - numstackptr->var_name = NULL; - numstackptr->val = 0; //paranoia, probably not needed expr = p; + numstackptr->var_name = NULL; + push_num0: + numstackptr->val = 0; } push_num: numstackptr++; @@ -717,8 +719,13 @@ evaluate_string(arith_state_t *math_state, const char *expr) */ if (isalnum(*expr) || *expr == '_') goto syntax_err; - if (errno) - numstackptr->val = 0; /* bash compat */ + if (errno) { +// TODO: bash 5.2.15 does not catch ERANGE (some older version did?). +// $((99999999999999999999)) is 7766279631452241919 (the 64-bit truncated value). +// Our BASE# code does this as well: try $((10#99999999999999999999)), +// but the "ordinary" code path with strtoull() does not do this. + goto push_num0; /* bash compat */ + } goto push_num; } |