4 changed files with 341 additions and 0 deletions
@ -0,0 +1,68 @@ |
|||||
|
BASH PATCH REPORT |
||||
|
================= |
||||
|
|
||||
|
Bash-Release: 5.0 |
||||
|
Patch-ID: bash50-008 |
||||
|
|
||||
|
Bug-Reported-by: Michael Albinus <michael.albinus@gmx.de> |
||||
|
Bug-Reference-ID: <87bm36k3kz.fsf@gmx.de> |
||||
|
Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2019-02/msg00111.html |
||||
|
|
||||
|
Bug-Description: |
||||
|
|
||||
|
When HISTSIZE is set to 0, history expansion can leave the history length |
||||
|
set to an incorrect value, leading to subsequent attempts to access invalid |
||||
|
memory. |
||||
|
|
||||
|
Patch (apply with `patch -p0'): |
||||
|
|
||||
|
*** ../bash-5.0-patched/bashhist.c 2018-07-05 22:41:14.000000000 -0400 |
||||
|
--- bashhist.c 2019-02-20 16:20:04.000000000 -0500 |
||||
|
*************** |
||||
|
*** 561,573 **** |
||||
|
if (!history_expansion_inhibited && history_expansion && history_expansion_p (line)) |
||||
|
{ |
||||
|
/* If we are expanding the second or later line of a multi-line |
||||
|
command, decrease history_length so references to history expansions |
||||
|
in these lines refer to the previous history entry and not the |
||||
|
current command. */ |
||||
|
if (history_length > 0 && command_oriented_history && current_command_first_line_saved && current_command_line_count > 1) |
||||
|
history_length--; |
||||
|
expanded = history_expand (line, &history_value); |
||||
|
if (history_length >= 0 && command_oriented_history && current_command_first_line_saved && current_command_line_count > 1) |
||||
|
! history_length++; |
||||
|
|
||||
|
if (expanded) |
||||
|
--- 561,576 ---- |
||||
|
if (!history_expansion_inhibited && history_expansion && history_expansion_p (line)) |
||||
|
{ |
||||
|
+ int old_len; |
||||
|
+ |
||||
|
/* If we are expanding the second or later line of a multi-line |
||||
|
command, decrease history_length so references to history expansions |
||||
|
in these lines refer to the previous history entry and not the |
||||
|
current command. */ |
||||
|
+ old_len = history_length; |
||||
|
if (history_length > 0 && command_oriented_history && current_command_first_line_saved && current_command_line_count > 1) |
||||
|
history_length--; |
||||
|
expanded = history_expand (line, &history_value); |
||||
|
if (history_length >= 0 && command_oriented_history && current_command_first_line_saved && current_command_line_count > 1) |
||||
|
! history_length = old_len; |
||||
|
|
||||
|
if (expanded) |
||||
|
|
||||
|
*** ../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 7 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
||||
|
--- 26,30 ---- |
||||
|
looks for to find the patch level (for the sccs version string). */ |
||||
|
|
||||
|
! #define PATCHLEVEL 8 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
@ -0,0 +1,42 @@ |
|||||
|
BASH PATCH REPORT |
||||
|
================= |
||||
|
|
||||
|
Bash-Release: 5.0 |
||||
|
Patch-ID: bash50-009 |
||||
|
|
||||
|
Bug-Reported-by: chet.ramey@case.edu |
||||
|
Bug-Reference-ID: |
||||
|
Bug-Reference-URL: |
||||
|
|
||||
|
Bug-Description: |
||||
|
|
||||
|
The history file reading code doesn't close the file descriptor open to |
||||
|
the history file when it encounters a zero-length file. |
||||
|
|
||||
|
Patch (apply with `patch -p0'): |
||||
|
|
||||
|
*** ../bash-5.0-patched/lib/readline/histfile.c 2018-06-11 09:14:52.000000000 -0400 |
||||
|
--- lib/readline/histfile.c 2019-05-16 15:55:57.000000000 -0400 |
||||
|
*************** |
||||
|
*** 306,309 **** |
||||
|
--- 312,316 ---- |
||||
|
{ |
||||
|
free (input); |
||||
|
+ close (file); |
||||
|
return 0; /* don't waste time if we don't have to */ |
||||
|
} |
||||
|
*** ../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 8 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
||||
|
--- 26,30 ---- |
||||
|
looks for to find the patch level (for the sccs version string). */ |
||||
|
|
||||
|
! #define PATCHLEVEL 9 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
@ -0,0 +1,172 @@ |
|||||
|
BASH PATCH REPORT |
||||
|
================= |
||||
|
|
||||
|
Bash-Release: 5.0 |
||||
|
Patch-ID: bash50-010 |
||||
|
|
||||
|
Bug-Reported-by: Thorsten Glaser <tg@mirbsd.de> |
||||
|
Bug-Reference-ID: <156622962831.19438.16374961114836556294.reportbug@tglase.lan.tarent.de> |
||||
|
Bug-Reference-URL: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=935115 |
||||
|
|
||||
|
Bug-Description: |
||||
|
|
||||
|
Bash-5.0 changed the way assignment statements preceding special builtins |
||||
|
and shell functions were handled in posix mode. They automatically created |
||||
|
or modified global variables instead of modifying existing local variables |
||||
|
as in bash-4.4. |
||||
|
|
||||
|
The bash-4.4 posix-mode semantics were buggy, and resulted in creating |
||||
|
local variables where they were not intended and modifying global variables |
||||
|
and local variables simultaneously. |
||||
|
|
||||
|
The bash-5.0 changes were intended to fix this issue, but did not preserve |
||||
|
enough backwards compatibility. The posix standard also changed what it |
||||
|
required in these cases, so bash-5.0 is not bound by the strict conformance |
||||
|
requirements that existed in previous issues of the standard. |
||||
|
|
||||
|
This patch modifies the bash-5.0 posix mode behavior in an effort to restore |
||||
|
some backwards compatibility and rationalize the behavior in the presence of |
||||
|
local variables. It |
||||
|
|
||||
|
1. Changes the assignment semantics to be more similar to standalone assignment |
||||
|
statements: assignments preceding a function call or special builtin while |
||||
|
executing in a shell function will modify the value of a local variable |
||||
|
with the same name for the duration of the function's execution; |
||||
|
|
||||
|
2. Changes assignments preceding shell function calls or special builtins |
||||
|
from within a shell function to no longer create or modify global variables |
||||
|
in the presence of a local variable with the same name; |
||||
|
|
||||
|
3. Assignment statements preceding a shell function call or special builtin |
||||
|
at the global scope continue to modify the (global) calling environment, |
||||
|
but are unaffected by assignments preceding function calls or special |
||||
|
builtins within a function, as described in item 2. This is also similar |
||||
|
to the behavior of a standalone assignment statement. |
||||
|
|
||||
|
Patch (apply with `patch -p0'): |
||||
|
|
||||
|
*** ../bash-5.0-patched/variables.c 2018-12-18 11:07:21.000000000 -0500 |
||||
|
--- variables.c 2019-08-22 10:53:44.000000000 -0400 |
||||
|
*************** |
||||
|
*** 4461,4467 **** |
||||
|
|
||||
|
/* Take a variable from an assignment statement preceding a posix special |
||||
|
! builtin (including `return') and create a global variable from it. This |
||||
|
! is called from merge_temporary_env, which is only called when in posix |
||||
|
! mode. */ |
||||
|
static void |
||||
|
push_posix_temp_var (data) |
||||
|
--- 4461,4467 ---- |
||||
|
|
||||
|
/* Take a variable from an assignment statement preceding a posix special |
||||
|
! builtin (including `return') and create a variable from it as if a |
||||
|
! standalone assignment statement had been performed. This is called from |
||||
|
! merge_temporary_env, which is only called when in posix mode. */ |
||||
|
static void |
||||
|
push_posix_temp_var (data) |
||||
|
*************** |
||||
|
*** 4473,4486 **** |
||||
|
var = (SHELL_VAR *)data; |
||||
|
|
||||
|
! binding_table = global_variables->table; |
||||
|
! if (binding_table == 0) |
||||
|
! binding_table = global_variables->table = hash_create (VARIABLES_HASH_BUCKETS); |
||||
|
! |
||||
|
! v = bind_variable_internal (var->name, value_cell (var), binding_table, 0, ASS_FORCE|ASS_NOLONGJMP); |
||||
|
|
||||
|
/* global variables are no longer temporary and don't need propagating. */ |
||||
|
! var->attributes &= ~(att_tempvar|att_propagate); |
||||
|
if (v) |
||||
|
! v->attributes |= var->attributes; |
||||
|
|
||||
|
if (find_special_var (var->name) >= 0) |
||||
|
--- 4473,4497 ---- |
||||
|
var = (SHELL_VAR *)data; |
||||
|
|
||||
|
! /* Just like do_assignment_internal(). This makes assignments preceding |
||||
|
! special builtins act like standalone assignment statements when in |
||||
|
! posix mode, satisfying the posix requirement that this affect the |
||||
|
! "current execution environment." */ |
||||
|
! v = bind_variable (var->name, value_cell (var), ASS_FORCE|ASS_NOLONGJMP); |
||||
|
! |
||||
|
! /* If this modifies an existing local variable, v->context will be non-zero. |
||||
|
! If it comes back with v->context == 0, we bound at the global context. |
||||
|
! Set binding_table appropriately. It doesn't matter whether it's correct |
||||
|
! if the variable is local, only that it's not global_variables->table */ |
||||
|
! binding_table = v->context ? shell_variables->table : global_variables->table; |
||||
|
|
||||
|
/* global variables are no longer temporary and don't need propagating. */ |
||||
|
! if (binding_table == global_variables->table) |
||||
|
! var->attributes &= ~(att_tempvar|att_propagate); |
||||
|
! |
||||
|
if (v) |
||||
|
! { |
||||
|
! v->attributes |= var->attributes; |
||||
|
! v->attributes &= ~att_tempvar; /* not a temp var now */ |
||||
|
! } |
||||
|
|
||||
|
if (find_special_var (var->name) >= 0) |
||||
|
*************** |
||||
|
*** 4576,4587 **** |
||||
|
{ |
||||
|
int i; |
||||
|
|
||||
|
tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1); |
||||
|
tempvar_list[tvlist_ind = 0] = 0; |
||||
|
! |
||||
|
! hash_flush (temporary_env, pushf); |
||||
|
! hash_dispose (temporary_env); |
||||
|
temporary_env = (HASH_TABLE *)NULL; |
||||
|
|
||||
|
tempvar_list[tvlist_ind] = 0; |
||||
|
|
||||
|
--- 4587,4601 ---- |
||||
|
{ |
||||
|
int i; |
||||
|
+ HASH_TABLE *disposer; |
||||
|
|
||||
|
tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1); |
||||
|
tempvar_list[tvlist_ind = 0] = 0; |
||||
|
! |
||||
|
! disposer = temporary_env; |
||||
|
temporary_env = (HASH_TABLE *)NULL; |
||||
|
|
||||
|
+ hash_flush (disposer, pushf); |
||||
|
+ hash_dispose (disposer); |
||||
|
+ |
||||
|
tempvar_list[tvlist_ind] = 0; |
||||
|
|
||||
|
*** ../bash-5.0-patched/tests/varenv.right 2018-12-17 15:39:48.000000000 -0500 |
||||
|
--- tests/varenv.right 2019-08-22 16:05:25.000000000 -0400 |
||||
|
*************** |
||||
|
*** 147,153 **** |
||||
|
outside: declare -- var="one" |
||||
|
inside: declare -x var="value" |
||||
|
! outside: declare -x var="value" |
||||
|
! inside: declare -- var="local" |
||||
|
! outside: declare -x var="global" |
||||
|
foo=<unset> environment foo= |
||||
|
foo=foo environment foo=foo |
||||
|
--- 147,153 ---- |
||||
|
outside: declare -- var="one" |
||||
|
inside: declare -x var="value" |
||||
|
! outside: declare -- var="outside" |
||||
|
! inside: declare -x var="global" |
||||
|
! outside: declare -- var="outside" |
||||
|
foo=<unset> environment foo= |
||||
|
foo=foo environment foo=foo |
||||
|
*** ../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 9 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
||||
|
--- 26,30 ---- |
||||
|
looks for to find the patch level (for the sccs version string). */ |
||||
|
|
||||
|
! #define PATCHLEVEL 10 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
@ -0,0 +1,59 @@ |
|||||
|
BASH PATCH REPORT |
||||
|
================= |
||||
|
|
||||
|
Bash-Release: 5.0 |
||||
|
Patch-ID: bash50-011 |
||||
|
|
||||
|
Bug-Reported-by: Matt Whitlock |
||||
|
Bug-Reference-ID: |
||||
|
Bug-Reference-URL: https://savannah.gnu.org/support/?109671 |
||||
|
|
||||
|
Bug-Description: |
||||
|
|
||||
|
The conditional command did not perform appropriate quoted null character |
||||
|
removal on its arguments, causing syntax errors and attempts to stat |
||||
|
invalid pathnames. |
||||
|
|
||||
|
Patch (apply with `patch -p0'): |
||||
|
|
||||
|
*** ../bash-5.0-patched/subst.c 2018-12-22 17:43:37.000000000 -0500 |
||||
|
--- subst.c 2019-04-14 13:25:41.000000000 -0400 |
||||
|
*************** |
||||
|
*** 3626,3630 **** |
||||
|
SPECIAL is 2, this is an rhs argument for the =~ operator, and should |
||||
|
be quoted appropriately for regcomp/regexec. The caller is responsible |
||||
|
! for removing the backslashes if the unquoted word is needed later. */ |
||||
|
char * |
||||
|
cond_expand_word (w, special) |
||||
|
--- 3642,3648 ---- |
||||
|
SPECIAL is 2, this is an rhs argument for the =~ operator, and should |
||||
|
be quoted appropriately for regcomp/regexec. The caller is responsible |
||||
|
! for removing the backslashes if the unquoted word is needed later. In |
||||
|
! any case, since we don't perform word splitting, we need to do quoted |
||||
|
! null character removal. */ |
||||
|
char * |
||||
|
cond_expand_word (w, special) |
||||
|
*************** |
||||
|
*** 3647,3650 **** |
||||
|
--- 3665,3670 ---- |
||||
|
if (special == 0) /* LHS */ |
||||
|
{ |
||||
|
+ if (l->word) |
||||
|
+ word_list_remove_quoted_nulls (l); |
||||
|
dequote_list (l); |
||||
|
r = string_list (l); |
||||
|
*** ../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 10 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
||||
|
--- 26,30 ---- |
||||
|
looks for to find the patch level (for the sccs version string). */ |
||||
|
|
||||
|
! #define PATCHLEVEL 11 |
||||
|
|
||||
|
#endif /* _PATCHLEVEL_H_ */ |
Loading…
Reference in new issue