mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
POSIX compliance fix: apply 'set -u' to $!
POSIX requires[*] that expanding any unset parameter other than $@ and $* is an error when 'set -u'/'set -o nounset' is active. However, on ksh93, $! was exempt as well. That is a bug. [*] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_25 src/cmd/ksh93/sh/macro.c: - special(): Handle 'set -u' for special parameters if/when it is about to return NIL. That code path is currently only possible to reach for "$!", but this is future-proof and will do the right thing if any other special parameter can ever have no value. src/cmd/ksh93/tests/options.sh: - Add and tweak 'set -u' regression tests. (cherry picked from commit 75cc7a38cafe3a9929e1ed17d8b952babda22a09)
This commit is contained in:
parent
36da314c9e
commit
5f8b0512f0
3 changed files with 26 additions and 1 deletions
3
NEWS
3
NEWS
|
@ -10,6 +10,9 @@ Any uppercase BUG_* names are modernish shell bug IDs.
|
|||
nonexistent positional parameter such as $1, $2, ... is accessed, as other
|
||||
shells do and POSIX requires. (This does *not* apply to "$@" and "$*".)
|
||||
|
||||
- If 'set -u'/'set -o nounset' is active, then the shell now errors out if $!
|
||||
is accessed before the shell has launched any background process.
|
||||
|
||||
2020-06-06:
|
||||
|
||||
- The 'times' command is now a builtin command that conforms to POSIX
|
||||
|
|
|
@ -2790,6 +2790,19 @@ static char *special(Shell_t *shp,register int c)
|
|||
else
|
||||
return(shp->st.cmdname);
|
||||
}
|
||||
/* Handle 'set -u'/'set -o nounset' for special parameters */
|
||||
if(sh_isoption(SH_NOUNSET))
|
||||
{
|
||||
int d=fcget();
|
||||
fcseek(-1);
|
||||
if(!(d && strchr(":+-?=",d)))
|
||||
{
|
||||
char c_str[2];
|
||||
c_str[0]=(char)c;
|
||||
c_str[1]='\0';
|
||||
errormsg(SH_DICT,ERROR_exit(1),e_notset,c_str);
|
||||
}
|
||||
}
|
||||
return(NIL(char*));
|
||||
}
|
||||
|
||||
|
|
|
@ -511,10 +511,19 @@ $SHELL -uc 'var=foo;unset var;: ${var%foo}' >/dev/null 2>&1 && err_exit '${var%f
|
|||
$SHELL -uc 'var=foo;unset var;: ${!var}' >/dev/null 2>&1 && err_exit '${!var} should fail with set -u'
|
||||
$SHELL -uc 'var=foo;unset var;: ${#var}' >/dev/null 2>&1 && err_exit '${#var} should fail with set -u'
|
||||
$SHELL -uc 'var=foo;unset var;: ${var-OK}' >/dev/null 2>&1 || err_exit '${var-OK} should not fail with set -u'
|
||||
$SHELL -uc 'var=foo;nset var;: ${var:-OK}' >/dev/null 2>&1 || err_exit '${var:-OK} should not fail with set -u'
|
||||
$SHELL -uc 'var=foo;unset var;: ${var:-OK}' >/dev/null 2>&1 || err_exit '${var:-OK} should not fail with set -u'
|
||||
(set -u -- one two; : $2) 2>/dev/null || err_exit "an unset PP failed with set -u"
|
||||
(set -u -- one two; : $3) 2>/dev/null && err_exit "a set PP failed to fail with set -u"
|
||||
(set -u -- one two; : ${3%foo}) 2>/dev/null && err_exit '${3%foo} failed to fail with set -u'
|
||||
(set -u -- one two; : ${3-OK}) 2>/dev/null || err_exit '${3-OK} wrongly failed with set -u'
|
||||
(set -u -- one two; : ${3:-OK}) 2>/dev/null || err_exit '${3:-OK} wrongly failed with set -u'
|
||||
(set -u -- one two; : ${#3}) 2>/dev/null && err_exit '${#3} failed to fail with set -u'
|
||||
(set -u --; : $@ $*) 2>/dev/null || err_exit '$@ and/or $* fail to be exempt from set -u'
|
||||
$SHELL -uc ': $!' 2>/dev/null && err_exit '$! failed to fail with set -u'
|
||||
$SHELL -uc ': ${!%foo}' >/dev/null 2>&1 && err_exit '${!%foo} should fail with set -u'
|
||||
$SHELL -uc ': ${#!}' >/dev/null 2>&1 && err_exit '${#!} should fail with set -u'
|
||||
$SHELL -uc ': ${!-OK}' >/dev/null 2>&1 || err_exit '${!-OK} should not fail with set -u'
|
||||
$SHELL -uc ': ${!:-OK}' >/dev/null 2>&1 || err_exit '${!:-OK} should not fail with set -u'
|
||||
|
||||
z=$($SHELL 2>&1 -uc 'print ${X23456789012345}')
|
||||
[[ $z == *X23456789012345:* ]] || err_exit "error message garbled with set -u got $z"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue