Module Name: src Committed By: kre Date: Sat Apr 21 23:01:29 UTC 2018
Modified Files: src/bin/sh: arithmetic.c Log Message: In uses like $(( var )) (un-dollared vars in arithmetic) we allow leading whitespace in the value of var (because strtoimax() does) but did not allow trailing whitespace. The effect is that some cases where $(( ${var:-0} )) would work do not work without the $ expansion. Fix that - allow trailing whitespace. However, continue to insist upon at least one digit (a non-null var that contains nothing but whitespace is still an error). Note: posix is not helpful here, it simply requires that the variable contain "a value that forms a valid integer constant" (with an optional + or - sign). To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/bin/sh/arithmetic.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/sh/arithmetic.c diff -u src/bin/sh/arithmetic.c:1.4 src/bin/sh/arithmetic.c:1.5 --- src/bin/sh/arithmetic.c:1.4 Mon Jul 24 13:21:14 2017 +++ src/bin/sh/arithmetic.c Sat Apr 21 23:01:29 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: arithmetic.c,v 1.4 2017/07/24 13:21:14 kre Exp $ */ +/* $NetBSD: arithmetic.c,v 1.5 2018/04/21 23:01:29 kre Exp $ */ /*- * Copyright (c) 1993 @@ -39,7 +39,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: arithmetic.c,v 1.4 2017/07/24 13:21:14 kre Exp $"); +__RCSID("$NetBSD: arithmetic.c,v 1.5 2018/04/21 23:01:29 kre Exp $"); #endif /* not lint */ #include <limits.h> @@ -59,6 +59,7 @@ __RCSID("$NetBSD: arithmetic.c,v 1.4 201 #include "options.h" #include "var.h" #include "show.h" +#include "syntax.h" #if ARITH_BOR + ARITH_ASS_GAP != ARITH_BORASS || \ ARITH_ASS + ARITH_ASS_GAP != ARITH_EQ @@ -127,8 +128,15 @@ arith_lookupvarint(char *varname) str = "0"; errno = 0; result = strtoimax(str, &p, 0); - if (errno != 0 || *p != '\0') + if (errno != 0 || *p != '\0') { + if (errno == 0) { + while (*p != '\0' && is_space(*p)) + p++; + if (*p == '\0') + return result; + } arith_err("variable contains non-numeric value"); + } return result; }