zsh-workers
 help / color / mirror / code / Atom feed
From: Peter Stephenson <pws@csr.com>
To: zsh-workers@sunsite.dk (Zsh hackers list)
Subject: PATCH: Seg. fault in chpwd hook in a widget
Date: Mon, 09 Mar 2009 11:22:45 +0000	[thread overview]
Message-ID: <17095.1236597765@csr.com> (raw)

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@csr.com>                  Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070


             reply	other threads:[~2009-03-09 11:23 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-09 11:22 Peter Stephenson [this message]
2009-03-09 15:49 ` Bart Schaefer
2009-03-09 16:02   ` Peter Stephenson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=17095.1236597765@csr.com \
    --to=pws@csr.com \
    --cc=zsh-workers@sunsite.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).