[git commit branch/1_31_stable] ash: fix BASE##nn bashism to accept letter 'digits' for bases > 9

Denys Vlasenko vda.linux at googlemail.com
Mon Oct 21 14:54:40 UTC 2019


commit: https://git.busybox.net/busybox/commit/?id=3004510fdc7dfb0c511cfdc0011011bf65a75345
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/1_31_stable

function                                             old     new   delta
evaluate_string                                      873     876      +3

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/math.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/shell/math.c b/shell/math.c
index eaf4f2453..0c806ad39 100644
--- a/shell/math.c
+++ b/shell/math.c
@@ -538,9 +538,16 @@ static arith_t strto_arith_t(const char *nptr, char **endptr)
 	n = 0;
 	nptr = *endptr + 1;
 	/* bash allows "N#" (empty "nnnn" part) */
-	while (isdigit(*nptr)) {
+	for (;;) {
+		unsigned digit = (unsigned)*nptr - '0';
+		if (digit >= 10 || digit >= base) {
+			digit = (unsigned)(*nptr | 0x20) - ('a' - 10);
+			if (digit >= base)
+				break;
+		}
 		/* bash does not check for overflows */
-		n = n * base + (*nptr++ - '0');
+		n = n * base + digit;
+		nptr++;
 	}
 	*endptr = (char*)nptr;
 	return n;


More information about the busybox-cvs mailing list