123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- 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_ */
|