Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.busybox.net/busybox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2023-06-18 21:13:22 +0300
committerDenys Vlasenko <vda.linux@googlemail.com>2023-06-18 21:15:35 +0300
commit79b90cbece5d69c4d370347c347f3d17bd1156c6 (patch)
tree04122fddeda0c1cc413b9780a0cc507d6873f5d5
parent10cce8ae35654585a09d6e839dd502f04b81599d (diff)
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.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/shell/math.c b/shell/math.c
index 0b30e089d..e5447e767 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;
}