Skip to content

Commit

Permalink
Merge pull request ksh-community#16 from JohnoKing/fix-optimized-vari…
Browse files Browse the repository at this point in the history
…ables

Remove a buggy optimization for variables in subshells

Fixes ksh-community#15
  • Loading branch information
McDutchie authored Jun 15, 2020
2 parents ef1621c + 3d38270 commit 503a596
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 3 deletions.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ Any uppercase BUG_* names are modernish shell bug IDs.

- The 'source' alias has been converted into a regular built-in command.

- Functions that set variables in a virtual subshell will no longer affect
variables of the same name outside of the virtual subshell's environment.

2020-06-14:

- 'read -S' is now able to correctly handle strings with double quotes
Expand Down
3 changes: 0 additions & 3 deletions src/cmd/ksh93/sh/subshell.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,9 +251,6 @@ Namval_t *sh_assignok(register Namval_t *np,int add)
/* don't bother with this */
if(!sp->shpwd || np==SH_LEVELNOD || np==L_ARGNOD || np==SH_SUBSCRNOD || np==SH_NAMENOD)
return(np);
/* don't bother to save if in newer scope */
if(sp->var!=shp->var_tree && sp->var!=shp->var_base && shp->last_root==shp->var_tree)
return(np);
if((ap=nv_arrayptr(np)) && (mp=nv_opensub(np)))
{
shp->last_root = ap->table;
Expand Down
13 changes: 13 additions & 0 deletions src/cmd/ksh93/tests/subshell.sh
Original file line number Diff line number Diff line change
Expand Up @@ -726,5 +726,18 @@ check_hash_table()
(hash cat)
[[ $(hash) == "chmod=$(whence -p chmod)" ]] || err_exit $'changes to a subshell\'s hash table affect the parent shell'

# ======
# Variables set in functions inside of a virtual subshell should not affect the
# outside environment. This regression test must be run from the disk.
testvars=$tmp/testvars.sh
cat >| "$testvars" << 'EOF'
c=0
function set_ac { a=1; c=1; }
function set_abc { ( set_ac ; b=1 ) }
set_abc
echo "a=$a b=$b c=$c"
EOF
v=$($SHELL $testvars) && [[ "$v" == "a= b= c=0" ]] || err_exit 'variables set in subshells are not confined to the subshell'

# ======
exit $((Errors<125?Errors:125))

0 comments on commit 503a596

Please sign in to comment.