From b84eb4bacc41b95bf60607cf29b258368882b0c2 Mon Sep 17 00:00:00 2001 From: Kamil Dudka Date: Mon, 1 Jun 2015 13:51:46 +0200 Subject: [PATCH] Update to latest upstream release: Zsh 5.0.8 --- .gitignore | 11 +- sources | 2 +- zsh-5.0.7-cd-sigsegv.patch | 87 ------- zsh-5.0.7-close-fd.patch | 97 -------- zsh-5.0.7-heredocs-sigsegv.patch | 28 --- zsh-5.0.7-ksh-syntax-check.patch | 45 ---- zsh-5.0.7-signal-name.patch | 42 ---- zsh-5.0.7-signal-safety.patch | 104 -------- zsh-5.0.7-wait-for-exited.patch | 397 ------------------------------- zsh-serial.patch | 24 +- zsh-test-C02-dev_fd-mock.patch | 14 +- zsh.spec | 48 +--- 12 files changed, 39 insertions(+), 860 deletions(-) delete mode 100644 zsh-5.0.7-cd-sigsegv.patch delete mode 100644 zsh-5.0.7-close-fd.patch delete mode 100644 zsh-5.0.7-heredocs-sigsegv.patch delete mode 100644 zsh-5.0.7-ksh-syntax-check.patch delete mode 100644 zsh-5.0.7-signal-name.patch delete mode 100644 zsh-5.0.7-signal-safety.patch delete mode 100644 zsh-5.0.7-wait-for-exited.patch diff --git a/.gitignore b/.gitignore index 1aaff95..3c2c706 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1 @@ -zsh-4.3.11.tar.bz2 -/zsh-4.3.13.tar.bz2 -/zsh-4.3.14.tar.bz2 -/zsh-4.3.15.tar.bz2 -/zsh-4.3.17.tar.bz2 -/zsh-5.0.0.tar.bz2 -/zsh-5.0.2.tar.bz2 -/zsh-5.0.5.tar.bz2 -/zsh-5.0.6.tar.bz2 -/zsh-5.0.7.tar.bz2 +/zsh-5.*.*.tar.bz2 diff --git a/sources b/sources index b84ab08..dfdab17 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -1cd396ce17952de50b8a89980d617f0a zsh-5.0.7.tar.bz2 +e6759e8dd7b714d624feffd0a73ba0fe zsh-5.0.8.tar.bz2 diff --git a/zsh-5.0.7-cd-sigsegv.patch b/zsh-5.0.7-cd-sigsegv.patch deleted file mode 100644 index f260021..0000000 --- a/zsh-5.0.7-cd-sigsegv.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 19c75aec6843b827fa7ef3f39174090ee7f8ac18 Mon Sep 17 00:00:00 2001 -From: Peter Stephenson -Date: Thu, 22 Jan 2015 20:20:15 +0000 -Subject: [PATCH 1/2] 34331: better handling of NULL in cd. - -Problem was return from symbolic link expander in weird cases -where there file system isn't behaving itself properly. - -Upstream-commit: 12b813b5895cae579e403dafe43878868f27fe0f -Signed-off-by: Kamil Dudka ---- - Src/builtin.c | 8 +++++--- - Src/utils.c | 11 +++++++---- - 2 files changed, 12 insertions(+), 7 deletions(-) - -diff --git a/Src/builtin.c b/Src/builtin.c -index 2118835..489ca23 100644 ---- a/Src/builtin.c -+++ b/Src/builtin.c -@@ -1156,9 +1156,11 @@ cd_new_pwd(int func, LinkNode dir, int quiet) - zsfree(getlinknode(dirstack)); - - if (chasinglinks) { -- s = new_pwd; -- new_pwd = findpwd(s); -- zsfree(s); -+ s = findpwd(new_pwd); -+ if (s) { -+ zsfree(new_pwd); -+ new_pwd = s; -+ } - } - if (isset(PUSHDIGNOREDUPS)) { - LinkNode n; -diff --git a/Src/utils.c b/Src/utils.c -index e6eb8e6..80396a2 100644 ---- a/Src/utils.c -+++ b/Src/utils.c -@@ -1049,10 +1049,13 @@ getnameddir(char *name) - if ((pw = getpwnam(name))) { - char *dir = isset(CHASELINKS) ? xsymlink(pw->pw_dir) - : ztrdup(pw->pw_dir); -- adduserdir(name, dir, ND_USERNAME, 1); -- str = dupstring(dir); -- zsfree(dir); -- return str; -+ if (dir) { -+ adduserdir(name, dir, ND_USERNAME, 1); -+ str = dupstring(dir); -+ zsfree(dir); -+ return str; -+ } else -+ return ztrdup(pw->pw_dir); - } - } - #endif /* HAVE_GETPWNAM */ --- -2.1.0 - - -From d0777e66d47d0a87f3171962d8137a6cb75d7ade Mon Sep 17 00:00:00 2001 -From: Peter Stephenson -Date: Sun, 25 Jan 2015 18:03:20 +0000 -Subject: [PATCH 2/2] 34383: ztrdup() should be dupstring() in new cd code - -Upstream-commit: ccd3663d4e9a1749450b35cc689359f78a310c04 -Signed-off-by: Kamil Dudka ---- - Src/utils.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Src/utils.c b/Src/utils.c -index 80396a2..ef71210 100644 ---- a/Src/utils.c -+++ b/Src/utils.c -@@ -1055,7 +1055,7 @@ getnameddir(char *name) - zsfree(dir); - return str; - } else -- return ztrdup(pw->pw_dir); -+ return dupstring(pw->pw_dir); - } - } - #endif /* HAVE_GETPWNAM */ --- -2.1.0 - diff --git a/zsh-5.0.7-close-fd.patch b/zsh-5.0.7-close-fd.patch deleted file mode 100644 index f516cec..0000000 --- a/zsh-5.0.7-close-fd.patch +++ /dev/null @@ -1,97 +0,0 @@ -From dc0675a5b8f89b8e504fe1641d57a896674caac5 Mon Sep 17 00:00:00 2001 -From: Peter Stephenson -Date: Tue, 20 Jan 2015 09:29:22 +0000 -Subject: [PATCH 1/2] users/19751: remove error on failure to close file - descriptor by number. - -Keep it when closing file descriptor stored in a variable, i.e. -explicitly opened by the user. - -Upstream-commit: e6d964246700581fe22ea834b2ea12dd301e8c3d -Signed-off-by: Kamil Dudka ---- - Src/exec.c | 7 ++++++- - Test/A04redirect.ztst | 10 ++++++---- - 2 files changed, 12 insertions(+), 5 deletions(-) - -diff --git a/Src/exec.c b/Src/exec.c -index a9c4688..04c8b50 100644 ---- a/Src/exec.c -+++ b/Src/exec.c -@@ -3167,7 +3167,12 @@ execcmd(Estate state, int input, int output, int how, int last1) - } - if (fn->fd1 < 10) - closemn(mfds, fn->fd1, REDIR_CLOSE); -- if (!closed && zclose(fn->fd1) < 0) { -+ /* -+ * Only report failures to close file descriptors -+ * if they're under user control as we don't know -+ * what the previous status of others was. -+ */ -+ if (!closed && zclose(fn->fd1) < 0 && fn->varid) { - zwarn("failed to close file descriptor %d: %e", - fn->fd1, errno); - } -diff --git a/Test/A04redirect.ztst b/Test/A04redirect.ztst -index a39ce46..cb67788 100644 ---- a/Test/A04redirect.ztst -+++ b/Test/A04redirect.ztst -@@ -152,11 +152,13 @@ - >hello - >goodbye - -- ({ exec 3<&- } 2>/dev/null -- exec 3<&- -- read foo <&-) -+ (exec {varid}<&0 -+ exec {varid}<&- -+ print About to close a second time >&2 -+ read {varid}<&-) - 1:'<&-' redirection --*?\(eval\):*: failed to close file descriptor 3:* -+?About to close a second time -+*?\(eval\):*: failed to close file descriptor * - - print foo >&- - 0:'>&-' redirection --- -2.1.0 - - -From 206fdc852a0f28dddce7411eafeb3ab29b0259ed Mon Sep 17 00:00:00 2001 -From: Peter Stephenson -Date: Tue, 20 Jan 2015 11:53:42 +0000 -Subject: [PATCH 2/2] users/19756: test for case of closing fd with no error - message - -Upstream-commit: 638bfa93a009987e57bd7eaa8b2a1c1067a3652a -Signed-off-by: Kamil Dudka ---- - Test/A04redirect.ztst | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/Test/A04redirect.ztst b/Test/A04redirect.ztst -index cb67788..13f1f7c 100644 ---- a/Test/A04redirect.ztst -+++ b/Test/A04redirect.ztst -@@ -152,11 +152,16 @@ - >hello - >goodbye - -+ ({exec 3<&- } 2>/dev/null -+ exec 3<&- -+ read foo <&-) -+1:'<&-' redirection with numeric fd (no error message on failure) -+ - (exec {varid}<&0 - exec {varid}<&- - print About to close a second time >&2 - read {varid}<&-) --1:'<&-' redirection -+1:'<&-' redirection with fd in variable (error message on failure) - ?About to close a second time - *?\(eval\):*: failed to close file descriptor * - --- -2.1.0 - diff --git a/zsh-5.0.7-heredocs-sigsegv.patch b/zsh-5.0.7-heredocs-sigsegv.patch deleted file mode 100644 index 46a0d80..0000000 --- a/zsh-5.0.7-heredocs-sigsegv.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 9b948be0afaa3ab0dee1e04edd2b577cf4010290 Mon Sep 17 00:00:00 2001 -From: Peter Stephenson -Date: Fri, 17 Apr 2015 22:43:38 +0100 -Subject: [PATCH] 34921: handle error in recursive par_event(). - -Here documents in an interrupted list caused bad juju. - -Upstream-commit: 2e48eceb1ad2b7b33170d7104e94351cc7231e51 -Signed-off-by: Kamil Dudka ---- - Src/parse.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/Src/parse.c b/Src/parse.c -index 433efb9..30270ef 100644 ---- a/Src/parse.c -+++ b/Src/parse.c -@@ -515,6 +515,7 @@ par_event(void) - if (!par_event()) { - ecused = oec; - ecbuf[p] |= wc_bdata(Z_END); -+ return errflag ? 0 : 1; - } - } - return 1; --- -2.1.0 - diff --git a/zsh-5.0.7-ksh-syntax-check.patch b/zsh-5.0.7-ksh-syntax-check.patch deleted file mode 100644 index af51ba0..0000000 --- a/zsh-5.0.7-ksh-syntax-check.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 3427fe59c2d76ddbf4b23908c6ae5272734c7c8b Mon Sep 17 00:00:00 2001 -From: "Barton E. Schaefer" -Date: Wed, 20 May 2015 10:14:04 -0700 -Subject: [PATCH] 35231: make mkevnstr() safe for NULL value - -Upstream-commit: af957f2ed6287f66953742fbca69188cecb98fbf -Signed-off-by: Kamil Dudka ---- - Src/params.c | 14 +++++++++----- - 1 file changed, 9 insertions(+), 5 deletions(-) - -diff --git a/Src/params.c b/Src/params.c -index 61edc5d..d0ce0a9 100644 ---- a/Src/params.c -+++ b/Src/params.c -@@ -4534,17 +4534,21 @@ addenv(Param pm, char *value) - static char * - mkenvstr(char *name, char *value, int flags) - { -- char *str, *s; -- int len_name, len_value; -+ char *str, *s = value; -+ int len_name, len_value = 0; - - len_name = strlen(name); -- for (len_value = 0, s = value; -- *s && (*s++ != Meta || *s++ != 32); len_value++); -+ if (s) -+ while (*s && (*s++ != Meta || *s++ != 32)) -+ len_value++; - s = str = (char *) zalloc(len_name + len_value + 2); - strcpy(s, name); - s += len_name; - *s = '='; -- copyenvstr(s, value, flags); -+ if (value) -+ copyenvstr(s, value, flags); -+ else -+ *++s = '\0'; - return str; - } - --- -2.4.1 - diff --git a/zsh-5.0.7-signal-name.patch b/zsh-5.0.7-signal-name.patch deleted file mode 100644 index c7ec73b..0000000 --- a/zsh-5.0.7-signal-name.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 9f9b98e0fe83c8aab493369c0671360ed06e138b Mon Sep 17 00:00:00 2001 -From: Peter Stephenson -Date: Thu, 15 Jan 2015 13:50:09 +0000 -Subject: [PATCH] 34287: preprocessor for signal name generation. - -Some gcc header files are difficult for the signames2.awk -script to process, so if the preprocessor is gcc give the -option -P to strip out the unwanted additions. - -Upstream-commit: c7aa6443907ddd97b6b1e8729ce9c897de0d244c -Signed-off-by: Kamil Dudka ---- - Src/zsh.mdd | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/Src/zsh.mdd b/Src/zsh.mdd -index 9a8c923..469e91b 100644 ---- a/Src/zsh.mdd -+++ b/Src/zsh.mdd -@@ -21,9 +21,18 @@ hdrdeps="zshcurses.h zshterm.h" - :<<\Make - @CONFIG_MK@ - -+# If we're using gcc as the preprocessor, get rid of the additional -+# lines generated by the preprocessor as they can confuse the script. -+# We don't need these in other cases either, but can't necessarily rely -+# on the option to remove them being the same. - signames.c: signames1.awk signames2.awk ../config.h @SIGNAL_H@ - $(AWK) -f $(sdir)/signames1.awk @SIGNAL_H@ >sigtmp.c -- $(CPP) sigtmp.c >sigtmp.out -+ case "$(CPP)" in \ -+ gcc*) \ -+ $(CPP) -P sigtmp.c >sigtmp.out;; \ -+ *) \ -+ $(CPP) sigtmp.c >sigtmp.out;; \ -+ esac - $(AWK) -f $(sdir)/signames2.awk sigtmp.out > $@ - rm -f sigtmp.c sigtmp.out - --- -2.1.0 - diff --git a/zsh-5.0.7-signal-safety.patch b/zsh-5.0.7-signal-safety.patch deleted file mode 100644 index f12781f..0000000 --- a/zsh-5.0.7-signal-safety.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 7c9af538d63b4623b38ef2fa9903e0f0344ffc32 Mon Sep 17 00:00:00 2001 -From: "Barton E. Schaefer" -Date: Fri, 20 Feb 2015 18:45:36 -0800 -Subject: [PATCH] 34590: queue_signals() around more scopes that manipulate - global state - -Upstream-commit: a4ff8e69570cbdb8e7d5bf1d5cc4000ffe63e15e -Signed-off-by: Kamil Dudka ---- - Src/exec.c | 4 +++- - Src/text.c | 15 +++++++++++++++ - 2 files changed, 18 insertions(+), 1 deletion(-) - -diff --git a/Src/exec.c b/Src/exec.c -index 04c8b50..b59eb5e 100644 ---- a/Src/exec.c -+++ b/Src/exec.c -@@ -2320,6 +2320,7 @@ addvars(Estate state, Wordcode pc, int addflags) - void - setunderscore(char *str) - { -+ queue_signals(); - if (str && *str) { - int l = strlen(str) + 1, nl = (l + 31) & ~31; - -@@ -2337,6 +2338,7 @@ setunderscore(char *str) - *zunderscore = '\0'; - underscoreused = 1; - } -+ unqueue_signals(); - } - - /* These describe the type of expansions that need to be done on the words -@@ -5246,7 +5248,7 @@ execsave(void) - { - struct execstack *es; - -- es = (struct execstack *) malloc(sizeof(struct execstack)); -+ es = (struct execstack *) zalloc(sizeof(struct execstack)); - es->list_pipe_pid = list_pipe_pid; - es->nowait = nowait; - es->pline_level = pline_level; -diff --git a/Src/text.c b/Src/text.c -index f55553e..8f8eb34 100644 ---- a/Src/text.c -+++ b/Src/text.c -@@ -173,6 +173,8 @@ getpermtext(Eprog prog, Wordcode c, int start_indent) - { - struct estate s; - -+ queue_signals(); -+ - if (!c) - c = prog->prog; - -@@ -193,6 +195,9 @@ getpermtext(Eprog prog, Wordcode c, int start_indent) - *tptr = '\0'; - freeeprog(prog); /* mark as unused */ - untokenize(tbuf); -+ -+ unqueue_signals(); -+ - return tbuf; - } - -@@ -206,6 +211,8 @@ getjobtext(Eprog prog, Wordcode c) - - struct estate s; - -+ queue_signals(); -+ - if (!c) - c = prog->prog; - -@@ -224,6 +231,9 @@ getjobtext(Eprog prog, Wordcode c) - *tptr = '\0'; - freeeprog(prog); /* mark as unused */ - untokenize(jbuf); -+ -+ unqueue_signals(); -+ - return jbuf; - } - -@@ -879,6 +889,9 @@ getredirs(LinkList redirs) - ">", ">|", ">>", ">>|", "&>", "&>|", "&>>", "&>>|", "<>", "<", - "<<", "<<-", "<<<", "<&", ">&", NULL /* >&- */, "<", ">" - }; -+ -+ queue_signals(); -+ - taddchr(' '); - for (n = firstnode(redirs); n; incnode(n)) { - Redir f = (Redir) getdata(n); -@@ -966,4 +979,6 @@ getredirs(LinkList redirs) - } - } - tptr--; -+ -+ unqueue_signals(); - } --- -2.1.0 - diff --git a/zsh-5.0.7-wait-for-exited.patch b/zsh-5.0.7-wait-for-exited.patch deleted file mode 100644 index a15391d..0000000 --- a/zsh-5.0.7-wait-for-exited.patch +++ /dev/null @@ -1,397 +0,0 @@ -From 223ac53797d33b0473323efc0d5a44d1dceaf746 Mon Sep 17 00:00:00 2001 -From: Peter Stephenson -Date: Sun, 26 Oct 2014 17:47:42 +0000 -Subject: [PATCH 1/2] 33531 with additions: retain status of exited background - jobs. - -Add linked list of unwaited-for background jobs. -Truncate at value of _SC_CHILD_MAX discarding oldest. -Remove old lastpid_status mechanism for latest exited process only. -Slightly tighten safety of permanently allocated linked lists so -that this doesn't compromise signal handling. - -Upstream-commit: b4f7ccecd93ca9e64c3c3c774fdaefae83d7204a -Signed-off-by: Kamil Dudka ---- - Doc/Zsh/builtins.yo | 16 ++++++ - Doc/Zsh/options.yo | 8 +-- - Doc/zshoptions.1 | 8 +-- - Src/exec.c | 2 - - Src/init.c | 1 - - Src/jobs.c | 138 ++++++++++++++++++++++++++++++++++++++++++++-------- - Src/linklist.c | 4 ++ - Src/signals.c | 14 +++--- - 8 files changed, 152 insertions(+), 39 deletions(-) - -diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo -index 46f40cc..edc335e 100644 ---- a/Doc/Zsh/builtins.yo -+++ b/Doc/Zsh/builtins.yo -@@ -2059,6 +2059,22 @@ then all currently active child processes are waited for. - Each var(job) can be either a job specification or the process ID - of a job in the job table. - The exit status from this command is that of the job waited for. -+ -+It is possible to wait for recent processes (specified by process ID, -+not by job) that were running in the background even if the process has -+exited. Typically the process ID will be recorded by capturing the -+value of the variable tt($!) immediately after the process has been -+started. There is a limit on the number of process IDs remembered by -+the shell; this is given by the value of the system configuration -+parameter tt(CHILD_MAX). When this limit is reached, older process IDs -+are discarded, least recently started processes first. -+ -+Note there is no protection against the process ID wrapping, i.e. if the -+wait is not executed soon enough there is a chance the process waited -+for is the wrong one. A conflict implies both process IDs have been -+generated by the shell, as other processes are not recorded, and that -+the user is potentially interested in both, so this problem is intrinsic -+to process IDs. - ) - findex(whence) - item(tt(whence) [ tt(-vcwfpams) ] var(name) ...)( -diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo -index 068a253..452b258 100644 ---- a/Doc/Zsh/options.yo -+++ b/Doc/Zsh/options.yo -@@ -1434,10 +1434,10 @@ shell is saved for output within a subshell (for example, within a - pipeline). When the option is set, the output of tt(jobs) is empty - until a job is started within the subshell. - --When the option is set, it becomes possible to use the tt(wait) builtin to --wait for the last job started in the background (as given by tt($!)) even --if that job has already exited. This works even if the option is turned --on temporarily around the use of the tt(wait) builtin. -+In previous versions of the shell, it was necessary to enable -+tt(POSIX_JOBS) in order for the builtin command tt(wait) to return the -+status of background jobs that had already exited. This is no longer -+the case. - ) - enditem() - -diff --git a/Doc/zshoptions.1 b/Doc/zshoptions.1 -index cc0bd7e..038e259 100644 ---- a/Doc/zshoptions.1 -+++ b/Doc/zshoptions.1 -@@ -892,10 +892,10 @@ shell is saved for output within a subshell (for example, within a - pipeline)\&. When the option is set, the output of \fBjobs\fP is empty - until a job is started within the subshell\&. - .PP --When the option is set, it becomes possible to use the \fBwait\fP builtin to --wait for the last job started in the background (as given by \fB$!\fP) even --if that job has already exited\&. This works even if the option is turned --on temporarily around the use of the \fBwait\fP builtin\&. -+In previous versions of the shell, it was necessary to enable -+\fBPOSIX_JOBS\fP in order for the builtin command \fBwait\fP to return the -+status of background jobs that had already exited\&. This is no longer -+the case\&. - .RE - .PP - .SS "Prompting" -diff --git a/Src/exec.c b/Src/exec.c -index d0fadd6..a9c4688 100644 ---- a/Src/exec.c -+++ b/Src/exec.c -@@ -2941,8 +2941,6 @@ execcmd(Estate state, int input, int output, int how, int last1) - close(synch[0]); - if (how & Z_ASYNC) { - lastpid = (zlong) pid; -- /* indicate it's possible to set status for lastpid */ -- lastpid_status = -2L; - } else if (!jobtab[thisjob].stty_in_env && varspc) { - /* search for STTY=... */ - Wordcode p = varspc; -diff --git a/Src/init.c b/Src/init.c -index c26d887..6666f98 100644 ---- a/Src/init.c -+++ b/Src/init.c -@@ -1036,7 +1036,6 @@ setupvals(void) - bufstack = znewlinklist(); - hsubl = hsubr = NULL; - lastpid = 0; -- lastpid_status = -1L; - - get_usage(); - -diff --git a/Src/jobs.c b/Src/jobs.c -index bd95afb..18bb648 100644 ---- a/Src/jobs.c -+++ b/Src/jobs.c -@@ -104,15 +104,6 @@ int prev_errflag, prev_breaks, errbrk_saved; - /**/ - int numpipestats, pipestats[MAX_PIPESTATS]; - --/* -- * The status associated with the process lastpid. -- * -1 if not set and no associated lastpid -- * -2 if lastpid is set and status isn't yet -- * else the value returned by wait(). -- */ --/**/ --long lastpid_status; -- - /* Diff two timevals for elapsed-time computations */ - - /**/ -@@ -1309,14 +1300,6 @@ addproc(pid_t pid, char *text, int aux, struct timeval *bgtime) - { - Process pn, *pnlist; - -- if (pid == lastpid && lastpid_status != -2L) { -- /* -- * The status for the previous lastpid is invalid. -- * Presumably process numbers have wrapped. -- */ -- lastpid_status = -1L; -- } -- - DPUTS(thisjob == -1, "No valid job in addproc."); - pn = (Process) zshcalloc(sizeof *pn); - pn->pid = pid; -@@ -1940,6 +1923,122 @@ maybeshrinkjobtab(void) - unqueue_signals(); - } - -+/* -+ * Definitions for the background process stuff recorded below. -+ * This would be more efficient as a hash, but -+ * - that's quite heavyweight for something not needed very often -+ * - we need some kind of ordering as POSIX allows us to limit -+ * the size of the list to the value of _SC_CHILD_MAX and clearly -+ * we want to clear the oldest first -+ * - cases with a long list of background jobs where the user doesn't -+ * wait for a large number, and then does wait for one (the only -+ * inefficient case) are rare -+ * - in the context of waiting for an external process, looping -+ * over a list isn't so very inefficient. -+ * Enough excuses already. -+ */ -+ -+/* Data in the link list, a key (process ID) / value (exit status) pair. */ -+struct bgstatus { -+ pid_t pid; -+ int status; -+}; -+typedef struct bgstatus *Bgstatus; -+/* The list of those entries */ -+LinkList bgstatus_list; -+/* Count of entries. Reaches value of _SC_CHILD_MAX and stops. */ -+long bgstatus_count; -+ -+/* -+ * Remove and free a bgstatus entry. -+ */ -+static void rembgstatus(LinkNode node) -+{ -+ zfree(remnode(bgstatus_list, node), sizeof(struct bgstatus)); -+ bgstatus_count--; -+} -+ -+/* -+ * Record the status of a background process that exited so we -+ * can execute the builtin wait for it. -+ * -+ * We can't execute the wait builtin for something that exited in the -+ * foreground as it's not visible to the user, so don't bother recording. -+ */ -+ -+/**/ -+void -+addbgstatus(pid_t pid, int status) -+{ -+ static long child_max; -+ Bgstatus bgstatus_entry; -+ -+ if (!child_max) { -+#ifdef _SC_CHILD_MAX -+ child_max = sysconf(_SC_CHILD_MAX); -+ if (!child_max) /* paranoia */ -+#endif -+ { -+ /* Be inventive */ -+ child_max = 1024L; -+ } -+ } -+ -+ if (!bgstatus_list) { -+ bgstatus_list = znewlinklist(); -+ /* -+ * We're not always robust about memory failures, but -+ * this is pretty deep in the shell basics to be failing owing -+ * to memory, and a failure to wait is reported loudly, so test -+ * and fail silently here. -+ */ -+ if (!bgstatus_list) -+ return; -+ } -+ if (bgstatus_count == child_max) { -+ /* Overflow. List is in order, remove first */ -+ rembgstatus(firstnode(bgstatus_list)); -+ } -+ bgstatus_entry = (Bgstatus)zalloc(sizeof(*bgstatus_entry)); -+ if (!bgstatus_entry) { -+ /* See note above */ -+ return; -+ } -+ bgstatus_entry->pid = pid; -+ bgstatus_entry->status = status; -+ if (!zaddlinknode(bgstatus_list, bgstatus_entry)) { -+ zfree(bgstatus_entry, sizeof(*bgstatus_entry)); -+ return; -+ } -+ bgstatus_count++; -+} -+ -+/* -+ * See if pid has a recorded exit status. -+ * Note we make no guarantee that the PIDs haven't wrapped, so this -+ * may not be the right process. -+ * -+ * This is only used by wait, which must only work on each -+ * pid once, so we need to remove the entry if we find it. -+ */ -+ -+static int getbgstatus(pid_t pid) -+{ -+ LinkNode node; -+ Bgstatus bgstatus_entry; -+ -+ if (!bgstatus_list) -+ return -1; -+ for (node = firstnode(bgstatus_list); node; incnode(node)) { -+ bgstatus_entry = (Bgstatus)getdata(node); -+ if (bgstatus_entry->pid == pid) { -+ int status = bgstatus_entry->status; -+ rembgstatus(node); -+ return status; -+ } -+ } -+ return -1; -+} - - /* bg, disown, fg, jobs, wait: most of the job control commands are * - * here. They all take the same type of argument. Exception: wait can * -@@ -2085,10 +2184,7 @@ bin_fg(char *name, char **argv, Options ops, int func) - } - if (retval == 0) - retval = lastval2; -- } else if (isset(POSIXJOBS) && -- pid == lastpid && lastpid_status >= 0L) { -- retval = (int)lastpid_status; -- } else { -+ } else if ((retval = getbgstatus(pid)) < 0) { - zwarnnam(name, "pid %d is not a child of this shell", pid); - /* presumably lastval2 doesn't tell us a heck of a lot? */ - retval = 1; -diff --git a/Src/linklist.c b/Src/linklist.c -index 1e364fb..3aa8125 100644 ---- a/Src/linklist.c -+++ b/Src/linklist.c -@@ -118,6 +118,8 @@ znewlinklist(void) - LinkList list; - - list = (LinkList) zalloc(sizeof *list); -+ if (!list) -+ return NULL; - list->list.first = NULL; - list->list.last = &list->node; - list->list.flags = 0; -@@ -152,6 +154,8 @@ zinsertlinknode(LinkList list, LinkNode node, void *dat) - - tmp = node->next; - node->next = new = (LinkNode) zalloc(sizeof *tmp); -+ if (!new) -+ return NULL; - new->prev = node; - new->dat = dat; - new->next = tmp; -diff --git a/Src/signals.c b/Src/signals.c -index 2df69f9..e728505 100644 ---- a/Src/signals.c -+++ b/Src/signals.c -@@ -522,14 +522,14 @@ wait_for_processes(void) - get_usage(); - } - /* -- * Remember the status associated with $!, so we can -- * wait for it even if it's exited. This value is -- * only used if we can't find the PID in the job table, -- * so it doesn't matter that the value we save here isn't -- * useful until the process has exited. -+ * Accumulate a list of older jobs. We only do this for -+ * background jobs, which is something in the job table -+ * that's not marked as in the current shell or as shell builtin -+ * and is not equal to the current foreground job. - */ -- if (pn != NULL && pid == lastpid && lastpid_status != -1L) -- lastpid_status = lastval2; -+ if (jn && !(jn->stat & (STAT_CURSH|STAT_BUILTIN)) && -+ jn - jobtab != thisjob) -+ addbgstatus(pid, (int)lastval2); - } - } - --- -2.1.0 - - -From 2d59469450ba80b69449dc2777f0fc0673e0fbd6 Mon Sep 17 00:00:00 2001 -From: Peter Stephenson -Date: Sun, 26 Oct 2014 19:04:47 +0000 -Subject: [PATCH 2/2] 33542: test logic for waiting for already exited - processes - -Upstream-commit: 9a551ca85999ff329714fd2cca138ce2f7d3c3d9 -Signed-off-by: Kamil Dudka ---- - Test/A05execution.ztst | 29 +++++++++++++++++++++++++++-- - 1 file changed, 27 insertions(+), 2 deletions(-) - -diff --git a/Test/A05execution.ztst b/Test/A05execution.ztst -index ca97f4f..589815f 100644 ---- a/Test/A05execution.ztst -+++ b/Test/A05execution.ztst -@@ -190,9 +190,9 @@ - print "${pipestatus[@]}") - ZTST_hashmark - done | sort | uniq -c | sed 's/^ *//' --0:Check whether `$pipestatus[]' behaves. -+0:Check whether '$pipestatus[]' behaves. - >2048 2 1 0 --F:This test checks for a bug in `$pipestatus[]' handling. If it breaks then -+F:This test checks for a bug in '$pipestatus[]' handling. If it breaks then - F:the bug is still there or it reappeared. See workers-29973 for details. - - { setopt MONITOR } 2>/dev/null -@@ -244,3 +244,28 @@ F:anonymous function, and a descriptor leak when backgrounding a pipeline - >autoload_redir () { - > print Autoloaded ksh style - >} > autoload.log -+ -+# This tests that we record the status of processes that have already exited -+# for when we wait for them. -+# -+# Actually, we don't guarantee here that the jobs have already exited, but -+# the order of the waits means it's highly likely we do need to recall a -+# previous status, barring accidents which shouldn't happen very often. In -+# other words, we rely on the test working repeatedly rather than just -+# once. The monitor option is irrelevant to the logic, so we'll make -+# our job easier by turning it off. -+ unsetopt monitor -+ (exit 1) & -+ one=$! -+ (exit 2) & -+ two=$! -+ (exit 3) & -+ three=$! -+ wait $three -+ print $? -+ wait $two -+ print $? -+ wait $one -+1:The status of recently exited background jobs is recorded -+>3 -+>2 --- -2.1.0 - diff --git a/zsh-serial.patch b/zsh-serial.patch index ebfde77..7ea975b 100644 --- a/zsh-serial.patch +++ b/zsh-serial.patch @@ -1,6 +1,12 @@ ---- zsh-4.0.4/Src/builtin.c.open Tue Oct 16 02:49:17 2001 -+++ zsh-4.0.4/Src/builtin.c Wed May 15 11:55:32 2002 -@@ -5262,7 +5262,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func)) + Src/builtin.c | 2 +- + Src/init.c | 34 ++++++++++++++++++++++++++++++++-- + 2 files changed, 33 insertions(+), 3 deletions(-) + +diff --git a/Src/builtin.c b/Src/builtin.c +index 9358e8b..ee14f91 100644 +--- a/Src/builtin.c ++++ b/Src/builtin.c +@@ -5411,7 +5411,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func)) if (!zleactive) { if (SHTTY == -1) { /* need to open /dev/tty specially */ @@ -9,9 +15,11 @@ haso = 1; oshout = shout; init_shout(); ---- zsh-4.0.4/Src/init.c.open Wed Oct 24 04:16:32 2001 -+++ zsh-4.0.4/Src/init.c Wed May 15 12:00:07 2002 -@@ -508,7 +508,7 @@ init_io(void) +diff --git a/Src/init.c b/Src/init.c +index 102276a..238f6ed 100644 +--- a/Src/init.c ++++ b/Src/init.c +@@ -542,7 +542,7 @@ init_io(void) if (isatty(0)) { zsfree(ttystrname); if ((ttystrname = ztrdup(ttyname(0)))) { @@ -20,7 +28,7 @@ #ifdef TIOCNXCL /* * See if the terminal claims to be busy. If so, and fd 0 -@@ -549,7 +549,7 @@ init_io(void) +@@ -583,7 +583,7 @@ init_io(void) ttystrname = ztrdup(ttyname(1)); } if (SHTTY == -1 && @@ -29,7 +37,7 @@ zsfree(ttystrname); ttystrname = ztrdup(ttyname(SHTTY)); } -@@ -1671,3 +1671,33 @@ zsh_main(UNUSED(int argc), char **argv) +@@ -1707,3 +1707,33 @@ zsh_main(UNUSED(int argc), char **argv) : "use 'logout' to logout."); } } diff --git a/zsh-test-C02-dev_fd-mock.patch b/zsh-test-C02-dev_fd-mock.patch index 454da92..2db0749 100644 --- a/zsh-test-C02-dev_fd-mock.patch +++ b/zsh-test-C02-dev_fd-mock.patch @@ -1,7 +1,11 @@ -diff -ru zsh-4.3.6-orig/Test/C02cond.ztst zsh-4.3.6/Test/C02cond.ztst ---- zsh-4.3.6-orig/Test/C02cond.ztst 2008-02-27 06:41:13.000000000 -0500 -+++ zsh-4.3.6/Test/C02cond.ztst 2008-08-25 17:39:13.000000000 -0400 -@@ -187,7 +187,8 @@ + Test/C02cond.ztst | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/Test/C02cond.ztst b/Test/C02cond.ztst +index 02fa4d4..97f679c 100644 +--- a/Test/C02cond.ztst ++++ b/Test/C02cond.ztst +@@ -204,7 +204,8 @@ F:Failures in these cases do not indicate a problem in the shell. print -u$ZTST_fd "Warning: not testing [[ -e /dev/fd/0 ]] (/dev/fd not supported)" true else @@ -11,7 +15,7 @@ diff -ru zsh-4.3.6-orig/Test/C02cond.ztst zsh-4.3.6/Test/C02cond.ztst fi 0dD:/dev/fd support in conds handled by access -@@ -195,7 +196,8 @@ +@@ -212,7 +213,8 @@ F:Failures in these cases do not indicate a problem in the shell. print -u$ZTST_fd "Warning: not testing [[ -O /dev/fd/0 ]] (/dev/fd not supported)" true else diff --git a/zsh.spec b/zsh.spec index 51cf1f4..e56907a 100644 --- a/zsh.spec +++ b/zsh.spec @@ -2,8 +2,8 @@ Summary: Powerful interactive shell Name: zsh -Version: 5.0.7 -Release: 8%{?dist} +Version: 5.0.8 +Release: 1%{?dist} License: MIT URL: http://zsh.sourceforge.net/ Group: System Environment/Shells @@ -15,31 +15,11 @@ Source4: zshrc.rhs Source5: zshenv.rhs Source6: dotzshrc Source7: zshprompt.pl + +# legacy downstream patches, TODO: either get them upstream or drop them Patch0: zsh-serial.patch - -Patch4: zsh-4.3.6-8bit-prompts.patch -Patch5: zsh-test-C02-dev_fd-mock.patch - -# make the wait built-in work for already exited processes (#1162198) -Patch6: zsh-5.0.7-wait-for-exited.patch - -# suppress a warning about closing an already closed file descriptor (#1184002) -Patch7: zsh-5.0.7-close-fd.patch - -# improve handling of NULL in the 'cd' built-in (#1183238) -Patch8: zsh-5.0.7-cd-sigsegv.patch - -# fix SIGSEGV when handling heredocs and keyboard interrupt (#972624) -Patch9: zsh-5.0.7-heredocs-sigsegv.patch - -# queue signals when manipulating global state to avoid deadlock -Patch10: zsh-5.0.7-signal-safety.patch - -# improve signal name generation (prevents Test/C03traps.ztst from failing) -Patch11: zsh-5.0.7-signal-name.patch - -# fix SIGSEGV of the syntax check in ksh emulation mode (#1222867) -Patch12: zsh-5.0.7-ksh-syntax-check.patch +Patch1: zsh-4.3.6-8bit-prompts.patch +Patch2: zsh-test-C02-dev_fd-mock.patch BuildRequires: coreutils sed ncurses-devel libcap-devel BuildRequires: texinfo texi2html gawk hostname @@ -74,16 +54,9 @@ This package contains the Zsh manual in html format. %prep %setup -q -%patch0 -p1 -b .serial -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 -%patch7 -p1 -%patch8 -p1 -%patch9 -p1 -%patch10 -p1 -%patch11 -p1 -%patch12 -p1 +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 cp -p %SOURCE7 . @@ -201,6 +174,9 @@ fi %doc Doc/*.html %changelog +* Wed Jun 03 2015 Kamil Dudka - 5.0.8-1 +- Update to latest upstream release: Zsh 5.0.8 + * Fri May 22 2015 Kamil Dudka - 5.0.7-8 - fix SIGSEGV of the syntax check in ksh emulation mode (#1222867)