summaryrefslogtreecommitdiff
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;