vanhofen
6 years ago
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