mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
libast: Update cdt(3): Allow empty strings in (dt)trees
This backports most of the Cdt (container data types) mechanism from the ksh 93v- beta, based on ground work done by OpenSUSE: https://build.opensuse.org/package/view_file/shells/ksh/ksh93-dttree-crash.dif plus adaptations to match ksh 93u+m and an updated manual page (src/lib/libast/man/cdt.3) added directly from the 93v- sources. | Thu Dec 20 12:48:02 UTC 2012 - werner@suse.de | | - Add ksh93-dttree-crash.dif - Allow empty strings in (dt)trees | (bnc#795324) | | Fri Oct 25 14:07:57 UTC 2013 - werner@suse.de | | - Rework patch ksh93-dttree-crash.dif As usual, precious little information is available because the OpenSUSE bug report is currently closed to the public: https://bugzilla.opensuse.org/show_bug.cgi?id=795324 However, a cursory inspection suggests that this code contains improvements to do with concurrent processing and related robustness. The new cdt.3 manual page adds a lot about that. This has been in production use on OpenSUSE for a long time, so hopefully this will make ksh a little more stable again. Only one way to find out: let's commit and test this... BTW, to get a nice manual, use groff and ghostscript's ps2pdf: $ groff -tman src/lib/libast/man/cdt.3 | ps2pdf - cdt.3.pdf
This commit is contained in:
parent
aa2644ab84
commit
cc4927529b
21 changed files with 708 additions and 210 deletions
|
@ -2429,6 +2429,7 @@ int sh_exec(register const Shnode_t *t, int flags)
|
|||
else
|
||||
{
|
||||
root = dtopen(&_Nvdisc,Dtoset);
|
||||
dtuserdata(root,shp,1);
|
||||
nv_mount(np, (char*)0, root);
|
||||
np->nvalue.cp = Empty;
|
||||
dtview(root,shp->var_base);
|
||||
|
@ -2484,11 +2485,6 @@ int sh_exec(register const Shnode_t *t, int flags)
|
|||
slp = (struct slnod*)np->nvenv;
|
||||
sh_funstaks(slp->slchild,-1);
|
||||
stakdelete(slp->slptr);
|
||||
if(shp->funload)
|
||||
{
|
||||
free((void*)np->nvalue.rp);
|
||||
np->nvalue.rp = 0;
|
||||
}
|
||||
if(rp->sdict)
|
||||
{
|
||||
Namval_t *mp, *nq;
|
||||
|
@ -2502,6 +2498,12 @@ int sh_exec(register const Shnode_t *t, int flags)
|
|||
dtclose(rp->sdict);
|
||||
rp->sdict = 0;
|
||||
}
|
||||
if(shp->funload)
|
||||
{
|
||||
if(!shp->fpathdict)
|
||||
free((void*)np->nvalue.rp);
|
||||
np->nvalue.rp = 0;
|
||||
}
|
||||
}
|
||||
if(!np->nvalue.rp)
|
||||
{
|
||||
|
@ -2540,7 +2542,10 @@ int sh_exec(register const Shnode_t *t, int flags)
|
|||
if(!shp->fpathdict)
|
||||
shp->fpathdict = dtopen(&_Rpdisc,Dtobag);
|
||||
if(shp->fpathdict)
|
||||
{
|
||||
dtuserdata(shp->fpathdict,shp,1);
|
||||
dtinsert(shp->fpathdict,rp);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue