|
@@ -0,0 +1,293 @@
|
|
|
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash55-017
|
|
|
+
|
|
|
+Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
|
|
|
+
|
|
|
+ BASH PATCH REPORT
|
|
|
+ =================
|
|
|
+
|
|
|
+Bash-Release: 5.0
|
|
|
+Patch-ID: bash50-017
|
|
|
+
|
|
|
+Bug-Reported-by: Valentin Lab <valentin.lab@kalysto.org>
|
|
|
+Bug-Reference-ID: <ab981b9c-60a5-46d0-b7e6-a6d88b80df50@kalysto.org>
|
|
|
+Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2020-03/msg00062.html
|
|
|
+
|
|
|
+Bug-Description:
|
|
|
+
|
|
|
+There were cases where patch 16 reaped process substitution file descriptors
|
|
|
+(or FIFOs) and processes to early. This is a better fix for the problem that
|
|
|
+bash50-016 attempted to solve.
|
|
|
+
|
|
|
+Patch (apply with `patch -p0'):
|
|
|
+
|
|
|
+*** bash-5.0-patched/subst.c 2019-08-29 11:16:49.000000000 -0400
|
|
|
+--- b/subst.c 2020-04-02 16:24:19.000000000 -0400
|
|
|
+***************
|
|
|
+*** 5337,5341 ****
|
|
|
+ }
|
|
|
+
|
|
|
+! char *
|
|
|
+ copy_fifo_list (sizep)
|
|
|
+ int *sizep;
|
|
|
+--- b/5337,5341 ----
|
|
|
+ }
|
|
|
+
|
|
|
+! void *
|
|
|
+ copy_fifo_list (sizep)
|
|
|
+ int *sizep;
|
|
|
+***************
|
|
|
+*** 5343,5347 ****
|
|
|
+ if (sizep)
|
|
|
+ *sizep = 0;
|
|
|
+! return (char *)NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+--- b/5343,5347 ----
|
|
|
+ if (sizep)
|
|
|
+ *sizep = 0;
|
|
|
+! return (void *)NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+***************
|
|
|
+*** 5409,5414 ****
|
|
|
+ if (fifo_list[i].file)
|
|
|
+ {
|
|
|
+! fifo_list[j].file = fifo_list[i].file;
|
|
|
+! fifo_list[j].proc = fifo_list[i].proc;
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+--- b/5409,5419 ----
|
|
|
+ if (fifo_list[i].file)
|
|
|
+ {
|
|
|
+! if (i != j)
|
|
|
+! {
|
|
|
+! fifo_list[j].file = fifo_list[i].file;
|
|
|
+! fifo_list[j].proc = fifo_list[i].proc;
|
|
|
+! fifo_list[i].file = (char *)NULL;
|
|
|
+! fifo_list[i].proc = 0;
|
|
|
+! }
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+***************
|
|
|
+*** 5426,5433 ****
|
|
|
+ void
|
|
|
+ close_new_fifos (list, lsize)
|
|
|
+! char *list;
|
|
|
+ int lsize;
|
|
|
+ {
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (list == 0)
|
|
|
+--- b/5431,5439 ----
|
|
|
+ void
|
|
|
+ close_new_fifos (list, lsize)
|
|
|
+! void *list;
|
|
|
+ int lsize;
|
|
|
+ {
|
|
|
+ int i;
|
|
|
++ char *plist;
|
|
|
+
|
|
|
+ if (list == 0)
|
|
|
+***************
|
|
|
+*** 5437,5442 ****
|
|
|
+ }
|
|
|
+
|
|
|
+! for (i = 0; i < lsize; i++)
|
|
|
+! if (list[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1)
|
|
|
+ unlink_fifo (i);
|
|
|
+
|
|
|
+--- b/5443,5448 ----
|
|
|
+ }
|
|
|
+
|
|
|
+! for (plist = (char *)list, i = 0; i < lsize; i++)
|
|
|
+! if (plist[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1)
|
|
|
+ unlink_fifo (i);
|
|
|
+
|
|
|
+***************
|
|
|
+*** 5560,5568 ****
|
|
|
+ }
|
|
|
+
|
|
|
+! char *
|
|
|
+ copy_fifo_list (sizep)
|
|
|
+ int *sizep;
|
|
|
+ {
|
|
|
+! char *ret;
|
|
|
+
|
|
|
+ if (nfds == 0 || totfds == 0)
|
|
|
+--- b/5566,5574 ----
|
|
|
+ }
|
|
|
+
|
|
|
+! void *
|
|
|
+ copy_fifo_list (sizep)
|
|
|
+ int *sizep;
|
|
|
+ {
|
|
|
+! void *ret;
|
|
|
+
|
|
|
+ if (nfds == 0 || totfds == 0)
|
|
|
+***************
|
|
|
+*** 5570,5579 ****
|
|
|
+ if (sizep)
|
|
|
+ *sizep = 0;
|
|
|
+! return (char *)NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sizep)
|
|
|
+ *sizep = totfds;
|
|
|
+! ret = (char *)xmalloc (totfds * sizeof (pid_t));
|
|
|
+ return (memcpy (ret, dev_fd_list, totfds * sizeof (pid_t)));
|
|
|
+ }
|
|
|
+--- b/5576,5585 ----
|
|
|
+ if (sizep)
|
|
|
+ *sizep = 0;
|
|
|
+! return (void *)NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sizep)
|
|
|
+ *sizep = totfds;
|
|
|
+! ret = xmalloc (totfds * sizeof (pid_t));
|
|
|
+ return (memcpy (ret, dev_fd_list, totfds * sizeof (pid_t)));
|
|
|
+ }
|
|
|
+***************
|
|
|
+*** 5648,5655 ****
|
|
|
+ void
|
|
|
+ close_new_fifos (list, lsize)
|
|
|
+! char *list;
|
|
|
+ int lsize;
|
|
|
+ {
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (list == 0)
|
|
|
+--- b/5654,5662 ----
|
|
|
+ void
|
|
|
+ close_new_fifos (list, lsize)
|
|
|
+! void *list;
|
|
|
+ int lsize;
|
|
|
+ {
|
|
|
+ int i;
|
|
|
++ pid_t *plist;
|
|
|
+
|
|
|
+ if (list == 0)
|
|
|
+***************
|
|
|
+*** 5659,5664 ****
|
|
|
+ }
|
|
|
+
|
|
|
+! for (i = 0; i < lsize; i++)
|
|
|
+! if (list[i] == 0 && i < totfds && dev_fd_list[i])
|
|
|
+ unlink_fifo (i);
|
|
|
+
|
|
|
+--- b/5666,5671 ----
|
|
|
+ }
|
|
|
+
|
|
|
+! for (plist = (pid_t *)list, i = 0; i < lsize; i++)
|
|
|
+! if (plist[i] == 0 && i < totfds && dev_fd_list[i])
|
|
|
+ unlink_fifo (i);
|
|
|
+
|
|
|
+*** bash-5.0-patched/subst.h 2018-10-21 18:46:09.000000000 -0400
|
|
|
+--- b/subst.h 2020-04-02 16:29:28.000000000 -0400
|
|
|
+***************
|
|
|
+*** 274,280 ****
|
|
|
+ extern void unlink_fifo __P((int));
|
|
|
+
|
|
|
+! extern char *copy_fifo_list __P((int *));
|
|
|
+! extern void unlink_new_fifos __P((char *, int));
|
|
|
+! extern void close_new_fifos __P((char *, int));
|
|
|
+
|
|
|
+ extern void clear_fifo_list __P((void));
|
|
|
+--- b/274,279 ----
|
|
|
+ extern void unlink_fifo __P((int));
|
|
|
+
|
|
|
+! extern void *copy_fifo_list __P((int *));
|
|
|
+! extern void close_new_fifos __P((void *, int));
|
|
|
+
|
|
|
+ extern void clear_fifo_list __P((void));
|
|
|
+*** bash-5.0-patched/execute_cmd.c 2020-02-06 20:16:48.000000000 -0500
|
|
|
+--- b/execute_cmd.c 2020-04-02 17:00:10.000000000 -0400
|
|
|
+***************
|
|
|
+*** 565,569 ****
|
|
|
+ #if defined (PROCESS_SUBSTITUTION)
|
|
|
+ volatile int ofifo, nfifo, osize, saved_fifo;
|
|
|
+! volatile char *ofifo_list;
|
|
|
+ #endif
|
|
|
+
|
|
|
+--- b/565,569 ----
|
|
|
+ #if defined (PROCESS_SUBSTITUTION)
|
|
|
+ volatile int ofifo, nfifo, osize, saved_fifo;
|
|
|
+! volatile void *ofifo_list;
|
|
|
+ #endif
|
|
|
+
|
|
|
+***************
|
|
|
+*** 751,760 ****
|
|
|
+ # endif
|
|
|
+
|
|
|
+! if (variable_context != 0) /* XXX - also if sourcelevel != 0? */
|
|
|
+ {
|
|
|
+ ofifo = num_fifos ();
|
|
|
+ ofifo_list = copy_fifo_list ((int *)&osize);
|
|
|
+ begin_unwind_frame ("internal_fifos");
|
|
|
+! add_unwind_protect (xfree, ofifo_list);
|
|
|
+ saved_fifo = 1;
|
|
|
+ }
|
|
|
+--- b/751,762 ----
|
|
|
+ # endif
|
|
|
+
|
|
|
+! /* XXX - also if sourcelevel != 0? */
|
|
|
+! if (variable_context != 0)
|
|
|
+ {
|
|
|
+ ofifo = num_fifos ();
|
|
|
+ ofifo_list = copy_fifo_list ((int *)&osize);
|
|
|
+ begin_unwind_frame ("internal_fifos");
|
|
|
+! if (ofifo_list)
|
|
|
+! add_unwind_protect (xfree, ofifo_list);
|
|
|
+ saved_fifo = 1;
|
|
|
+ }
|
|
|
+***************
|
|
|
+*** 1100,1123 ****
|
|
|
+ nfifo = num_fifos ();
|
|
|
+ if (nfifo > ofifo)
|
|
|
+! close_new_fifos ((char *)ofifo_list, osize);
|
|
|
+ free ((void *)ofifo_list);
|
|
|
+ discard_unwind_frame ("internal_fifos");
|
|
|
+ }
|
|
|
+- # if defined (HAVE_DEV_FD)
|
|
|
+- /* Reap process substitutions at the end of loops */
|
|
|
+- switch (command->type)
|
|
|
+- {
|
|
|
+- case cm_while:
|
|
|
+- case cm_until:
|
|
|
+- case cm_for:
|
|
|
+- case cm_group:
|
|
|
+- # if defined (ARITH_FOR_COMMAND)
|
|
|
+- case cm_arith_for:
|
|
|
+- # endif
|
|
|
+- reap_procsubs ();
|
|
|
+- default:
|
|
|
+- break;
|
|
|
+- }
|
|
|
+- # endif /* HAVE_DEV_FD */
|
|
|
+ #endif
|
|
|
+
|
|
|
+--- b/1102,1109 ----
|
|
|
+ nfifo = num_fifos ();
|
|
|
+ if (nfifo > ofifo)
|
|
|
+! close_new_fifos ((void *)ofifo_list, osize);
|
|
|
+ free ((void *)ofifo_list);
|
|
|
+ discard_unwind_frame ("internal_fifos");
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+
|
|
|
+
|
|
|
+*** bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
|
|
|
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
|
|
|
+***************
|
|
|
+*** 26,30 ****
|
|
|
+ looks for to find the patch level (for the sccs version string). */
|
|
|
+
|
|
|
+! #define PATCHLEVEL 16
|
|
|
+
|
|
|
+ #endif /* _PATCHLEVEL_H_ */
|
|
|
+--- b/26,30 ----
|
|
|
+ looks for to find the patch level (for the sccs version string). */
|
|
|
+
|
|
|
+! #define PATCHLEVEL 17
|
|
|
+
|
|
|
+ #endif /* _PATCHLEVEL_H_ */
|