25587: fix a==(stuff) and associated stuff.

This commit is contained in:
Peter Stephenson 2008-09-01 20:18:46 +00:00
parent 2c9138bc21
commit 1f81bdcb47
4 changed files with 28 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2008-09-01 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 25587: Src/exec.c, Src/parse.c, Src/subst.c: foo==(stuff)
was mishandled owing to parse errors; mishandling it caused
a crash because of lack of care on failure of process
substitution; assignments that went through execcmd() failed
to set the status.
2008-09-01 Clint Adams <clint@zsh.org>
* 25585: Completion/Unix/Command/_git: fix git command completion

View File

@ -2220,6 +2220,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
doneps4 = 0;
redir = (wc_code(*state->pc) == WC_REDIR ? ecgetredirs(state) : NULL);
if (wc_code(*state->pc) == WC_ASSIGN) {
cmdoutval = 0;
varspc = state->pc;
while (wc_code((code = *state->pc)) == WC_ASSIGN)
state->pc += (WC_ASSIGN_TYPE(code) == WC_ASSIGN_SCALAR ?
@ -2236,6 +2237,12 @@ execcmd(Estate state, int input, int output, int how, int last1)
* they don't modify their argument strings. */
args = (type == WC_SIMPLE ?
ecgetlist(state, WC_SIMPLE_ARGC(code), EC_DUP, &htok) : NULL);
/*
* If assignment but no command get the status from variable
* assignment.
*/
if (!args && varspc)
lastval = errflag ? errflag : cmdoutval;
for (i = 0; i < 10; i++) {
save[i] = -2;

View File

@ -1567,6 +1567,18 @@ par_simple(int *complex, int nr)
str = p + 1;
} else
equalsplit(tokstr, &str);
for (p = str; *p; p++) {
/*
* We can't treat this as "simple" if it contains
* expansions that require process subsitution, since then
* we need process handling.
*/
if (p[1] == Inpar &&
(*p == Equals || *p == Inang || *p == Outang)) {
*complex = 1;
break;
}
}
ecstr(name);
ecstr(str);
isnull = 0;

View File

@ -66,6 +66,7 @@ prefork(LinkList list, int flags)
else
setdata(node, (void *) getoutputfile(str)); /* =(...) */
if (!getdata(node)) {
setdata(node, dupstring(""));
unqueue_signals();
return;
}