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)
		
	
			
		
			
				
	
	
		
			82 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| TODO for AT&T ksh93, 93u+m bugfix branch
 | ||
| 
 | ||
| ______
 | ||
| Fix or remove broken default aliases:
 | ||
| 
 | ||
| - Remove alias times='{ { time;} 2>&1;}' which does not produce POSIX-
 | ||
|   compliant output; reimplement as a proper POSIX-compliant builtin.
 | ||
|   In any case, implementing a standard utility as an alias is unacceptable
 | ||
|   as 'unalias -a' (remove all aliases) should not remove standard utilities!
 | ||
|   Backport the builtin from the abandoned Vashisht/Rader branch:
 | ||
|   https://github.com/att/ast/pull/1332
 | ||
| 
 | ||
| - Remove alias command='command '. Continuing alias substitution after
 | ||
|   'command' (due to the final space in the alias) is inherently broken, as
 | ||
|   aliases may contain arbitrary shell grammar. For instance, when combining
 | ||
|   this default alias with the default 'times' alias ('command times'), which
 | ||
|   is perfectly valid per POSIX, you get a syntax error!
 | ||
| 
 | ||
| - Remove alias nohup='nohup '. Same reason as for 'command ' above.
 | ||
| 
 | ||
| - Remove pointless default aliases 'fc' and 'type'; these are already
 | ||
|   implemented as normal shell builtins. Add man page entries for these.
 | ||
| 
 | ||
| ______
 | ||
| Fix currently known bugs affecting shell scripting. These are identified by
 | ||
| their modernish IDs. For exact details, see code/comments in:
 | ||
| https://github.com/modernish/modernish/tree/0.16/lib/modernish/cap/
 | ||
| 
 | ||
| - BUG_BRACQUOT: shell quoting within bracket patterns has no effect. This
 | ||
|   bug means the '-' retains it special meaning of 'character range', and an
 | ||
|   initial ! (and, on some shells, ^) retains the meaning of negation, even
 | ||
|   in quoted strings within bracket patterns, including quoted variables.
 | ||
| 
 | ||
| - BUG_CMDEXPAN: if the 'command' command results from an expansion, it acts
 | ||
|   like 'command -v', showing the path of the command instead of executing it.
 | ||
|   For example:
 | ||
| 	v=command; "$v" ls
 | ||
|   or
 | ||
| 	set -- command ls; "$@"
 | ||
|   don't work.
 | ||
| 
 | ||
| - 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',
 | ||
|   'return' or 'exit') with 'command' does not always stop it from exiting
 | ||
|   the shell if the builtin encounters error.
 | ||
|   [*] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14
 | ||
| 
 | ||
| - BUG_CSUBSTDO: If standard output (file descriptor 1) is closed before
 | ||
|   entering a $(command substitution), and any other file descriptors are
 | ||
|   redirected within the command substitution, commands such as 'echo' will
 | ||
|   not work within the command substitution, acting as if standard output is
 | ||
|   still closed.
 | ||
| 
 | ||
| - BUG_IFSGLOBS: In glob pattern matching (as in case or parameter
 | ||
|   substitution with # and %), if IFS starts with ? or * and the "$*"
 | ||
|   parameter expansion inserts any IFS separator characters, those characters
 | ||
|   are erroneously interpreted as wildcards when quoted "$*" is used as the
 | ||
|   glob pattern.
 | ||
| 
 | ||
| - BUG_KUNSETIFS: ksh93: Can't unset IFS under very specific circumstances.
 | ||
|   unset -v IFS is a known POSIX shell idiom to activate default field
 | ||
|   splitting. With this bug, the unset builtin silently fails to unset IFS
 | ||
|   (i.e. fails to activate field splitting) if we're executing an eval or a
 | ||
|   trap and a number of specific conditions are met.
 | ||
| 
 | ||
| - BUG_LOOPRET2: If a 'return' command is given without a status argument
 | ||
|   within the set of conditional commands in a 'while' or 'until' loop (i.e.,
 | ||
|   between 'while'/'until' and 'do'), the exit status passed down from the
 | ||
|   previous command is ignored and the function returns with status 0
 | ||
|   instead.
 | ||
| 
 | ||
| - BUG_MULTIBIFS: We're on a UTF-8 locale and the shell supports UTF-8
 | ||
|   characters in general (i.e. we don't have WRN_MULTIBYTE) – however, using
 | ||
|   multi-byte characters as IFS field delimiters still doesn't work. For
 | ||
|   example, "$*" joins positional parameters on the first byte of IFS instead
 | ||
|   of the first character.
 | ||
| 
 | ||
| - BUG_TESTERR1A: test/[ exits with a non-error false status (1) if an
 | ||
|   invalid argument is given to an operator.
 |