about summary refs log tree commit diff
path: root/Src/parse.c
diff options
context:
space:
mode:
authorBart Schaefer <barts@users.sourceforge.net>2001-11-23 19:33:37 +0000
committerBart Schaefer <barts@users.sourceforge.net>2001-11-23 19:33:37 +0000
commit7262933d112df73b191922c08d1ab5b89684d82e (patch)
tree4778af2150f2c7243ffbc3efb7d40868e3463ac6 /Src/parse.c
parentaf8b430e7bd58fac43fbdf2906bd915dae4ab95a (diff)
downloadzsh-7262933d112df73b191922c08d1ab5b89684d82e.tar.gz
zsh-7262933d112df73b191922c08d1ab5b89684d82e.tar.xz
zsh-7262933d112df73b191922c08d1ab5b89684d82e.zip
16249: Clear pending here-documents upon a parse error.
Diffstat (limited to 'Src/parse.c')
-rw-r--r--Src/parse.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/Src/parse.c b/Src/parse.c
index 15a53add1..7da0667a5 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -420,6 +420,18 @@ empty_eprog(Eprog p)
     return (!p || !p->prog || *p->prog == WCB_END());
 }
 
+static void
+clear_hdocs()
+{
+    struct heredocs *p, *n;
+
+    for (p = hdocs; p; p = n) {
+        n = p->next;
+        zfree(p, sizeof(struct heredocs));
+    }
+    hdocs = NULL;
+}
+
 /*
  * event	: ENDINPUT
  *			| SEPER
@@ -435,7 +447,12 @@ parse_event(void)
     aliasspaceflag = 0;
     yylex();
     init_parse();
-    return ((par_event()) ? bld_eprog() : NULL);
+
+    if (!par_event()) {
+        clear_hdocs();
+        return NULL;
+    }
+    return bld_eprog();
 }
 
 /**/
@@ -509,6 +526,7 @@ parse_list(void)
     init_parse();
     par_list(&c);
     if (tok != ENDINPUT) {
+        clear_hdocs();
 	tok = LEXERR;
 	yyerror(0);
 	return NULL;
@@ -522,9 +540,10 @@ parse_cond(void)
 {
     init_parse();
 
-    if (!par_cond())
+    if (!par_cond()) {
+        clear_hdocs();
 	return NULL;
-
+    }
     return bld_eprog();
 }