* Re: zsh4.0.1-pre4 : backticks fail if SHLVL nonexistant [not found] <20010518133031.E6141@popov.bri.st.com> @ 2001-05-18 13:24 ` Peter Stephenson 2001-05-18 21:13 ` PATCH: " Bart Schaefer 0 siblings, 1 reply; 4+ messages in thread From: Peter Stephenson @ 2001-05-18 13:24 UTC (permalink / raw) To: Zsh hackers list, Richard Curnow > I've downloaded and built zsh4.0.1-pre4. I was finding that any attempt > to use backtick-substitution was resulting in a core dump. I rebuilt > with -g and tracked it down to a null pointer 'pm' in setiparam, for an > attempt to set SHLVL from line 2316 of exec.c. Unfortunately, I had > SHLVL being unset by a line in my .zshenv. (In order to reduce the > environment to a clean initial state before adding new defintions, I > unset everything except for a defined list of variables at the start of > .zshenv. Previously, SHLVL wasn't one ofthem. It worked OK with zsh > v3.1.5). I can reproduce such a crash reliably with: % unset SHLVL % (( SHLVL-- )) BUG: parameter not created zsh: segmentation fault (core dumped) ./zsh This probably doesn't involve the line in exec.c, but it's almost certainly the same root, so it'll give something to work on. (The BUG message only appears if configured with --enable-zsh-debug.) -- Peter Stephenson <pws@csr.com> Software Engineer CSR Ltd., Unit 300, Science Park, Milton Road, Cambridge, CB4 0XL, UK Tel: +44 (0)1223 392070 ********************************************************************** The information transmitted is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer. ********************************************************************** ^ permalink raw reply [flat|nested] 4+ messages in thread
* PATCH: Re: zsh4.0.1-pre4 : backticks fail if SHLVL nonexistant 2001-05-18 13:24 ` zsh4.0.1-pre4 : backticks fail if SHLVL nonexistant Peter Stephenson @ 2001-05-18 21:13 ` Bart Schaefer 2001-05-19 23:16 ` Peter Stephenson 0 siblings, 1 reply; 4+ messages in thread From: Bart Schaefer @ 2001-05-18 21:13 UTC (permalink / raw) To: Richard Curnow, Zsh hackers list On May 18, 2:24pm, Peter Stephenson wrote: } Subject: Re: zsh4.0.1-pre4 : backticks fail if SHLVL nonexistant } } % unset SHLVL } % (( SHLVL-- )) } BUG: parameter not created It's possible for createparam() to return NULL because it re-used an existing special parameter node, rather than because it actually failed. Probably there ought to be some kind of wrapper around createparam() for this, but for now we can just test it where necessary. However, that wasn't the only problem: setiparam() and setnparam() were also bypassing the parameter's sets.ifn, which was OK only for non-special integer parameters. There's some stuff going on here with `outputradix' that I'm not sure is correct. setiparam() was ignoring the outputradix, setnparam() was using it; maybe that's because only setnparam() gets called from the math code? Anyway, I made them both use it, but maybe neither one should. diff -u zsh-forge/current/Src/params.c zsh-4.0/Src/params.c --- zsh-forge/current/Src/params.c Tue May 1 08:37:03 2001 +++ zsh-4.0/Src/params.c Fri May 18 14:06:10 2001 @@ -1998,17 +1998,16 @@ if (!(v = getvalue(&vbuf, &s, 1))) { if ((ss = strchr(s, '['))) *ss = '\0'; - pm = createparam(t, ss ? PM_ARRAY : PM_INTEGER); + if (!(pm = createparam(t, ss ? PM_ARRAY : PM_INTEGER))) + pm = (Param) paramtab->getnode(paramtab, t); DPUTS(!pm, "BUG: parameter not created"); if (ss) { *ss = '['; - v = getvalue(&vbuf, &t, 1); - DPUTS(!v, "BUG: value not found for new parameter"); } else { - pm->u.val = val; - unqueue_signals(); - return pm; + pm->ct = outputradix; } + v = getvalue(&vbuf, &t, 1); + DPUTS(!v, "BUG: value not found for new parameter"); } mnval.type = MN_INTEGER; mnval.u.l = val; @@ -2042,20 +2041,16 @@ *ss = '\0'; pm = createparam(t, ss ? PM_ARRAY : (val.type & MN_INTEGER) ? PM_INTEGER : PM_FFLOAT); + if (!pm) + pm = (Param) paramtab->getnode(paramtab, t); DPUTS(!pm, "BUG: parameter not created"); if (ss) { *ss = '['; - v = getvalue(&vbuf, &t, 1); - DPUTS(!v, "BUG: value not found for new parameter"); - } else { - if (val.type & MN_INTEGER) { - pm->ct = outputradix; - pm->u.val = val.u.l; - } else - pm->u.dval = val.u.d; - unqueue_signals(); - return pm; + } else if (val.type & MN_INTEGER) { + pm->ct = outputradix; } + v = getvalue(&vbuf, &t, 1); + DPUTS(!v, "BUG: value not found for new parameter"); } setnumvalue(v, val); unqueue_signals(); diff -u zsh-forge/current/Src/subst.c zsh-4.0/Src/subst.c --- zsh-forge/current/Src/subst.c Fri May 18 09:15:52 2001 +++ zsh-4.0/Src/subst.c Fri May 18 13:34:34 2001 @@ -1149,6 +1149,7 @@ isarr = 0; } pm = createparam(nulstring, isarr ? PM_ARRAY : PM_SCALAR); + DPUTS(!pm, "BUG: parameter not created"); if (isarr) pm->u.arr = aval; else -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.brasslantern.com Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: PATCH: Re: zsh4.0.1-pre4 : backticks fail if SHLVL nonexistant 2001-05-18 21:13 ` PATCH: " Bart Schaefer @ 2001-05-19 23:16 ` Peter Stephenson 2001-05-20 0:42 ` PATCH: unset path problem Peter Stephenson 0 siblings, 1 reply; 4+ messages in thread From: Peter Stephenson @ 2001-05-19 23:16 UTC (permalink / raw) To: Zsh hackers list, Richard Curnow "Bart Schaefer" wrote: > There's some stuff going on here with `outputradix' that I'm not sure is > correct. setiparam() was ignoring the outputradix, setnparam() was using > it; maybe that's because only setnparam() gets called from the math code? Yes, setiparam() doesn't need it. On the other problem: > Richard Curnow wrote: > > zshparam.1 says that setting manpath will change MANPATH and vice versa. > > If I change MANPATH, I don't see manpath getting changed. > > You haven't unset that in your .zshenv too, have you? In that case it will > (temporarily) lose its special connection to $manpath. This seems to be a > bug, because it happens even if $manpath is never unset. I'm no longer convinced this is even a bug, if this is really what the problem is. The code quite explicitly unsets both of such a pair --- the connection isn't lost, but manpath remains unset when you set MANPATH, so you have to set both. For user-tied variables with `typeset -T', the documentation is clear about this, though it isn't explicit for pre-defined path variables. It's tricky to have them only unsetting one of a pair, which causes a lot of grief with the internal state. Maybe the answer is to make sure `createparam' is called for the other value if it is also unset? -- Peter Stephenson <pws@pwstephenson.fsnet.co.uk> Work: pws@csr.com Web: http://www.pwstephenson.fsnet.co.uk ^ permalink raw reply [flat|nested] 4+ messages in thread
* PATCH: unset path problem 2001-05-19 23:16 ` Peter Stephenson @ 2001-05-20 0:42 ` Peter Stephenson 0 siblings, 0 replies; 4+ messages in thread From: Peter Stephenson @ 2001-05-20 0:42 UTC (permalink / raw) To: Zsh hackers list, Richard Curnow Peter Stephenson wrote: > > Richard Curnow wrote: > > > If I change MANPATH, I don't see manpath getting changed. > > > > You haven't unset that in your .zshenv too, have you? > > Maybe the answer is to make sure `createparam' is called for the other > value if it is also unset? It does seem to be this simple; it's logical that if they both get unset at once, but retain their specialness, then they should both be recreated at once. I've added a couple of tests for this and the bug fixed by Bart, and some documentation for special tied variables --- was there really none before, or have I missed it? Index: Src/params.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/params.c,v retrieving revision 1.45 diff -u -r1.45 params.c --- Src/params.c 2001/05/19 00:31:23 1.45 +++ Src/params.c 2001/05/19 23:36:50 @@ -669,6 +669,12 @@ if (oldpm && (oldpm->level == locallevel || !(flags & PM_LOCAL))) { if (!(oldpm->flags & PM_UNSET) || (oldpm->flags & PM_SPECIAL)) { oldpm->flags &= ~PM_UNSET; + if ((oldpm->flags & PM_SPECIAL) && oldpm->ename) { + Param altpm = + (Param) paramtab->getnode(paramtab, oldpm->ename); + if (altpm) + altpm->flags &= ~PM_UNSET; + } return NULL; } if ((oldpm->flags & PM_RESTRICTED) && isset(RESTRICTED)) { Index: Test/D04parameter.ztst =================================================================== RCS file: /cvsroot/zsh/zsh/Test/D04parameter.ztst,v retrieving revision 1.1 diff -u -r1.1 D04parameter.ztst --- Test/D04parameter.ztst 2001/04/02 12:34:06 1.1 +++ Test/D04parameter.ztst 2001/05/19 23:36:51 @@ -526,3 +526,23 @@ >fixed >the >shell + + unset SHLVL + (( SHLVL++ )) + print $SHLVL +0:Unsetting and recreation of numerical special parameters +>1 + + unset manpath + print $+MANPATH + manpath=(/here /there) + print $MANPATH + unset MANPATH + print $+manpath + MANPATH=/elsewhere:/somewhere + print $manpath +0:Unsetting and recreation of tied special parameters +>0 +>/here:/there +>0 +>/elsewhere /somewhere Index: Doc/Zsh/params.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/params.yo,v retrieving revision 1.7 diff -u -r1.7 params.yo --- Doc/Zsh/params.yo 2001/04/22 21:02:33 1.7 +++ Doc/Zsh/params.yo 2001/05/19 23:36:52 @@ -632,7 +632,17 @@ enditem() texinode(Parameters Used By The Shell)()(Parameters Set By The Shell)(Parameters) sect(Parameters Used By The Shell) -The following parameters are used by the shell: +The following parameters are used by the shell. + +In cases where there are two parameters with an upper- and lowercase +form of the same name, such as tt(path) and tt(PATH), the lowercase form +is an array and the uppercase form is a scalar with the elements of the +array joined together by colons. These are similar to tied parameters +created via `tt(typeset -T)'. The normal use for the colon-separated +form is for exporting to the environment, while the array form is easier +to manipulate within the shell. Note that unsetting either of the pair +will unset the other; they retain their special properties when +recreated, and recreating one of the pair will recreate the other. startitem() vindex(ARGV0) -- Peter Stephenson <pws@pwstephenson.fsnet.co.uk> Work: pws@csr.com Web: http://www.pwstephenson.fsnet.co.uk ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2001-05-19 23:42 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <20010518133031.E6141@popov.bri.st.com> 2001-05-18 13:24 ` zsh4.0.1-pre4 : backticks fail if SHLVL nonexistant Peter Stephenson 2001-05-18 21:13 ` PATCH: " Bart Schaefer 2001-05-19 23:16 ` Peter Stephenson 2001-05-20 0:42 ` PATCH: unset path problem Peter Stephenson
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/zsh/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).