Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: Seg. fault in chpwd hook in a widget
- X-seq: zsh-workers 26702
- From: Peter Stephenson <pws@xxxxxxx>
- To: zsh-workers@xxxxxxxxxx (Zsh hackers list)
- Subject: PATCH: Seg. fault in chpwd hook in a widget
- Date: Mon, 09 Mar 2009 11:22:45 +0000
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
Just had a look at the Sourforge bug tracker, which normally I don't
have time to do (please feel free to forward things to the list if you
notice anything there which appears to be reproducible and hasn't been
fixed); issue 2338948 is this:
https://sourceforge.net/tracker/index.php?func=detail&aid=2338948&group_id=4068&atid=104068
This is an interesting interaction of different levels of the shell. I
think a key part of it is the "source". It seems that hbegin() in here
is trashing the current history line chline. It seems to me that we
should only be calling hbegin() after a lexsave(), to protect against
this, and there appears to be nothing in the call to loop() from
source() that does that.
I'm quite surpsised we've never seen anything like this before; there
seems to be no protection against chline being trashed by any old
"source" or "." that comes along. As far as I can see, lexsave() is the
only way of doing this. I think the answer is that most of the time the
history mechanism has exited by this time, so chline is already NULL and
its friends aren't being used.
Obviously any alternative opinions would be useful. Currently that
means Bart, but both of us would be very interested in getting new
apprentice source code gurus...
(I wonder if there's a more efficient way of saving and restoring lexical
context? It would imply lexical variables being accessed by pointers,
so the answer may well be "no".)
Index: Src/init.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/init.c,v
retrieving revision 1.99
diff -u -r1.99 init.c
--- Src/init.c 19 Feb 2009 10:12:39 -0000 1.99
+++ Src/init.c 9 Mar 2009 11:07:31 -0000
@@ -105,6 +105,8 @@
Eprog prog;
pushheap();
+ if (!toplevel)
+ lexsave();
for (;;) {
freeheap();
if (stophist == 3) /* re-entry via preprompt() */
@@ -199,6 +201,8 @@
if (justonce)
break;
}
+ if (!toplevel)
+ lexrestore();
popheap();
}
--
Peter Stephenson <pws@xxxxxxx> Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070
Messages sorted by:
Reverse Date,
Date,
Thread,
Author