You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							289 lines
						
					
					
						
							6.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							289 lines
						
					
					
						
							6.4 KiB
						
					
					
				| 			     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 | |
| --- subst.c	2020-04-02 16:24:19.000000000 -0400 | |
| *************** | |
| *** 5337,5341 **** | |
|   } | |
|    | |
| ! char * | |
|   copy_fifo_list (sizep) | |
|        int *sizep; | |
| --- 5337,5341 ---- | |
|   } | |
|    | |
| ! void * | |
|   copy_fifo_list (sizep) | |
|        int *sizep; | |
| *************** | |
| *** 5343,5347 **** | |
|     if (sizep) | |
|       *sizep = 0; | |
| !   return (char *)NULL; | |
|   } | |
|    | |
| --- 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++; | |
|   	  } | |
| --- 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) | |
| --- 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); | |
|    | |
| --- 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) | |
| --- 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))); | |
|   } | |
| --- 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) | |
| --- 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); | |
|    | |
| --- 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 | |
| --- 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)); | |
| --- 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 | |
| --- 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 | |
|    | |
| --- 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; | |
|       } | |
| --- 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 | |
|    | |
| --- 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 | |
| --- 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_ */ | |
| --- 26,30 ---- | |
|      looks for to find the patch level (for the sccs version string). */ | |
|    | |
| ! #define PATCHLEVEL 17 | |
|    | |
|   #endif /* _PATCHLEVEL_H_ */
 | |
| 
 |