Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement a better fix for unsetting special env vars
The regression this commit fixes was first introduced in ksh93t 2008-07-25. It was previously worked around in 6f0e008 by forking subshells if any special environment variable is unset. The reason why this problem doesn't occur in ksh93s+ is because in that version of ksh sh_assignok never moves nodes, it only clones them. The second argument doesn't set NV_MOVE, which makes `sh_assignok(np,0)` is similar to `sh_assignok(np,1)`. In ksh93t and higher, setting the second argument to zero causes the node to be moved with NV_MOVE, which causes the discipline function associated with the variable node to be removed when `np->nvfun` is set to zero (i.e. NULL). This is why a command like `(unset LC_NUMERIC; LC_NUMERIC=invalid)` doesn't print a diagnostic, as it looses its discipline function. This patch fixes the problem by cloning the node with sh_assignok if it is a special variable with a discipline function. This allows special variables to work as expected in virtual subshells. The original workaround has been kept for the $PATH variable only, as hash tables are still broken in virtual subshells. It has been updated accordingly to only fork subshells if it detects the variable node for PATH. I have added two more regression tests for changing the PATH in subshells to make sure hash tables continue working as expected with this fix. src/cmd/ksh93/bltins/typeset.c: - Only fork virtual subshells if the PATH will be changed. If a variable is a special variable with a discipline function, it should be just be cloned, not moved. src/cmd/ksh93/sh/nvdisc.c: - Add a comment to clarify that NV_MOVE will delete the discipline function associated with the node. src/cmd/ksh93/tests/subshells.sh: - Add two more regression tests for unsetting the PATH in subshells, one for if PATH is being pointed to by a nameref. Condense the hash table tests by moving the main test into a single function.
- Loading branch information
It makes little sense to me that a node's discipline function should ever be removed simply because the node is moved. Have you tried what happens if you simply delete this line, and undo the
sh_assignok()
call differentiation at line 1277 in typeset.c?