mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix unreliable behavior when special vars are readonly or unset (#27)
src/cmd/ksh93/data/variables.c:
- Running 'unset .sh.lineno' creates a memory fault, so fix that
by giving it the NV_NOFREE attribute. This crash was happening
because ${.sh.lineno} is an integer that cannot be freed from
memory with free(3).
src/cmd/ksh93/sh/init.c:
- Tell _nv_unset to ignore NV_RDONLY when $RANDOM and $LINENO are
restored from the subshell scope. This is required to fully
restore the original state of these variables after a virtual
subshell finishes.
src/cmd/ksh93/bltins/typeset.c,
src/cmd/ksh93/sh/subshell.c:
- Disabled some optimizations for two instances of 'sh_assignok' to
fix 'readonly' in virtual subshells and '(unset .sh.level)' in
nested functions. This fixes the following variables when
'(readonly $varname); enum varname=' is run:
$_
${.sh.name}
${.sh.subscript}
${.sh.level}
The optimization in question prevents sh_assignok from saving the
original state of these variables by making the sh_assignok call
a no-op. Ksh needs the original state of a variable for it to be
properly restored after a virtual subshell has run, otherwise ksh
will simply carry over any new flags (being NV_RDONLY in this case)
from the subshell into the main shell.
src/cmd/ksh93/tests/variables.sh:
- Add regression tests from Martijn Dekker for setting special
variables as readonly in virtual subshells and for unsetting
special variables in general.
Fixes #4
This commit is contained in:
parent
ee698e89d5
commit
bd3e2a8001
7 changed files with 174 additions and 9 deletions
|
|
@ -638,7 +638,7 @@ static void put_rand(register Namval_t* np,const char *val,int flags,Namfun_t *f
|
|||
fp = nv_stack(np, NIL(Namfun_t*));
|
||||
if(fp && !fp->nofree)
|
||||
free((void*)fp);
|
||||
_nv_unset(np,0);
|
||||
_nv_unset(np,NV_RDONLY);
|
||||
return;
|
||||
}
|
||||
if(flags&NV_INTEGER)
|
||||
|
|
@ -696,7 +696,7 @@ static void put_lineno(Namval_t* np,const char *val,int flags,Namfun_t *fp)
|
|||
fp = nv_stack(np, NIL(Namfun_t*));
|
||||
if(fp && !fp->nofree)
|
||||
free((void*)fp);
|
||||
_nv_unset(np,0);
|
||||
_nv_unset(np,NV_RDONLY);
|
||||
return;
|
||||
}
|
||||
if(flags&NV_INTEGER)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue