From a361a5ac293c9422f953c3d59e53f07e195740d3 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Thu, 6 Nov 2014 10:50:20 -0800 Subject: [PATCH 1/5] 33614 (based on RedHat BZ-978613): signal safety when updating global state in execshfunc() Upstream-commit: 7abd611a2396bad9d93d18681a2c59cb1ea0e158 Signed-off-by: Kamil Dudka --- Src/exec.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Src/exec.c b/Src/exec.c index 28da5c3..60ee4b8 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -4392,6 +4392,7 @@ execshfunc(Shfunc shf, LinkList args) fputc('\n', xtrerr); fflush(xtrerr); } + queue_signals(); ocs = cmdstack; ocsp = cmdsp; cmdstack = (unsigned char *) zalloc(CMDSTACKSZ); @@ -4399,7 +4400,11 @@ execshfunc(Shfunc shf, LinkList args) if ((osfc = sfcontext) == SFC_NONE) sfcontext = SFC_DIRECT; xtrerr = stderr; + unqueue_signals(); + doshfunc(shf, args, 0); + + queue_signals(); sfcontext = osfc; free(cmdstack); cmdstack = ocs; @@ -4407,6 +4412,7 @@ execshfunc(Shfunc shf, LinkList args) if (!list_pipe) deletefilelist(last_file_list, 0); + unqueue_signals(); } /* Function to execute the special type of command that represents an * -- 2.4.0 From 236bb914d24e6588d12c3bf66bd06c6416832b8f Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Fri, 20 Feb 2015 18:45:36 -0800 Subject: [PATCH 2/5] 34590: queue_signals() around more scopes that manipulate global state Upstream-commit: a4ff8e69570cbdb8e7d5bf1d5cc4000ffe63e15e Signed-off-by: Kamil Dudka --- 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 60ee4b8..83b9083 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -2280,6 +2280,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; @@ -2297,6 +2298,7 @@ setunderscore(char *str) *zunderscore = '\0'; underscoreused = 1; } + unqueue_signals(); } /* These describe the type of expansions that need to be done on the words @@ -5056,7 +5058,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.4.0 From 2e60901b1733929619cccce6cd66898520fd3015 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Thu, 26 Sep 2013 21:27:27 -0700 Subject: [PATCH 3/5] 31772: queue_signals() to prevent re-entry into endparamscope(). Upstream-commit: ae92cadc75fbf7e8ec356cf09d3f73db9868424b Signed-off-by: Kamil Dudka --- Src/params.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Src/params.c b/Src/params.c index 8649178..d6711e4 100644 --- a/Src/params.c +++ b/Src/params.c @@ -4667,10 +4667,12 @@ startparamscope(void) mod_export void endparamscope(void) { + queue_signals(); locallevel--; /* This pops anything from a higher locallevel */ saveandpophiststack(0, HFILE_USE_OPTIONS); scanhashtable(paramtab, 0, 0, 0, scanendscope, 0); + unqueue_signals(); } /**/ -- 2.4.1 From 39dea2e735ae277c9e1238e5d17f3fbd0a08bb6f Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Thu, 17 Oct 2013 07:35:05 -0700 Subject: [PATCH 4/5] 31832: make execrestore() more signal-safe. Upstream-commit: 978b5bcc8d21fce58369f810ef73bdbc434f33e7 Signed-off-by: Kamil Dudka --- Src/exec.c | 52 ++++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/Src/exec.c b/Src/exec.c index 83b9083..2f94052 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -5087,30 +5087,34 @@ execsave(void) void execrestore(void) { - struct execstack *en; + struct execstack *en = exstack; DPUTS(!exstack, "BUG: execrestore() without execsave()"); - list_pipe_pid = exstack->list_pipe_pid; - nowait = exstack->nowait; - pline_level = exstack->pline_level; - list_pipe_child = exstack->list_pipe_child; - list_pipe_job = exstack->list_pipe_job; - strcpy(list_pipe_text, exstack->list_pipe_text); - lastval = exstack->lastval; - noeval = exstack->noeval; - badcshglob = exstack->badcshglob; - cmdoutpid = exstack->cmdoutpid; - cmdoutval = exstack->cmdoutval; - use_cmdoutval = exstack->use_cmdoutval; - trap_return = exstack->trap_return; - trap_state = exstack->trap_state; - trapisfunc = exstack->trapisfunc; - traplocallevel = exstack->traplocallevel; - noerrs = exstack->noerrs; - subsh_close = exstack->subsh_close; - setunderscore(exstack->underscore); - zsfree(exstack->underscore); - en = exstack->next; - free(exstack); - exstack = en; + + queue_signals(); + exstack = exstack->next; + + list_pipe_pid = en->list_pipe_pid; + nowait = en->nowait; + pline_level = en->pline_level; + list_pipe_child = en->list_pipe_child; + list_pipe_job = en->list_pipe_job; + strcpy(list_pipe_text, en->list_pipe_text); + lastval = en->lastval; + noeval = en->noeval; + badcshglob = en->badcshglob; + cmdoutpid = en->cmdoutpid; + cmdoutval = en->cmdoutval; + use_cmdoutval = en->use_cmdoutval; + trap_return = en->trap_return; + trap_state = en->trap_state; + trapisfunc = en->trapisfunc; + traplocallevel = en->traplocallevel; + noerrs = en->noerrs; + subsh_close = en->subsh_close; + setunderscore(en->underscore); + zsfree(en->underscore); + free(en); + + unqueue_signals(); } -- 2.4.1 From 15ac5a43bb483ed753655c7985fbdb056745303b Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Tue, 30 Sep 2014 20:34:58 -0700 Subject: [PATCH 5/5] 33298: make lexrestore() more signal-safe Upstream-commit: 8727049674b1f39a8926c02dc74e9f19bbd70289 Signed-off-by: Kamil Dudka --- Src/lex.c | 110 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/Src/lex.c b/Src/lex.c index ac87e5e..82bf848 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -323,66 +323,70 @@ lexsave(void) mod_export void lexrestore(void) { - struct lexstack *ln; + struct lexstack *ln = lstack; DPUTS(!lstack, "BUG: lexrestore() without lexsave()"); - incmdpos = lstack->incmdpos; - incond = lstack->incond; - incasepat = lstack->incasepat; - dbparens = lstack->dbparens; - isfirstln = lstack->isfirstln; - isfirstch = lstack->isfirstch; - histactive = lstack->histactive; - histdone = lstack->histdone; - lexflags = lstack->lexflags; - stophist = lstack->stophist; - chline = lstack->hline; - hptr = lstack->hptr; + + queue_signals(); + lstack = lstack->next; + + if (!lstack) { + /* Back to top level: don't need special ZLE value */ + DPUTS(ln->hline != zle_chline, "BUG: Ouch, wrong chline for ZLE"); + zle_chline = NULL; + } + + incmdpos = ln->incmdpos; + incond = ln->incond; + incasepat = ln->incasepat; + dbparens = ln->dbparens; + isfirstln = ln->isfirstln; + isfirstch = ln->isfirstch; + histactive = ln->histactive; + histdone = ln->histdone; + lexflags = ln->lexflags; + stophist = ln->stophist; + chline = ln->hline; + hptr = ln->hptr; if (cmdstack) - free(cmdstack); - cmdstack = lstack->cstack; - cmdsp = lstack->csp; - tok = lstack->tok; - isnewlin = lstack->isnewlin; - tokstr = lstack->tokstr; - zshlextext = lstack->zshlextext; - bptr = lstack->bptr; - bsiz = lstack->bsiz; - len = lstack->len; - chwords = lstack->chwords; - chwordlen = lstack->chwordlen; - chwordpos = lstack->chwordpos; - hwgetword = lstack->hwgetword; - lexstop = lstack->lexstop; - hdocs = lstack->hdocs; - hgetc = lstack->hgetc; - hungetc = lstack->hungetc; - hwaddc = lstack->hwaddc; - hwbegin = lstack->hwbegin; - hwend = lstack->hwend; - addtoline = lstack->addtoline; + zfree(cmdstack, CMDSTACKSZ); + cmdstack = ln->cstack; + cmdsp = ln->csp; + tok = ln->tok; + isnewlin = ln->isnewlin; + tokstr = ln->tokstr; + zshlextext = ln->zshlextext; + bptr = ln->bptr; + bsiz = ln->bsiz; + len = ln->len; + chwords = ln->chwords; + chwordlen = ln->chwordlen; + chwordpos = ln->chwordpos; + hwgetword = ln->hwgetword; + lexstop = ln->lexstop; + hdocs = ln->hdocs; + hgetc = ln->hgetc; + hungetc = ln->hungetc; + hwaddc = ln->hwaddc; + hwbegin = ln->hwbegin; + hwend = ln->hwend; + addtoline = ln->addtoline; if (ecbuf) zfree(ecbuf, eclen); - eclen = lstack->eclen; - ecused = lstack->ecused; - ecnpats = lstack->ecnpats; - ecbuf = lstack->ecbuf; - ecstrs = lstack->ecstrs; - ecsoffs = lstack->ecsoffs; - ecssub = lstack->ecssub; - ecnfunc = lstack->ecnfunc; - hlinesz = lstack->hlinesz; - toklineno = lstack->toklineno; + eclen = ln->eclen; + ecused = ln->ecused; + ecnpats = ln->ecnpats; + ecbuf = ln->ecbuf; + ecstrs = ln->ecstrs; + ecsoffs = ln->ecsoffs; + ecssub = ln->ecssub; + ecnfunc = ln->ecnfunc; + hlinesz = ln->hlinesz; + toklineno = ln->toklineno; errflag = 0; + free(ln); - ln = lstack->next; - if (!ln) { - /* Back to top level: don't need special ZLE value */ - DPUTS(chline != zle_chline, "BUG: Ouch, wrong chline for ZLE"); - zle_chline = NULL; - } - free(lstack); - lstack = ln; + unqueue_signals(); } /**/ -- 2.4.1