diff options
author | Axel Beckert <abe@deuxchevaux.org> | 2014-10-01 20:49:21 +0200 |
---|---|---|
committer | Axel Beckert <abe@deuxchevaux.org> | 2014-10-01 20:49:21 +0200 |
commit | 16aa8c8467bcecfa7dfaffd0050caa9b78346b29 (patch) | |
tree | ff65693b2614b4c665826b8e690a5943cdcf0f3e | |
parent | f5dacf9f0a1e3bad02f762e0551f9bf9fafd2f9f (diff) | |
download | zsh-16aa8c8467bcecfa7dfaffd0050caa9b78346b29.tar.gz zsh-16aa8c8467bcecfa7dfaffd0050caa9b78346b29.zip |
Cherry-pick 87270496 from upstream: Fixes hanging in freejob from TRAPCHLD
Mitigates if not fixes: #760061
-rw-r--r-- | debian/patches/cherry-pick-87270496-make-lexrestore-more-signal-safe | 136 | ||||
-rw-r--r-- | debian/patches/series | 1 |
2 files changed, 137 insertions, 0 deletions
diff --git a/debian/patches/cherry-pick-87270496-make-lexrestore-more-signal-safe b/debian/patches/cherry-pick-87270496-make-lexrestore-more-signal-safe new file mode 100644 index 000000000..9574ddfcf --- /dev/null +++ b/debian/patches/cherry-pick-87270496-make-lexrestore-more-signal-safe @@ -0,0 +1,136 @@ +Origin: commit 8727049674b1f39a8926c02dc74e9f19bbd70289 +Author: Barton E. Schaefer <schaefer@zsh.org> +Date: Tue Sep 30 20:34:58 2014 -0700 +Bug: http://www.zsh.org/mla/workers/2014/msg01083.html +Bug-Debian: https://bugs.debian.org/760061 +Description: make lexrestore() more signal-safe + At least mitigates #760061. + +diff --git a/Src/lex.c b/Src/lex.c +index 8e9a49f..1a854f5 100644 +--- a/Src/lex.c ++++ b/Src/lex.c +@@ -325,66 +325,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(); + } + + /**/ diff --git a/debian/patches/series b/debian/patches/series index 6bbc67f99..f9bc353cf 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,3 @@ replace-texi2html-with-makeinfo cherry-pick-4414e54e-prevent-double-locking-with-shared-or-incremental-history +cherry-pick-87270496-make-lexrestore-more-signal-safe |