From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11466 invoked by alias); 1 Oct 2014 00:53:44 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 33298 Received: (qmail 14616 invoked from network); 1 Oct 2014 00:53:43 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 From: Bart Schaefer Message-id: <140930175338.ZM4339@torch.brasslantern.com> Date: Tue, 30 Sep 2014 17:53:38 -0700 In-reply-to: Comments: In reply to Bart Schaefer "Re: zsh 5.0.6 hanged in freejob from TRAPCHLD" (Sep 30, 4:18pm) References: <20140930172125.GA2703@xvii.vinc17.org> X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: Zsh hackers list Subject: PATCH signal-safe lexrestore() [Re: zsh 5.0.6 hanged in freejob from TRAPCHLD] MIME-version: 1.0 Content-type: text/plain; charset=us-ascii On Sep 30, 4:18pm, Bart Schaefer wrote: } } The stack trace seems to indicate that the problem likely originates in } lexrestore() which calls free() directly (without the signal-safe zfree() } wrapper). } } This resembles the problems in execsave()/execrestore() that I fixed last } October. I'll send a patch later if no one else gets there first. Fix is almost exactly the same, except for field and variable names. 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(); } /**/