From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-005

Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl>

			     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
--- b/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
--- b/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
--- b/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
--- 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 4
  
  #endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 5
  
  #endif /* _PATCHLEVEL_H_ */
