zsh/zsh-5.0.7-signal-safety.patch

105 lines
2.4 KiB
Diff

From 7c9af538d63b4623b38ef2fa9903e0f0344ffc32 Mon Sep 17 00:00:00 2001
From: "Barton E. Schaefer" <schaefer@zsh.org>
Date: Fri, 20 Feb 2015 18:45:36 -0800
Subject: [PATCH] 34590: queue_signals() around more scopes that manipulate
global state
Upstream-commit: a4ff8e69570cbdb8e7d5bf1d5cc4000ffe63e15e
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
Src/exec.c | 4 +++-
Src/text.c | 15 +++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/Src/exec.c b/Src/exec.c
index 04c8b50..b59eb5e 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -2320,6 +2320,7 @@ addvars(Estate state, Wordcode pc, int addflags)
void
setunderscore(char *str)
{
+ queue_signals();
if (str && *str) {
int l = strlen(str) + 1, nl = (l + 31) & ~31;
@@ -2337,6 +2338,7 @@ setunderscore(char *str)
*zunderscore = '\0';
underscoreused = 1;
}
+ unqueue_signals();
}
/* These describe the type of expansions that need to be done on the words
@@ -5246,7 +5248,7 @@ execsave(void)
{
struct execstack *es;
- es = (struct execstack *) malloc(sizeof(struct execstack));
+ es = (struct execstack *) zalloc(sizeof(struct execstack));
es->list_pipe_pid = list_pipe_pid;
es->nowait = nowait;
es->pline_level = pline_level;
diff --git a/Src/text.c b/Src/text.c
index f55553e..8f8eb34 100644
--- a/Src/text.c
+++ b/Src/text.c
@@ -173,6 +173,8 @@ getpermtext(Eprog prog, Wordcode c, int start_indent)
{
struct estate s;
+ queue_signals();
+
if (!c)
c = prog->prog;
@@ -193,6 +195,9 @@ getpermtext(Eprog prog, Wordcode c, int start_indent)
*tptr = '\0';
freeeprog(prog); /* mark as unused */
untokenize(tbuf);
+
+ unqueue_signals();
+
return tbuf;
}
@@ -206,6 +211,8 @@ getjobtext(Eprog prog, Wordcode c)
struct estate s;
+ queue_signals();
+
if (!c)
c = prog->prog;
@@ -224,6 +231,9 @@ getjobtext(Eprog prog, Wordcode c)
*tptr = '\0';
freeeprog(prog); /* mark as unused */
untokenize(jbuf);
+
+ unqueue_signals();
+
return jbuf;
}
@@ -879,6 +889,9 @@ getredirs(LinkList redirs)
">", ">|", ">>", ">>|", "&>", "&>|", "&>>", "&>>|", "<>", "<",
"<<", "<<-", "<<<", "<&", ">&", NULL /* >&- */, "<", ">"
};
+
+ queue_signals();
+
taddchr(' ');
for (n = firstnode(redirs); n; incnode(n)) {
Redir f = (Redir) getdata(n);
@@ -966,4 +979,6 @@ getredirs(LinkList redirs)
}
}
tptr--;
+
+ unqueue_signals();
}
--
2.1.0