|
|
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(¶ml);
|
|
|
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(¶ml);
|
|
|
8d88e64 |
hadhist = lex(¶ml);
|
|
|
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(¶ml1, lex_cleanup);
|
|
|
8d88e64 |
+ initlex(¶ml1);
|
|
|
8d88e64 |
alias(¶ml1);
|
|
|
8d88e64 |
t = syntax(paraml1.next, ¶ml1, 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(¶ml1);
|
|
|
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(¶ml);
|
|
|
8d88e64 |
- cleanup_push(¶ml, lex_cleanup);
|
|
|
8d88e64 |
+ freelex(¶ml1);
|
|
|
8d88e64 |
+ (void) lex(¶ml1);
|
|
|
8d88e64 |
+ cleanup_push(¶ml1, lex_cleanup);
|
|
|
8d88e64 |
if (seterr)
|
|
|
8d88e64 |
stderror(ERR_OLD);
|
|
|
8d88e64 |
- alias(¶ml);
|
|
|
8d88e64 |
- t = syntax(paraml.next, ¶ml, 0);
|
|
|
8d88e64 |
+ alias(¶ml1);
|
|
|
8d88e64 |
+ t = syntax(paraml1.next, ¶ml1, 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(¶ml);
|
|
|
8d88e64 |
+ cleanup_until(¶ml1);
|
|
|
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(¶ml1, lex_cleanup);
|
|
|
8d88e64 |
- initlex(¶ml1);
|
|
|
8d88e64 |
alias(¶ml1);
|
|
|
8d88e64 |
t = syntax(paraml1.next, ¶ml1, 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 |
|