mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix subshell leak for 4 special variables (re: bd3e2a80
)
The following special variables leaked out of a subshell: $_, ${.sh.name}, ${.sh.level}, ${.sh.subscript}. This was due to a faulty optimisation in sh_assignok().bd3e2a80
fixed that in part, this fixes the rest. src/cmd/ksh93/sh/subshell.c: - Simplify sh_assignok() by removing special-casing for these four special variables. The 'add' param reverts to a simple boolean. - The test for a ${ subshare; } was actually wrong. sp->subshare is a saved backup value. We must test shp->subshare. (re:a9de50bf
) src/cmd/ksh93/bltins/typeset.c: - setall(), unall(): Update sh_assignok() calls. src/cmd/ksh93/tests/variables.sh: - Regress-test subshell leaks for all special variables. Closes: #122
This commit is contained in:
parent
00d439605f
commit
b3d37b00b0
3 changed files with 19 additions and 12 deletions
|
@ -233,10 +233,6 @@ int nv_subsaved(register Namval_t *np)
|
|||
*
|
||||
* add == 0: Move the node pointer from the parent shell to the current virtual subshell.
|
||||
* add == 1: Create a copy of the node pointer in the current virtual subshell.
|
||||
* add == 2: This will create a copy of the node pointer like 1, but it will disable the
|
||||
* optimization for ${.sh.level}.
|
||||
* add == 3: This is like 1, but it will never skip the following variables:
|
||||
* ${.sh.level}, $_, ${.sh.subscript} and ${.sh.name}.
|
||||
*/
|
||||
Namval_t *sh_assignok(register Namval_t *np,int add)
|
||||
{
|
||||
|
@ -248,11 +244,8 @@ Namval_t *sh_assignok(register Namval_t *np,int add)
|
|||
Namval_t *mpnext;
|
||||
Namarr_t *ap;
|
||||
unsigned int save;
|
||||
/* don't bother to save if in a ${ subshare; } */
|
||||
if(sp->subshare)
|
||||
return(np);
|
||||
/* don't bother with this */
|
||||
if(!sp->shpwd || (add != 3 && ((add != 2 && np==SH_LEVELNOD) || np==L_ARGNOD || np==SH_SUBSCRNOD || np==SH_NAMENOD)))
|
||||
/* don't save if told not to (see nv_restore()) or if we're in a ${ subshare; } */
|
||||
if(!sp->shpwd || shp->subshare)
|
||||
return(np);
|
||||
if((ap=nv_arrayptr(np)) && (mp=nv_opensub(np)))
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue