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

Re: zsh 4.3.4 released



"Mikael Magnusson" wrote:
> (gdb) print tindent
> $12 = -2

Thanks.  This is the problem; tindent should never be less than zero.
I'm not sure why I'm not seeing it; it might suggest the structure with
the function in it is already corrupt at the point where you run
"which".

The following patch should stop the crash (so it's probably worth
having) and report at the point where it first becomes confused, though
it doesn't address the underlying problem.

Is it possibly you have old wordcode for the dot file that might define
svmode?  (Obviously the shell should be robust even if this is the case;
since the wordcode has a version stamp this shouldn't happen with a
released version of the shell.)

Index: Src/text.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/text.c,v
retrieving revision 1.18
diff -u -r1.18 text.c
--- Src/text.c	19 Jan 2007 21:36:03 -0000	1.18
+++ Src/text.c	23 Apr 2007 14:50:00 -0000
@@ -33,6 +33,14 @@
 static char *tptr, *tbuf, *tlim;
 static int tsiz, tindent, tnewlins, tjob;
 
+static void
+dec_tindent(void)
+{
+    DPUTS(tindent == 0, "attempting to decrement tindent below zero");
+    if (tindent > 0)
+	tindent--;
+}
+
 /* add a character to the text buffer */
 
 /**/
@@ -354,7 +362,7 @@
 		state->pc++;
 	    } else {
 		state->pc = s->u._subsh.end;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr(")");
 		stack = 1;
@@ -371,7 +379,7 @@
 		state->pc++;
 	    } else {
 		state->pc = s->u._subsh.end;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("}");
 		stack = 1;
@@ -387,7 +395,7 @@
 		} else
 		    stack = 1;
 	    } else {
-		tindent--;
+		dec_tindent();
 		stack = 1;
 	    }
 	    break;
@@ -414,7 +422,7 @@
 	    } else {
 		state->strs = s->u._funcdef.strs;
 		state->pc = s->u._funcdef.end;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("}");
 		stack = 1;
@@ -444,7 +452,7 @@
 		taddnl();
 		tpush(code, 1);
 	    } else {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("done");
 		stack = 1;
@@ -462,7 +470,7 @@
 		taddnl();
 		tpush(code, 1);
 	    } else {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("done");
 		stack = 1;
@@ -475,14 +483,14 @@
 		tindent++;
 		tpush(code, 0);
 	    } else if (!s->pop) {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("do");
 		tindent++;
 		taddnl();
 		s->pop = 1;
 	    } else {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("done");
 		stack = 1;
@@ -498,7 +506,7 @@
 		taddnl();
 		tpush(code, 1);
 	    } else {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("done");
 		stack = 1;
@@ -536,7 +544,7 @@
 		    n->pop = (state->pc - 2 + WC_CASE_SKIP(code) >= end);
 		}
 	    } else if (state->pc < s->u._case.end) {
-		tindent--;
+		dec_tindent();
 		switch (WC_CASE_TYPE(code)) {
 		case WC_CASE_OR:
 		    taddstr(" ;;");
@@ -564,7 +572,7 @@
 		s->pop = ((state->pc - 2 + WC_CASE_SKIP(code)) >=
 			  s->u._case.end);
 	    } else {
-		tindent--;
+		dec_tindent();
 		switch (WC_CASE_TYPE(code)) {
 		case WC_CASE_OR:
 		    taddstr(" ;;");
@@ -578,7 +586,7 @@
 		    taddstr(";|");
 		    break;
 		}
-		tindent--;
+		dec_tindent();
 		if (tnewlins)
 		    taddnl();
 		else
@@ -601,14 +609,14 @@
 	    } else if (s->pop) {
 		stack = 1;
 	    } else if (s->u._if.cond) {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("then");
 		tindent++;
 		taddnl();
 		s->u._if.cond = 0;
 	    } else if (state->pc < s->u._if.end) {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		code = *state->pc++;
 		if (WC_IF_TYPE(code) == WC_IF_ELIF) {
@@ -622,7 +630,7 @@
 		}
 	    } else {
 		s->pop = 1;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("fi");
 		stack = 1;
@@ -760,14 +768,14 @@
 		n->u._subsh.end = state->pc + WC_CURSH_SKIP(state->pc[-1]);
 	    } else if (!s->pop) {
 		state->pc = s->u._subsh.end;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("} always {");
 		tindent++;
 		taddnl();
 		s->pop = 1;
 	    } else {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("}");
 		stack = 1;


-- 
Peter Stephenson <pws@xxxxxxx>                  Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070


To access the latest news from CSR copy this link into a web browser:  http://www.csr.com/email_sig.php

To get further information regarding CSR, please visit our Investor Relations page at http://ir.csr.com/csr/about/overview



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