Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement a better fix for unsetting special env vars #7

Merged
merged 1 commit into from
Jun 13, 2020

Commits on Jun 13, 2020

  1. 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.
    JohnoKing committed Jun 13, 2020
    2 Configuration menu
    Copy the full SHA
    7b994b6 View commit details
    Browse the repository at this point in the history