mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix assignments preceding 'command <special builtin>' (#19)
Ksh was not checking for `command` when running a special builtin, which caused preceding invocation-local variable assignments to become global. This is the reproducer from the att/ast#72: $ foo=BUG command eval ':' $ echo "$foo" This no longer prints 'BUG', as ksh now makes sure the command builtin is not running a special builtin before making invocation-local variable assignments global. src/cmd/ksh93/sh/xec.c: - Backport the bugfix for BUG_CMDSPASGN from ksh93v- 2013-10-10-alpha. src/cmd/ksh93/tests/builtins.sh: - Add a regression test based on the reproducer in att/ast#72.
This commit is contained in:
parent
c258a04f7a
commit
fae8862c53
4 changed files with 10 additions and 8 deletions
4
NEWS
4
NEWS
|
@ -8,6 +8,10 @@ Any uppercase BUG_* names are modernish shell bug IDs.
|
||||||
- Passing the '-d' flag to the read builtin will no longer cause the '-r'
|
- Passing the '-d' flag to the read builtin will no longer cause the '-r'
|
||||||
flag to be discarded when 'read -r -d' is run.
|
flag to be discarded when 'read -r -d' is run.
|
||||||
|
|
||||||
|
- Fix BUG_CMDSPASGN: preceding a "special builtin"[*] with 'command' now
|
||||||
|
prevents preceding invocation-local variable assignments from becoming global.
|
||||||
|
[*] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14
|
||||||
|
|
||||||
2020-06-15:
|
2020-06-15:
|
||||||
|
|
||||||
- The 'source' alias has been converted into a regular built-in command.
|
- The 'source' alias has been converted into a regular built-in command.
|
||||||
|
|
7
TODO
7
TODO
|
@ -13,9 +13,6 @@ Fix build system:
|
||||||
- Reimport the removed nmake. It is necessary for changes in Makefiles
|
- Reimport the removed nmake. It is necessary for changes in Makefiles
|
||||||
to take effect. The machine-generated Mamfiles are now used as a fallback,
|
to take effect. The machine-generated Mamfiles are now used as a fallback,
|
||||||
but they are not meant to be edited by hand.
|
but they are not meant to be edited by hand.
|
||||||
- Reimport the removed pty command (for scripting interactive sessions). This
|
|
||||||
is necessary for the pty.sh regression tests to work, which test ksh as an
|
|
||||||
interactive shell. We want to avoid breaking the interactive shell, too.
|
|
||||||
|
|
||||||
______
|
______
|
||||||
Fix or remove broken or misguided default aliases:
|
Fix or remove broken or misguided default aliases:
|
||||||
|
@ -59,10 +56,6 @@ https://github.com/modernish/modernish/tree/0.16/lib/modernish/cap/
|
||||||
don't work.
|
don't work.
|
||||||
See also: https://github.com/att/ast/issues/963
|
See also: https://github.com/att/ast/issues/963
|
||||||
|
|
||||||
- BUG_CMDSPASGN: preceding a "special builtin"[*] with 'command' does not
|
|
||||||
stop preceding invocation-local variable assignments from becoming global.
|
|
||||||
[*] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14
|
|
||||||
|
|
||||||
- BUG_CMDSPEXIT: preceding a "special builtin"[*] (other than 'eval', 'exec',
|
- BUG_CMDSPEXIT: preceding a "special builtin"[*] (other than 'eval', 'exec',
|
||||||
'return' or 'exit') with 'command' does not always stop it from exiting
|
'return' or 'exit') with 'command' does not always stop it from exiting
|
||||||
the shell if the builtin encounters error.
|
the shell if the builtin encounters error.
|
||||||
|
|
|
@ -1134,7 +1134,7 @@ int sh_exec(register const Shnode_t *t, int flags)
|
||||||
io = t->tre.treio;
|
io = t->tre.treio;
|
||||||
if(shp->envlist = argp = t->com.comset)
|
if(shp->envlist = argp = t->com.comset)
|
||||||
{
|
{
|
||||||
if(argn==0 || (np && nv_isattr(np,(BLT_DCL|BLT_SPC))))
|
if(argn==0 || (np && (nv_isattr(np,BLT_DCL) || (!command && nv_isattr(np,BLT_SPC)))))
|
||||||
{
|
{
|
||||||
Namval_t *tp=0;
|
Namval_t *tp=0;
|
||||||
if(argn)
|
if(argn)
|
||||||
|
|
|
@ -697,5 +697,10 @@ whence -q export) || err_exit '`builtin -d` deletes special builtins'
|
||||||
printf '\\\000' | read -r -d ''
|
printf '\\\000' | read -r -d ''
|
||||||
[[ $REPLY == $'\\' ]] || err_exit "read -r -d '' ignores -r"
|
[[ $REPLY == $'\\' ]] || err_exit "read -r -d '' ignores -r"
|
||||||
|
|
||||||
|
# ======
|
||||||
|
# Preceding a special builtin with `command` should disable its special properties
|
||||||
|
foo=BUG command eval ':'
|
||||||
|
[[ $foo == BUG ]] && err_exit '`command` fails to disable the special properties of special builtins'
|
||||||
|
|
||||||
# ======
|
# ======
|
||||||
exit $((Errors<125?Errors:125))
|
exit $((Errors<125?Errors:125))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue