mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +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 | ||