mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-24 15:04:13 +00:00
Functions can now be correctly redefined and unset in subshell environments (such as ( ... ), $(command substitutions), etc). Before this fix, attempts to do this were silently ignored (!!!), causing the wrong code (i.e.: the function by the same name from the parent shell environment) to be executed. Redefining and unsetting functions within "shared" command substitutions of the form '${ ...; }' is also fixed. Prior discussion: https://github.com/att/ast/issues/73 src/cmd/ksh93/sh/parse.c: - A fix from George Koelher (URL above). He writes: | The parser can set t->comnamp to the wrong function. | Suppose that the shell has executed | foo() { echo WRONG; } | and is now parsing | (foo() { echo ok; } && foo) | The parser was setting t->comnamp to the wrong foo. [This | fix] doesn't set t->comnamp unless it was a builtin. Now the | subshell can't call t->comnamp, so it looks for foo and finds | the ok foo in the subshell's function tree. src/cmd/ksh93/bltins/typeset.c: - Unsetting functions in a virtual/non-forked subshell still doesn't work: nv_open() fails to find the function. To work around this problem, make 'unset -f' fork the subshell into its own process with sh_subfork(). - The workaround exposed another bug: if we unset a function in a subshell tree that overrode a function by the same name in the main shell, then nv_delete() exposes the function from the main shell scope. Since 'unset -f' now always forks a subshell, the fix is to simply walk though troot's parent views and delete any such zombie functions as well. (Without this, the 4 'more fun' tests in tests/subshell.sh fail.) src/cmd/ksh93/sh/subshell.c: sh_subfuntree(): - Fix function (re)definitions and unsetting in "shared" command substitutions of the form '${ commandlist; }' (i.e.: if sp->shp->subshare is true). Though internally this is a weird form of virtual subshell, the manual page says it does not execute in a subshell (meaning, all changes must survive it), so a subshell function tree must not be created for these. src/cmd/ksh93/tests/subshell.sh: - Add regression tests related to these bugfixes. Test unsetting and redefining a function in all three forms of virtual subshell. (cherry picked from commit dde387825ab1bbd9f2eafc5dc38d5fd0bf9c3652) |
||
---|---|---|
.. | ||
alias.sh | ||
append.sh | ||
arith.sh | ||
arrays.sh | ||
arrays2.sh | ||
attributes.sh | ||
basic.sh | ||
bracket.sh | ||
builtins.sh | ||
case.sh | ||
comvar.sh | ||
comvario.sh | ||
coprocess.sh | ||
cubetype.sh | ||
enum.sh | ||
exit.sh | ||
expand.sh | ||
functions.sh | ||
glob.sh | ||
grep.sh | ||
heredoc.sh | ||
io.sh | ||
leaks.sh | ||
locale.sh | ||
math.sh | ||
nameref.sh | ||
namespace.sh | ||
options.sh | ||
path.sh | ||
pointtype.sh | ||
pty.sh | ||
quoting.sh | ||
quoting2.sh | ||
readcsv.sh | ||
recttype.sh | ||
restricted.sh | ||
return.sh | ||
select.sh | ||
shtests | ||
sigchld.sh | ||
signal.sh | ||
statics.sh | ||
subshell.sh | ||
substring.sh | ||
tilde.sh | ||
timetype.sh | ||
treemove.sh | ||
types.sh | ||
variables.sh | ||
vartree1.sh | ||
vartree2.sh |