Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Bugreport zsh 3.1.2: Shell exits prematurely after aborting history-incremental-search-backward



Torsten Hilbrich wrote:
> If I startup the zsh I immediatly history-incremental-search-backward
> (^R) in the history.  Instead of executing the found command I simply
> abort using ^C.  Then the next return with or without any command
> given will immediatly exit the shell.  It also happens if there is no
> match found in the backward search.

I had a look at this again, and I believe my previous analysis, that
the lastc variable wasn't getting set properly, was the correct
one.  This time I followed the problem at bit further back.
In my case, /etc/zshenv was being sourced immediately before the
command loop started.  At EOF, inputline() returned false; this caused
ingetc() to set lastc to ' ', the behaviour which I found suspect.
Thus the first time from zleread(), inerrflush() tested lastc, found
it wasn't \n, and assumed, wrongly, there was some junk to flush out.
Knock-on errors from this caused the shell to exit.  Later on, lastc
would be \n because the last input operation was a read from stdin
which didn't return EOF. (You can get the same behaviour at any time
by sourcing a file, followed by the actions Torsten described.)

If there was no /etc/zshenv to source, lastc still wouldn't be \n
because it wasn't initialised, so the same thing happens.

So my patch was correct, with one thing I forgot about:  lastc should
be initialised to \n at startup as a flag that there is no input to
flush.  Here is the complete thing.

*** Src/input.c.inerr	Tue Jun  2 17:16:03 1998
--- Src/input.c	Thu Jun 11 17:01:48 1998
***************
*** 101,107 ****
  static int inbufleft;		/* Characters left in current input
  				   stack element */
  
! static int lastc;		/* used as flag that end of line was reached */
  
  
   /* Input must be stacked since the input queue is used by
--- 101,107 ----
  static int inbufleft;		/* Characters left in current input
  				   stack element */
  
! static int lastc = '\n';	/* used as flag that end of line was reached */
  
  
   /* Input must be stacked since the input queue is used by
***************
*** 179,185 ****
  ingetc(void)
  {
      if (lexstop)
! 	return lastc = ' ';
      for (;;) {
  	if (inbufleft) {
  	    inbufleft--;
--- 179,185 ----
  ingetc(void)
  {
      if (lexstop)
! 	return ' ';
      for (;;) {
  	if (inbufleft) {
  	    inbufleft--;
***************
*** 202,212 ****
  	 */
  	if (strin || errflag) {
  	    lexstop = 1;
! 	    return lastc = ' ';
  	}
  	/* As a last resort, get some more input */
  	if (inputline())
! 	    return lastc = ' ';
      }
  }
  
--- 202,212 ----
  	 */
  	if (strin || errflag) {
  	    lexstop = 1;
! 	    return ' ';
  	}
  	/* As a last resort, get some more input */
  	if (inputline())
! 	    return ' ';
      }
  }
  

-- 
Peter Stephenson <pws@xxxxxxxxxxxxxxxxx>       Tel: +39 50 844536
WWW:  http://www.ifh.de/~pws/
Gruppo Teorico, Dipartimento di Fisica
Piazza Torricelli 2, 56100 Pisa, Italy



Messages sorted by: Reverse Date, Date, Thread, Author