summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Src/text.c42
2 files changed, 30 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 66acb4cf5..5a52cff90 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,10 @@
 2007-04-23  Peter Stephenson  <pws@csr.com>
 
-	* Christoph Bauer: 23309ish: define _INCLUDE__STDC_A1_SOURCE
+	* 23308: Src/text.c: stop tindent becoming negative, which
+	causes infinite use of memory; add debug test to see where
+	it would become negative.
+
+	* Christoph Bauer: 23310ish: define _INCLUDE__STDC_A1_SOURCE
 	for HP/UX.
 
 2007-04-21  Clint Adams  <clint@zsh.org>
diff --git a/Src/text.c b/Src/text.c
index 181fea083..03ce59cf7 100644
--- a/Src/text.c
+++ b/Src/text.c
@@ -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 @@ gettext2(Estate state)
 		state->pc++;
 	    } else {
 		state->pc = s->u._subsh.end;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr(")");
 		stack = 1;
@@ -371,7 +379,7 @@ gettext2(Estate state)
 		state->pc++;
 	    } else {
 		state->pc = s->u._subsh.end;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("}");
 		stack = 1;
@@ -387,7 +395,7 @@ gettext2(Estate state)
 		} else
 		    stack = 1;
 	    } else {
-		tindent--;
+		dec_tindent();
 		stack = 1;
 	    }
 	    break;
@@ -414,7 +422,7 @@ gettext2(Estate state)
 	    } else {
 		state->strs = s->u._funcdef.strs;
 		state->pc = s->u._funcdef.end;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("}");
 		stack = 1;
@@ -444,7 +452,7 @@ gettext2(Estate state)
 		taddnl();
 		tpush(code, 1);
 	    } else {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("done");
 		stack = 1;
@@ -462,7 +470,7 @@ gettext2(Estate state)
 		taddnl();
 		tpush(code, 1);
 	    } else {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("done");
 		stack = 1;
@@ -475,14 +483,14 @@ gettext2(Estate state)
 		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 @@ gettext2(Estate state)
 		taddnl();
 		tpush(code, 1);
 	    } else {
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("done");
 		stack = 1;
@@ -536,7 +544,7 @@ gettext2(Estate state)
 		    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 @@ gettext2(Estate state)
 		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 @@ gettext2(Estate state)
 		    taddstr(";|");
 		    break;
 		}
-		tindent--;
+		dec_tindent();
 		if (tnewlins)
 		    taddnl();
 		else
@@ -601,14 +609,14 @@ gettext2(Estate state)
 	    } 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 @@ gettext2(Estate state)
 		}
 	    } else {
 		s->pop = 1;
-		tindent--;
+		dec_tindent();
 		taddnl();
 		taddstr("fi");
 		stack = 1;
@@ -760,14 +768,14 @@ gettext2(Estate state)
 		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;