|
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'):
|
|
|
|
*** a/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. */
|
|
*** a/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 */
|
|
|
|
*** a/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)
|
|
*** a/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_ */
|