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.
		
		
		
		
		
			
		
			
				
					
					
						
							110 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							110 lines
						
					
					
						
							3.6 KiB
						
					
					
				
											     BASH PATCH REPORT
							 | 
						|
											     =================
							 | 
						|
								
							 | 
						|
								Bash-Release:	5.0
							 | 
						|
								Patch-ID:	bash50-005
							 | 
						|
								
							 | 
						|
								Bug-Reported-by:	Brad Spencer <bspencer@blackberry.com>
							 | 
						|
								Bug-Reference-ID:	<1b993ff2-ce4f-662a-6be4-393457362e47@blackberry.com>
							 | 
						|
								Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00250.html
							 | 
						|
								
							 | 
						|
								Bug-Description:
							 | 
						|
								
							 | 
						|
								In certain cases, bash optimizes out a fork() call too early and prevents
							 | 
						|
								traps from running.
							 | 
						|
								
							 | 
						|
								Patch (apply with `patch -p0'):
							 | 
						|
								
							 | 
						|
								*** ../bash-5.0-patched/command.h	2018-07-20 21:16:31.000000000 -0400
							 | 
						|
								--- command.h	2019-02-20 11:09:36.000000000 -0500
							 | 
						|
								***************
							 | 
						|
								*** 187,190 ****
							 | 
						|
								--- 188,192 ----
							 | 
						|
								  #define CMD_LASTPIPE	    0x2000
							 | 
						|
								  #define CMD_STDPATH	    0x4000	/* use standard path for command lookup */
							 | 
						|
								+ #define CMD_TRY_OPTIMIZING  0x8000	/* try to optimize this simple command */
							 | 
						|
								  
							 | 
						|
								  /* What a command looks like. */
							 | 
						|
								*** ../bash-5.0-patched/builtins/evalstring.c	2018-12-26 11:19:21.000000000 -0500
							 | 
						|
								--- builtins/evalstring.c	2019-01-29 14:15:19.000000000 -0500
							 | 
						|
								***************
							 | 
						|
								*** 101,104 ****
							 | 
						|
								--- 101,113 ----
							 | 
						|
								  }
							 | 
						|
								  
							 | 
						|
								+ int
							 | 
						|
								+ can_optimize_connection (command)
							 | 
						|
								+      COMMAND *command;
							 | 
						|
								+ {
							 | 
						|
								+   return (*bash_input.location.string == '\0' &&
							 | 
						|
								+ 	  (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') &&
							 | 
						|
								+ 	  command->value.Connection->second->type == cm_simple);
							 | 
						|
								+ }
							 | 
						|
								+ 
							 | 
						|
								  void
							 | 
						|
								  optimize_fork (command)
							 | 
						|
								***************
							 | 
						|
								*** 106,110 ****
							 | 
						|
								  {
							 | 
						|
								    if (command->type == cm_connection &&
							 | 
						|
								!       (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR) &&
							 | 
						|
								        should_suppress_fork (command->value.Connection->second))
							 | 
						|
								      {
							 | 
						|
								--- 115,120 ----
							 | 
						|
								  {
							 | 
						|
								    if (command->type == cm_connection &&
							 | 
						|
								!       (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') &&
							 | 
						|
								!       (command->value.Connection->second->flags & CMD_TRY_OPTIMIZING) &&
							 | 
						|
								        should_suppress_fork (command->value.Connection->second))
							 | 
						|
								      {
							 | 
						|
								***************
							 | 
						|
								*** 413,418 ****
							 | 
						|
								  		  command->value.Simple->flags |= CMD_NO_FORK;
							 | 
						|
								  		}
							 | 
						|
								! 	      else if (command->type == cm_connection)
							 | 
						|
								! 		optimize_fork (command);
							 | 
						|
								  #endif /* ONESHOT */
							 | 
						|
								  
							 | 
						|
								--- 423,438 ----
							 | 
						|
								  		  command->value.Simple->flags |= CMD_NO_FORK;
							 | 
						|
								  		}
							 | 
						|
								! 
							 | 
						|
								! 	      /* Can't optimize forks out here execept for simple commands.
							 | 
						|
								! 		 This knows that the parser sets up commands as left-side heavy
							 | 
						|
								! 		 (&& and || are left-associative) and after the single parse,
							 | 
						|
								! 		 if we are at the end of the command string, the last in a
							 | 
						|
								! 		 series of connection commands is
							 | 
						|
								! 		 command->value.Connection->second. */
							 | 
						|
								! 	      else if (command->type == cm_connection && can_optimize_connection (command))
							 | 
						|
								! 		{
							 | 
						|
								! 		  command->value.Connection->second->flags |= CMD_TRY_OPTIMIZING;
							 | 
						|
								! 		  command->value.Connection->second->value.Simple->flags |= CMD_TRY_OPTIMIZING;
							 | 
						|
								! 		}
							 | 
						|
								  #endif /* ONESHOT */
							 | 
						|
								  
							 | 
						|
								*** ../bash-5.0-patched/execute_cmd.c	2018-12-05 09:05:14.000000000 -0500
							 | 
						|
								--- execute_cmd.c	2019-01-25 15:59:00.000000000 -0500
							 | 
						|
								***************
							 | 
						|
								*** 2768,2771 ****
							 | 
						|
								--- 2768,2773 ----
							 | 
						|
								  	   (exec_result != EXECUTION_SUCCESS)))
							 | 
						|
								  	{
							 | 
						|
								+ 	  optimize_fork (command);
							 | 
						|
								+ 
							 | 
						|
								  	  second = command->value.Connection->second;
							 | 
						|
								  	  if (ignore_return && second)
							 | 
						|
								*** ../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 4
							 | 
						|
								  
							 | 
						|
								  #endif /* _PATCHLEVEL_H_ */
							 | 
						|
								--- 26,30 ----
							 | 
						|
								     looks for to find the patch level (for the sccs version string). */
							 | 
						|
								  
							 | 
						|
								! #define PATCHLEVEL 5
							 | 
						|
								  
							 | 
						|
								  #endif /* _PATCHLEVEL_H_ */
							 | 
						|
								
							 |