8d88e64
From d453a572efce146f3dd6a4884b1d2d3384fd7a4a Mon Sep 17 00:00:00 2001
8d88e64
From: christos <christos>
8d88e64
Date: Wed, 9 Dec 2015 15:06:19 +0000
8d88e64
Subject: [PATCH 1/3] - make backeval use its own paraml - introduce initlex()
8d88e64
 and call freelex() before calling lex()
8d88e64
8d88e64
---
8d88e64
 Fixes      |  1 +
8d88e64
 sh.c       |  2 ++
8d88e64
 sh.decls.h |  1 +
8d88e64
 sh.exp.c   |  1 +
8d88e64
 sh.glob.c  | 14 +++++++++-----
8d88e64
 sh.lex.c   |  7 +++++++
8d88e64
 6 files changed, 21 insertions(+), 5 deletions(-)
8d88e64
8d88e64
diff --git a/Fixes b/Fixes
8d88e64
index 689aeb0..1fe33e8 100644
8d88e64
--- a/Fixes
8d88e64
+++ b/Fixes
8d88e64
@@ -1,3 +1,4 @@
8d88e64
+  9. Fix memory leak for paraml
8d88e64
   8. Add notempty and ask values for the noclobber setting (Martin Tournoij)
8d88e64
   7. more correct $wordchars for vimode (Luke Mewburn)
8d88e64
   6. expose VImode in $vimode (Luke Mewburn)
8d88e64
diff --git a/sh.c b/sh.c
8d88e64
index 8d219d3..c6a0bfe 100644
8d88e64
--- a/sh.c
8d88e64
+++ b/sh.c
8d88e64
@@ -274,6 +274,7 @@ main(int argc, char **argv)
8d88e64
 #endif
8d88e64
 
8d88e64
     nlsinit();
8d88e64
+    initlex(&paraml);
8d88e64
 
8d88e64
 #ifdef MALLOC_TRACE
8d88e64
     mal_setstatsfile(fdopen(dmove(xopen("/tmp/tcsh.trace", 
8d88e64
@@ -2049,6 +2050,7 @@ process(int catch)
8d88e64
 	 */
8d88e64
 	if (setintr)
8d88e64
 	    pintr_push_enable(&old_pintr_disabled);
8d88e64
+	freelex(&paraml);
8d88e64
 	hadhist = lex(&paraml);
8d88e64
 	if (setintr)
8d88e64
 	    cleanup_until(&old_pintr_disabled);
8d88e64
diff --git a/sh.decls.h b/sh.decls.h
8d88e64
index 671a0b7..09ac3ab 100644
8d88e64
--- a/sh.decls.h
8d88e64
+++ b/sh.decls.h
8d88e64
@@ -239,6 +239,7 @@ extern	void		  btell		(struct Ain *);
8d88e64
 extern	void		  btoeof	(void);
8d88e64
 extern	void		  copylex	(struct wordent *, struct wordent *);
8d88e64
 extern	Char		 *domod		(Char *, Char);
8d88e64
+extern	void		  initlex	(struct wordent *);
8d88e64
 extern	void		  freelex	(struct wordent *);
8d88e64
 extern	int		  lex		(struct wordent *);
8d88e64
 extern	void		  lex_cleanup	(void *);
8d88e64
diff --git a/sh.exp.c b/sh.exp.c
8d88e64
index 7e75a45..cf7f69b 100644
8d88e64
--- a/sh.exp.c
8d88e64
+++ b/sh.exp.c
8d88e64
@@ -968,6 +968,7 @@ evalav(Char **v)
8d88e64
     }
8d88e64
     hp->prev = wdp;
8d88e64
     cleanup_push(&paraml1, lex_cleanup);
8d88e64
+    initlex(&paraml1);
8d88e64
     alias(&paraml1);
8d88e64
     t = syntax(paraml1.next, &paraml1, 0);
8d88e64
     cleanup_push(t, syntax_cleanup);
8d88e64
diff --git a/sh.glob.c b/sh.glob.c
8d88e64
index 7d008aa..dce0217 100644
8d88e64
--- a/sh.glob.c
8d88e64
+++ b/sh.glob.c
8d88e64
@@ -765,6 +765,9 @@ backeval(struct blk_buf *bb, struct Strbuf *word, Char *cp, int literal)
8d88e64
 	omark = cleanup_push_mark();
8d88e64
 	getexit(osetexit);
8d88e64
 	for (;;) {
8d88e64
+	    struct wordent paraml1;
8d88e64
+	    initlex(&paraml1);
8d88e64
+
8d88e64
 	    (void) setexit();
8d88e64
 	    justpr = 0;
8d88e64
 	    
8d88e64
@@ -780,12 +783,13 @@ backeval(struct blk_buf *bb, struct Strbuf *word, Char *cp, int literal)
8d88e64
 		seterr = NULL;
8d88e64
 	    }
8d88e64
 
8d88e64
-	    (void) lex(&paraml);
8d88e64
-	    cleanup_push(&paraml, lex_cleanup);
8d88e64
+	    freelex(&paraml1);
8d88e64
+	    (void) lex(&paraml1);
8d88e64
+	    cleanup_push(&paraml1, lex_cleanup);
8d88e64
 	    if (seterr)
8d88e64
 		stderror(ERR_OLD);
8d88e64
-	    alias(&paraml);
8d88e64
-	    t = syntax(paraml.next, &paraml, 0);
8d88e64
+	    alias(&paraml1);
8d88e64
+	    t = syntax(paraml1.next, &paraml1, 0);
8d88e64
 	    cleanup_push(t, syntax_cleanup);
8d88e64
 	    /* The F_BACKQ flag must set so the job output is correct if
8d88e64
 	     * printexitvalue is set.  If it's not set, the job output
8d88e64
@@ -805,7 +809,7 @@ backeval(struct blk_buf *bb, struct Strbuf *word, Char *cp, int literal)
8d88e64
 #endif
8d88e64
 	    execute(t, -1, NULL, NULL, TRUE);
8d88e64
 
8d88e64
-	    cleanup_until(&paraml);
8d88e64
+	    cleanup_until(&paraml1);
8d88e64
 	}
8d88e64
     }
8d88e64
     cleanup_until(&pvec[1]);
8d88e64
diff --git a/sh.lex.c b/sh.lex.c
8d88e64
index 08520dd..a64c812 100644
8d88e64
--- a/sh.lex.c
8d88e64
+++ b/sh.lex.c
8d88e64
@@ -258,6 +258,13 @@ copylex(struct wordent *hp, struct wordent *fp)
8d88e64
 }
8d88e64
 
8d88e64
 void
8d88e64
+initlex(struct wordent *vp)
8d88e64
+{
8d88e64
+	vp->prev = vp;
8d88e64
+	vp->next = vp;
8d88e64
+}
8d88e64
+
8d88e64
+void
8d88e64
 freelex(struct wordent *vp)
8d88e64
 {
8d88e64
     struct wordent *fp;
8d88e64
-- 
8d88e64
2.5.5
8d88e64
8d88e64
From 5298f499085f3863b37302290eb7f794acdade6b Mon Sep 17 00:00:00 2001
8d88e64
From: christos <christos>
8d88e64
Date: Wed, 9 Dec 2015 17:17:43 +0000
8d88e64
Subject: [PATCH 2/3] Call initlex() sooner, instead of hand-crafted code.
8d88e64
8d88e64
---
8d88e64
 sh.exp.c | 4 +---
8d88e64
 1 file changed, 1 insertion(+), 3 deletions(-)
8d88e64
8d88e64
diff --git a/sh.exp.c b/sh.exp.c
8d88e64
index cf7f69b..8838fce 100644
8d88e64
--- a/sh.exp.c
8d88e64
+++ b/sh.exp.c
8d88e64
@@ -955,8 +955,7 @@ evalav(Char **v)
8d88e64
     struct wordent *wdp = hp;
8d88e64
 
8d88e64
     setcopy(STRstatus, STR0, VAR_READWRITE);
8d88e64
-    hp->prev = hp->next = hp;
8d88e64
-    hp->word = STRNULL;
8d88e64
+    initlex(hp);
8d88e64
     while (*v) {
8d88e64
 	struct wordent *new = xcalloc(1, sizeof *wdp);
8d88e64
 
8d88e64
@@ -968,7 +967,6 @@ evalav(Char **v)
8d88e64
     }
8d88e64
     hp->prev = wdp;
8d88e64
     cleanup_push(&paraml1, lex_cleanup);
8d88e64
-    initlex(&paraml1);
8d88e64
     alias(&paraml1);
8d88e64
     t = syntax(paraml1.next, &paraml1, 0);
8d88e64
     cleanup_push(t, syntax_cleanup);
8d88e64
-- 
8d88e64
2.5.5
8d88e64
8d88e64
8d88e64
From aaf05158924cde1f78d31c67671c38b9f2e8e850 Mon Sep 17 00:00:00 2001
8d88e64
From: christos <christos>
8d88e64
Date: Wed, 9 Dec 2015 17:17:55 +0000
8d88e64
Subject: [PATCH 3/3] Initialize word in initlex()
8d88e64
8d88e64
---
8d88e64
 sh.lex.c | 1 +
8d88e64
 1 file changed, 1 insertion(+)
8d88e64
8d88e64
diff --git a/sh.lex.c b/sh.lex.c
8d88e64
index a64c812..8a6d1b0 100644
8d88e64
--- a/sh.lex.c
8d88e64
+++ b/sh.lex.c
8d88e64
@@ -260,6 +260,7 @@ copylex(struct wordent *hp, struct wordent *fp)
8d88e64
 void
8d88e64
 initlex(struct wordent *vp)
8d88e64
 {
8d88e64
+	vp->word = STRNULL;
8d88e64
 	vp->prev = vp;
8d88e64
 	vp->next = vp;
8d88e64
 }
8d88e64
-- 
8d88e64
2.5.5
8d88e64