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

Reply via email to