5 changed files with 511 additions and 0 deletions
@ -0,0 +1,239 @@ |
|||||
|
BASH PATCH REPORT |
||||
|
================= |
||||
|
|
||||
|
Bash-Release: 5.0 |
||||
|
Patch-ID: bash50-003 |
||||
|
|
||||
|
Bug-Reported-by: Andrew Church <achurch+bash@achurch.org> |
||||
|
Bug-Reference-ID: <5c534aa2.04371@msgid.achurch.org> |
||||
|
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00276.html |
||||
|
|
||||
|
Bug-Description: |
||||
|
|
||||
|
There are several incompatibilities in how bash-5.0 processes pathname |
||||
|
expansion (globbing) of filename arguments that have backslashes in the |
||||
|
directory portion. |
||||
|
|
||||
|
Patch (apply with `patch -p0'): |
||||
|
|
||||
|
*** ../bash-5.0-patched/lib/glob/glob_loop.c 2019-01-16 16:13:21.000000000 -0500 |
||||
|
--- lib/glob/glob_loop.c 2019-02-01 09:45:11.000000000 -0500 |
||||
|
*************** |
||||
|
*** 27,34 **** |
||||
|
register const GCHAR *p; |
||||
|
register GCHAR c; |
||||
|
! int bopen; |
||||
|
|
||||
|
p = pattern; |
||||
|
! bopen = 0; |
||||
|
|
||||
|
while ((c = *p++) != L('\0')) |
||||
|
--- 27,34 ---- |
||||
|
register const GCHAR *p; |
||||
|
register GCHAR c; |
||||
|
! int bopen, bsquote; |
||||
|
|
||||
|
p = pattern; |
||||
|
! bopen = bsquote = 0; |
||||
|
|
||||
|
while ((c = *p++) != L('\0')) |
||||
|
*************** |
||||
|
*** 56,66 **** |
||||
|
case L('\\'): |
||||
|
/* Don't let the pattern end in a backslash (GMATCH returns no match |
||||
|
! if the pattern ends in a backslash anyway), but otherwise return 1, |
||||
|
! since the matching engine uses backslash as an escape character |
||||
|
! and it can be removed. */ |
||||
|
! return (*p != L('\0')); |
||||
|
} |
||||
|
|
||||
|
! return 0; |
||||
|
} |
||||
|
|
||||
|
--- 56,75 ---- |
||||
|
case L('\\'): |
||||
|
/* Don't let the pattern end in a backslash (GMATCH returns no match |
||||
|
! if the pattern ends in a backslash anyway), but otherwise note that |
||||
|
! we have seen this, since the matching engine uses backslash as an |
||||
|
! escape character and it can be removed. We return 2 later if we |
||||
|
! have seen only backslash-escaped characters, so interested callers |
||||
|
! know they can shortcut and just dequote the pathname. */ |
||||
|
! if (*p != L('\0')) |
||||
|
! { |
||||
|
! p++; |
||||
|
! bsquote = 1; |
||||
|
! continue; |
||||
|
! } |
||||
|
! else /* (*p == L('\0')) */ |
||||
|
! return 0; |
||||
|
} |
||||
|
|
||||
|
! return bsquote ? 2 : 0; |
||||
|
} |
||||
|
|
||||
|
*** ../bash-5.0-patched/lib/glob/glob.h 2013-10-28 14:46:12.000000000 -0400 |
||||
|
--- lib/glob/glob.h 2019-03-07 11:06:47.000000000 -0500 |
||||
|
*************** |
||||
|
*** 31,34 **** |
||||
|
--- 31,35 ---- |
||||
|
#define GX_ADDCURDIR 0x200 /* internal -- add passed directory name */ |
||||
|
#define GX_GLOBSTAR 0x400 /* turn on special handling of ** */ |
||||
|
+ #define GX_RECURSE 0x800 /* internal -- glob_filename called recursively */ |
||||
|
|
||||
|
extern int glob_pattern_p __P((const char *)); |
||||
|
*** ../bash-5.0-patched/lib/glob/glob.c 2018-09-20 10:53:23.000000000 -0400 |
||||
|
--- lib/glob/glob.c 2019-03-07 14:23:43.000000000 -0500 |
||||
|
*************** |
||||
|
*** 1062,1066 **** |
||||
|
unsigned int directory_len; |
||||
|
int free_dirname; /* flag */ |
||||
|
! int dflags; |
||||
|
|
||||
|
result = (char **) malloc (sizeof (char *)); |
||||
|
--- 1078,1082 ---- |
||||
|
unsigned int directory_len; |
||||
|
int free_dirname; /* flag */ |
||||
|
! int dflags, hasglob; |
||||
|
|
||||
|
result = (char **) malloc (sizeof (char *)); |
||||
|
*************** |
||||
|
*** 1111,1117 **** |
||||
|
} |
||||
|
|
||||
|
/* If directory_name contains globbing characters, then we |
||||
|
! have to expand the previous levels. Just recurse. */ |
||||
|
! if (directory_len > 0 && glob_pattern_p (directory_name)) |
||||
|
{ |
||||
|
char **directories, *d, *p; |
||||
|
--- 1127,1136 ---- |
||||
|
} |
||||
|
|
||||
|
+ hasglob = 0; |
||||
|
/* If directory_name contains globbing characters, then we |
||||
|
! have to expand the previous levels. Just recurse. |
||||
|
! If glob_pattern_p returns != [0,1] we have a pattern that has backslash |
||||
|
! quotes but no unquoted glob pattern characters. We dequote it below. */ |
||||
|
! if (directory_len > 0 && (hasglob = glob_pattern_p (directory_name)) == 1) |
||||
|
{ |
||||
|
char **directories, *d, *p; |
||||
|
*************** |
||||
|
*** 1176,1180 **** |
||||
|
d[directory_len - 1] = '\0'; |
||||
|
|
||||
|
! directories = glob_filename (d, dflags); |
||||
|
|
||||
|
if (free_dirname) |
||||
|
--- 1195,1199 ---- |
||||
|
d[directory_len - 1] = '\0'; |
||||
|
|
||||
|
! directories = glob_filename (d, dflags|GX_RECURSE); |
||||
|
|
||||
|
if (free_dirname) |
||||
|
*************** |
||||
|
*** 1333,1336 **** |
||||
|
--- 1352,1369 ---- |
||||
|
return (NULL); |
||||
|
} |
||||
|
+ /* If we have a directory name with quoted characters, and we are |
||||
|
+ being called recursively to glob the directory portion of a pathname, |
||||
|
+ we need to dequote the directory name before returning it so the |
||||
|
+ caller can read the directory */ |
||||
|
+ if (directory_len > 0 && hasglob == 2 && (flags & GX_RECURSE) != 0) |
||||
|
+ { |
||||
|
+ dequote_pathname (directory_name); |
||||
|
+ directory_len = strlen (directory_name); |
||||
|
+ } |
||||
|
+ |
||||
|
+ /* We could check whether or not the dequoted directory_name is a |
||||
|
+ directory and return it here, returning the original directory_name |
||||
|
+ if not, but we don't do that yet. I'm not sure it matters. */ |
||||
|
+ |
||||
|
/* Handle GX_MARKDIRS here. */ |
||||
|
result[0] = (char *) malloc (directory_len + 1); |
||||
|
*** ../bash-5.0-patched/pathexp.c 2018-04-29 17:44:48.000000000 -0400 |
||||
|
--- pathexp.c 2019-01-31 20:19:41.000000000 -0500 |
||||
|
*************** |
||||
|
*** 66,74 **** |
||||
|
register int c; |
||||
|
char *send; |
||||
|
! int open; |
||||
|
|
||||
|
DECLARE_MBSTATE; |
||||
|
|
||||
|
! open = 0; |
||||
|
send = string + strlen (string); |
||||
|
|
||||
|
--- 66,74 ---- |
||||
|
register int c; |
||||
|
char *send; |
||||
|
! int open, bsquote; |
||||
|
|
||||
|
DECLARE_MBSTATE; |
||||
|
|
||||
|
! open = bsquote = 0; |
||||
|
send = string + strlen (string); |
||||
|
|
||||
|
*************** |
||||
|
*** 101,105 **** |
||||
|
globbing. */ |
||||
|
case '\\': |
||||
|
! return (*string != 0); |
||||
|
|
||||
|
case CTLESC: |
||||
|
--- 101,112 ---- |
||||
|
globbing. */ |
||||
|
case '\\': |
||||
|
! if (*string != '\0' && *string != '/') |
||||
|
! { |
||||
|
! bsquote = 1; |
||||
|
! string++; |
||||
|
! continue; |
||||
|
! } |
||||
|
! else if (*string == 0) |
||||
|
! return (0); |
||||
|
|
||||
|
case CTLESC: |
||||
|
*************** |
||||
|
*** 118,122 **** |
||||
|
#endif |
||||
|
} |
||||
|
! return (0); |
||||
|
} |
||||
|
|
||||
|
--- 125,130 ---- |
||||
|
#endif |
||||
|
} |
||||
|
! |
||||
|
! return (bsquote ? 2 : 0); |
||||
|
} |
||||
|
|
||||
|
*** ../bash-5.0-patched/bashline.c 2019-01-16 16:13:21.000000000 -0500 |
||||
|
--- bashline.c 2019-02-22 09:29:08.000000000 -0500 |
||||
|
*************** |
||||
|
*** 3753,3757 **** |
||||
|
|
||||
|
case '\\': |
||||
|
! if (*string == 0) |
||||
|
return (0); |
||||
|
} |
||||
|
--- 3766,3770 ---- |
||||
|
|
||||
|
case '\\': |
||||
|
! if (*string++ == 0) |
||||
|
return (0); |
||||
|
} |
||||
|
*** ../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 2 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
||||
|
--- 26,30 ---- |
||||
|
looks for to find the patch level (for the sccs version string). */ |
||||
|
|
||||
|
! #define PATCHLEVEL 3 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
@ -0,0 +1,53 @@ |
|||||
|
BASH PATCH REPORT |
||||
|
================= |
||||
|
|
||||
|
Bash-Release: 5.0 |
||||
|
Patch-ID: bash50-004 |
||||
|
|
||||
|
Bug-Reported-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net> |
||||
|
Bug-Reference-ID: <87lg0g8aiw.fsf@fifthhorseman.net> |
||||
|
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-04/msg00076.html |
||||
|
|
||||
|
Bug-Description: |
||||
|
|
||||
|
In bash-5.0, the `wait' builtin without arguments waits for all children of the |
||||
|
shell. This includes children it `inherited' at shell invocation time. This |
||||
|
patch modifies the behavior to not wait for these inherited children, some |
||||
|
of which might be long-lived. |
||||
|
|
||||
|
Patch (apply with `patch -p0'): |
||||
|
|
||||
|
*** ../bash-5.0-patched/jobs.c 2018-12-06 11:44:34.000000000 -0500 |
||||
|
--- jobs.c 2019-04-12 15:15:10.000000000 -0400 |
||||
|
*************** |
||||
|
*** 2489,2496 **** |
||||
|
wait_procsubs (); |
||||
|
reap_procsubs (); |
||||
|
! #if 1 |
||||
|
/* We don't want to wait indefinitely if we have stopped children. */ |
||||
|
- /* XXX - should add a loop that goes through the list of process |
||||
|
- substitutions and waits for each proc in turn before this code. */ |
||||
|
if (any_stopped == 0) |
||||
|
{ |
||||
|
--- 2490,2495 ---- |
||||
|
wait_procsubs (); |
||||
|
reap_procsubs (); |
||||
|
! #if 0 |
||||
|
/* We don't want to wait indefinitely if we have stopped children. */ |
||||
|
if (any_stopped == 0) |
||||
|
{ |
||||
|
*** ../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 3 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
||||
|
--- 26,30 ---- |
||||
|
looks for to find the patch level (for the sccs version string). */ |
||||
|
|
||||
|
! #define PATCHLEVEL 4 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
@ -0,0 +1,110 @@ |
|||||
|
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_ */ |
@ -0,0 +1,47 @@ |
|||||
|
BASH PATCH REPORT |
||||
|
================= |
||||
|
|
||||
|
Bash-Release: 5.0 |
||||
|
Patch-ID: bash50-006 |
||||
|
|
||||
|
Bug-Reported-by: Tomas Mozes <hydrapolic@gmail.com> |
||||
|
Bug-Reference-ID: <CAG6MAzQumLU2vhnmr1UrYAUQAFW5Yo8hfM_sEibX9RJQWJkRrA@mail.gmail.com> |
||||
|
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-03/msg00037.html |
||||
|
|
||||
|
Bug-Description: |
||||
|
|
||||
|
Bash-5.0 did not build successfully if SYSLOG_HISTORY was defined without |
||||
|
also defining SYSLOG_SHOPT. |
||||
|
|
||||
|
Patch (apply with `patch -p0'): |
||||
|
|
||||
|
*** ../bash-5.0-patched/builtins/shopt.def 2018-10-05 14:49:02.000000000 -0400 |
||||
|
--- builtins/shopt.def 2019-01-23 09:55:22.000000000 -0500 |
||||
|
*************** |
||||
|
*** 123,127 **** |
||||
|
#endif |
||||
|
|
||||
|
! #if defined (SYSLOG_HISTORY) && defined (SYSLOG_SHOPT) |
||||
|
extern int syslog_history; |
||||
|
#endif |
||||
|
--- 123,127 ---- |
||||
|
#endif |
||||
|
|
||||
|
! #if defined (SYSLOG_HISTORY) |
||||
|
extern int syslog_history; |
||||
|
#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 5 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
||||
|
--- 26,30 ---- |
||||
|
looks for to find the patch level (for the sccs version string). */ |
||||
|
|
||||
|
! #define PATCHLEVEL 6 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
@ -0,0 +1,62 @@ |
|||||
|
BASH PATCH REPORT |
||||
|
================= |
||||
|
|
||||
|
Bash-Release: 5.0 |
||||
|
Patch-ID: bash50-007 |
||||
|
|
||||
|
Bug-Reported-by: Grisha Levit <grishalevit@gmail.com> |
||||
|
Bug-Reference-ID: <CAMu=BroHapG1AS3xB5SQaCX2XKu=-E2Ob9uW6LNuHvd=YohrDw@mail.gmail.com> |
||||
|
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-02/msg00067.html |
||||
|
|
||||
|
Bug-Description: |
||||
|
|
||||
|
Running `exec' when job control was disabled, even temporarily, but after it |
||||
|
had been initialized, could leave the terminal in the wrong process group for |
||||
|
the executed process. |
||||
|
|
||||
|
Patch (apply with `patch -p0'): |
||||
|
|
||||
|
*** ../bash-5.0-patched/jobs.c 2018-12-06 11:44:34.000000000 -0500 |
||||
|
--- jobs.c 2019-04-12 15:15:10.000000000 -0400 |
||||
|
*************** |
||||
|
*** 4838,4850 **** |
||||
|
{ |
||||
|
if (job_control) |
||||
|
! { |
||||
|
! terminate_stopped_jobs (); |
||||
|
|
||||
|
! if (original_pgrp >= 0) |
||||
|
! give_terminal_to (original_pgrp, 1); |
||||
|
! } |
||||
|
|
||||
|
! if (original_pgrp >= 0) |
||||
|
! setpgid (0, original_pgrp); |
||||
|
} |
||||
|
|
||||
|
--- 4838,4848 ---- |
||||
|
{ |
||||
|
if (job_control) |
||||
|
! terminate_stopped_jobs (); |
||||
|
|
||||
|
! if (original_pgrp >= 0 && terminal_pgrp != original_pgrp) |
||||
|
! give_terminal_to (original_pgrp, 1); |
||||
|
|
||||
|
! if (original_pgrp >= 0 && setpgid (0, original_pgrp) == 0) |
||||
|
! shell_pgrp = original_pgrp; |
||||
|
} |
||||
|
|
||||
|
*** ../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 6 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
||||
|
--- 26,30 ---- |
||||
|
looks for to find the patch level (for the sccs version string). */ |
||||
|
|
||||
|
! #define PATCHLEVEL 7 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
Loading…
Reference in new issue