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