svn commit: r268576 - in head/bin/sh: . tests/parameters
Jilles Tjoelker
jilles at FreeBSD.org
Sat Jul 12 21:54:13 UTC 2014
Author: jilles
Date: Sat Jul 12 21:54:11 2014
New Revision: 268576
URL: http://svnweb.freebsd.org/changeset/base/268576
Log:
sh: Correctly handle positional parameters beyond INT_MAX on 64-bit systems.
Currently, there can be no more than INT_MAX positional parameters. Make
sure to treat all higher ones as unset to avoid incorrect results and
crashes.
On 64-bit systems, our atoi() takes the low 32 bits of the strtol() and
sign-extends them.
On 32-bit systems, the call to atoi() returned INT_MAX for too high values
and there is not enough address space for so many positional parameters, so
there was no issue.
Added:
head/bin/sh/tests/parameters/positional5.0 (contents, props changed)
Modified:
head/bin/sh/expand.c
head/bin/sh/tests/parameters/Makefile
Modified: head/bin/sh/expand.c
==============================================================================
--- head/bin/sh/expand.c Sat Jul 12 21:24:28 2014 (r268575)
+++ head/bin/sh/expand.c Sat Jul 12 21:54:11 2014 (r268576)
@@ -846,9 +846,11 @@ varisset(const char *name, int nulok)
}
} else if (is_digit(*name)) {
char *ap;
- int num = atoi(name);
+ long num;
- if (num > shellparam.nparam)
+ errno = 0;
+ num = strtol(name, NULL, 10);
+ if (errno != 0 || num > shellparam.nparam)
return 0;
if (num == 0)
Modified: head/bin/sh/tests/parameters/Makefile
==============================================================================
--- head/bin/sh/tests/parameters/Makefile Sat Jul 12 21:24:28 2014 (r268575)
+++ head/bin/sh/tests/parameters/Makefile Sat Jul 12 21:54:11 2014 (r268576)
@@ -15,6 +15,7 @@ FILES+= positional1.0
FILES+= positional2.0
FILES+= positional3.0
FILES+= positional4.0
+FILES+= positional5.0
FILES+= pwd1.0
FILES+= pwd2.0
Added: head/bin/sh/tests/parameters/positional5.0
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/bin/sh/tests/parameters/positional5.0 Sat Jul 12 21:54:11 2014 (r268576)
@@ -0,0 +1,14 @@
+# $FreeBSD$
+
+i=1
+r=0
+while [ $i -lt $((0x100000000)) ]; do
+ t=
+ eval t=\${$i-x}
+ case $t in
+ x) ;;
+ *) echo "Problem with \${$i}" >&2; r=1 ;;
+ esac
+ i=$((i + 0x10000000))
+done
+exit $r
More information about the svn-src-head
mailing list