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;
}