Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH signal-safe lexrestore() [Re: zsh 5.0.6 hanged in freejob from TRAPCHLD]
- X-seq: zsh-workers 33298
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: PATCH signal-safe lexrestore() [Re: zsh 5.0.6 hanged in freejob from TRAPCHLD]
- Date: Tue, 30 Sep 2014 17:53:38 -0700
- In-reply-to: <CAH+w=7aTw0r4RMwh=eg8jySMRsD-vrde8SuxF=Udek4iNQx8Fw@mail.gmail.com>
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- References: <20140930172125.GA2703@xvii.vinc17.org> <CAH+w=7aTw0r4RMwh=eg8jySMRsD-vrde8SuxF=Udek4iNQx8Fw@mail.gmail.com>
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();
}
/**/
Messages sorted by:
Reverse Date,
Date,
Thread,
Author