Accepting request 212971 from shells
- Update to version 5.0.5 * Fixes a couple of regression in 5.0.4 - Remove zsh-pipefix.patch, merged upstream OBS-URL: https://build.opensuse.org/request/show/212971 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/zsh?expand=0&rev=54
This commit is contained in:
commit
f5c5c4d40c
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e96fe7c9440adb4169fd4b2f0d9a5c8bdf1498423bc2efd2c3205ef7c1de4ee8
|
||||
size 3093541
|
3
zsh-5.0.5.tar.bz2
Normal file
3
zsh-5.0.5.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6624d2fb6c8fa4e044d2b009f86ed1617fe8583c83acfceba7ec82826cfa8eaf
|
||||
size 3104375
|
@ -1,159 +0,0 @@
|
||||
diff --git a/Src/exec.c b/Src/exec.c
|
||||
index dccdc2b..4480033 100644
|
||||
--- a/Src/exec.c
|
||||
+++ b/Src/exec.c
|
||||
@@ -1691,6 +1691,7 @@ execpline2(Estate state, wordcode pcode,
|
||||
execcmd(state, input, output, how, last1 ? 1 : 2);
|
||||
else {
|
||||
int old_list_pipe = list_pipe;
|
||||
+ int subsh_close = -1;
|
||||
Wordcode next = state->pc + (*state->pc), pc;
|
||||
wordcode code;
|
||||
|
||||
@@ -1738,6 +1739,7 @@ execpline2(Estate state, wordcode pcode,
|
||||
} else {
|
||||
/* otherwise just do the pipeline normally. */
|
||||
addfilelist(NULL, pipes[0]);
|
||||
+ subsh_close = pipes[0];
|
||||
execcmd(state, input, pipes[1], how, 0);
|
||||
}
|
||||
zclose(pipes[1]);
|
||||
@@ -1750,6 +1752,8 @@ execpline2(Estate state, wordcode pcode,
|
||||
execpline2(state, *state->pc++, how, pipes[0], output, last1);
|
||||
list_pipe = old_list_pipe;
|
||||
cmdpop();
|
||||
+ if (subsh_close != pipes[0])
|
||||
+ zclose(pipes[0]);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/Test/A05execution.ztst b/Test/A05execution.ztst
|
||||
index c8320a1..61d24fe 100644
|
||||
--- a/Test/A05execution.ztst
|
||||
+++ b/Test/A05execution.ztst
|
||||
@@ -202,3 +202,15 @@ F:the bug is still there or it reappeared. See workers-29973 for details.
|
||||
0:Check $pipestatus with a known difficult case
|
||||
>1 0 1 0 0
|
||||
F:This similar test was triggering a reproducible failure with pipestatus.
|
||||
+
|
||||
+ { unsetopt MONITOR } 2>/dev/null
|
||||
+ coproc { read -Et 5 || kill -INT $$ }
|
||||
+ print -u $ZTST_fd 'This test takes 5 seconds to fail...'
|
||||
+ { printf "%d\n" {1..20000} } | ( read -E )
|
||||
+ print -p done
|
||||
+ read -Ep
|
||||
+0:Bug regression: piping a shell construct to an external process may hang
|
||||
+>1
|
||||
+>done
|
||||
+F:This test checks for a file descriptor leak that could cause the left
|
||||
+F:side of a pipe to block on write after the right side has exited
|
||||
diff --git a/Src/exec.c b/Src/exec.c
|
||||
index 4480033..f16cfd3 100644
|
||||
--- a/Src/exec.c
|
||||
+++ b/Src/exec.c
|
||||
@@ -2389,7 +2389,7 @@ static void
|
||||
execcmd(Estate state, int input, int output, int how, int last1)
|
||||
{
|
||||
HashNode hn = NULL;
|
||||
- LinkList args;
|
||||
+ LinkList args, filelist = NULL;
|
||||
LinkNode node;
|
||||
Redir fn;
|
||||
struct multio *mfds[10];
|
||||
@@ -2911,6 +2911,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
||||
flags |= ESUB_KEEPTRAP;
|
||||
if (type == WC_SUBSH && !(how & Z_ASYNC))
|
||||
flags |= ESUB_JOB_CONTROL;
|
||||
+ filelist = jobtab[thisjob].filelist;
|
||||
entersubsh(flags);
|
||||
close(synch[1]);
|
||||
forked = 1;
|
||||
@@ -3264,6 +3265,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
||||
|
||||
if (is_shfunc) {
|
||||
/* It's a shell function */
|
||||
+ pipecleanfilelist(filelist);
|
||||
execshfunc((Shfunc) hn, args);
|
||||
} else {
|
||||
/* It's a builtin */
|
||||
@@ -3342,6 +3344,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
||||
DPUTS(varspc,
|
||||
"BUG: assignment before complex command");
|
||||
list_pipe = 0;
|
||||
+ pipecleanfilelist(filelist);
|
||||
/* If we're forked (and we should be), no need to return */
|
||||
DPUTS(last1 != 1 && !forked, "BUG: not exiting?");
|
||||
DPUTS(type != WC_SUBSH, "Not sure what we're doing.");
|
||||
diff --git a/Src/jobs.c b/Src/jobs.c
|
||||
index 371b8eb..a321172 100644
|
||||
--- a/Src/jobs.c
|
||||
+++ b/Src/jobs.c
|
||||
@@ -1173,6 +1173,30 @@ addfilelist(const char *name, int fd)
|
||||
zaddlinknode(ll, jf);
|
||||
}
|
||||
|
||||
+/* Clean up pipes no longer needed associated with a job */
|
||||
+
|
||||
+/**/
|
||||
+void
|
||||
+pipecleanfilelist(LinkList filelist)
|
||||
+{
|
||||
+ LinkNode node;
|
||||
+
|
||||
+ if (!filelist)
|
||||
+ return;
|
||||
+ node = firstnode(filelist);
|
||||
+ while (node) {
|
||||
+ Jobfile jf = (Jobfile)getdata(node);
|
||||
+ if (jf->is_fd) {
|
||||
+ LinkNode next = nextnode(node);
|
||||
+ zclose(jf->u.fd);
|
||||
+ (void)remnode(filelist, node);
|
||||
+ zfree(jf, sizeof(*jf));
|
||||
+ node = next;
|
||||
+ } else
|
||||
+ incnode(node);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* Finished with list of files for a job */
|
||||
|
||||
/**/
|
||||
@@ -1415,19 +1439,7 @@ zwaitjob(int job, int wait_cmd)
|
||||
* we can't deadlock on the fact that those still exist, so
|
||||
* that's not a problem.
|
||||
*/
|
||||
- LinkNode node = firstnode(jn->filelist);
|
||||
- while (node) {
|
||||
- Jobfile jf = (Jobfile)getdata(node);
|
||||
- if (jf->is_fd) {
|
||||
- LinkNode next = nextnode(node);
|
||||
- (void)remnode(jn->filelist, node);
|
||||
- zclose(jf->u.fd);
|
||||
- zfree(jf, sizeof(*jf));
|
||||
- node = next;
|
||||
- } else {
|
||||
- incnode(node);
|
||||
- }
|
||||
- }
|
||||
+ pipecleanfilelist(jn->filelist);
|
||||
}
|
||||
while (!errflag && jn->stat &&
|
||||
!(jn->stat & STAT_DONE) &&
|
||||
diff --git a/Test/A05execution.ztst b/Test/A05execution.ztst
|
||||
index 61d24fe..6abfd8b 100644
|
||||
--- a/Test/A05execution.ztst
|
||||
+++ b/Test/A05execution.ztst
|
||||
@@ -207,10 +207,12 @@ F:This similar test was triggering a reproducible failure with pipestatus.
|
||||
coproc { read -Et 5 || kill -INT $$ }
|
||||
print -u $ZTST_fd 'This test takes 5 seconds to fail...'
|
||||
{ printf "%d\n" {1..20000} } | ( read -E )
|
||||
+ hang(){ printf "%d\n" {2..20000} | cat }; hang | ( read -E )
|
||||
print -p done
|
||||
read -Ep
|
||||
0:Bug regression: piping a shell construct to an external process may hang
|
||||
>1
|
||||
+>2
|
||||
>done
|
||||
F:This test checks for a file descriptor leak that could cause the left
|
||||
F:side of a pipe to block on write after the right side has exited
|
@ -1,3 +1,10 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Jan 7 08:40:21 UTC 2014 - idonmez@suse.com
|
||||
|
||||
- Update to version 5.0.5
|
||||
* Fixes a couple of regression in 5.0.4
|
||||
- Remove zsh-pipefix.patch, merged upstream
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Dec 25 12:25:03 UTC 2013 - idonmez@suse.com
|
||||
|
||||
|
6
zsh.spec
6
zsh.spec
@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package zsh
|
||||
#
|
||||
# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
@ -17,7 +17,7 @@
|
||||
|
||||
|
||||
Name: zsh
|
||||
Version: 5.0.4
|
||||
Version: 5.0.5
|
||||
Release: 0
|
||||
Summary: Shell with comprehensive completion
|
||||
License: MIT
|
||||
@ -37,7 +37,6 @@ Source16: dotzshrc.rh
|
||||
Source17: zshprompt.pl
|
||||
%endif
|
||||
Patch1: trim-unneeded-completions.patch
|
||||
Patch2: zsh-pipefix.patch
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
%if 0%{?suse_version}
|
||||
Requires(pre): %{install_info_prereq}
|
||||
@ -96,7 +95,6 @@ This package contains the Zsh manual in html format.
|
||||
%if 0%{?suse_version}
|
||||
%patch1 -p1
|
||||
%endif
|
||||
%patch2 -p1
|
||||
|
||||
# Remove executable bit
|
||||
chmod 0644 Etc/changelog2html.pl
|
||||
|
Loading…
Reference in New Issue
Block a user