diff options
author | jilles <jilles@FreeBSD.org> | 2014-12-14 18:30:30 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2014-12-14 18:30:30 +0000 |
commit | df71c472199af029bb45e07281be1a16bdc6dcc7 (patch) | |
tree | 7e89843a2c631463f878a11fbbc2bfc9afddd525 /bin | |
parent | af32fb7fcebdcf67a0a8285e258a834fb669156e (diff) | |
download | FreeBSD-src-df71c472199af029bb45e07281be1a16bdc6dcc7.zip FreeBSD-src-df71c472199af029bb45e07281be1a16bdc6dcc7.tar.gz |
MFC r268576: 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.
PR: 195918
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/expand.c | 6 | ||||
-rw-r--r-- | bin/sh/tests/parameters/Makefile | 1 | ||||
-rw-r--r-- | bin/sh/tests/parameters/positional5.0 | 14 |
3 files changed, 19 insertions, 2 deletions
diff --git a/bin/sh/expand.c b/bin/sh/expand.c index a126ca6..67bae6e 100644 --- a/bin/sh/expand.c +++ b/bin/sh/expand.c @@ -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) diff --git a/bin/sh/tests/parameters/Makefile b/bin/sh/tests/parameters/Makefile index fafc059..982b133 100644 --- a/bin/sh/tests/parameters/Makefile +++ b/bin/sh/tests/parameters/Makefile @@ -13,6 +13,7 @@ FILES+= optind1.0 FILES+= optind2.0 FILES+= positional1.0 FILES+= positional2.0 +FILES+= positional5.0 FILES+= pwd1.0 FILES+= pwd2.0 diff --git a/bin/sh/tests/parameters/positional5.0 b/bin/sh/tests/parameters/positional5.0 new file mode 100644 index 0000000..eeaaba5 --- /dev/null +++ b/bin/sh/tests/parameters/positional5.0 @@ -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 |