utils/bash: Import upstream patches for 5.0lilik-openwrt-22.03
@ -0,0 +1,166 @@ | |||
BASH PATCH REPORT | |||
================= | |||
Bash-Release: 5.0 | |||
Patch-ID: bash50-001 | |||
Bug-Reported-by: axel@freakout.de | |||
Bug-Reference-ID: <201901082050.x08KoShS006731@bongo.freakout.de> | |||
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00079.html | |||
Bug-Description: | |||
Under certain circumstances, the glob expansion code did not remove | |||
backslashes escaping characters in directory names (or portions of a | |||
pattern preceding a slash). | |||
Patch (apply with `patch -p0'): | |||
*** a/bashline.c 2018-11-27 13:20:16.000000000 -0500 | |||
--- b/bashline.c 2019-01-16 16:06:03.000000000 -0500 | |||
*************** | |||
*** 232,235 **** | |||
--- 232,236 ---- | |||
static int bash_possible_command_completions __P((int, int)); | |||
+ static int completion_glob_pattern __P((char *)); | |||
static char *glob_complete_word __P((const char *, int)); | |||
static int bash_glob_completion_internal __P((int)); | |||
*************** | |||
*** 1742,1746 **** | |||
/* This could be a globbing pattern, so try to expand it using pathname | |||
expansion. */ | |||
! if (!matches && glob_pattern_p (text)) | |||
{ | |||
matches = rl_completion_matches (text, glob_complete_word); | |||
--- 1743,1747 ---- | |||
/* This could be a globbing pattern, so try to expand it using pathname | |||
expansion. */ | |||
! if (!matches && completion_glob_pattern ((char *)text)) | |||
{ | |||
matches = rl_completion_matches (text, glob_complete_word); | |||
*************** | |||
*** 1851,1855 **** | |||
} | |||
! globpat = glob_pattern_p (hint_text); | |||
/* If this is an absolute program name, do not check it against | |||
--- 1852,1856 ---- | |||
} | |||
! globpat = completion_glob_pattern ((char *)hint_text); | |||
/* If this is an absolute program name, do not check it against | |||
*************** | |||
*** 3714,3717 **** | |||
--- 3715,3773 ---- | |||
} | |||
+ static int | |||
+ completion_glob_pattern (string) | |||
+ char *string; | |||
+ { | |||
+ register int c; | |||
+ char *send; | |||
+ int open; | |||
+ | |||
+ DECLARE_MBSTATE; | |||
+ | |||
+ open = 0; | |||
+ send = string + strlen (string); | |||
+ | |||
+ while (c = *string++) | |||
+ { | |||
+ switch (c) | |||
+ { | |||
+ case '?': | |||
+ case '*': | |||
+ return (1); | |||
+ | |||
+ case '[': | |||
+ open++; | |||
+ continue; | |||
+ | |||
+ case ']': | |||
+ if (open) | |||
+ return (1); | |||
+ continue; | |||
+ | |||
+ case '+': | |||
+ case '@': | |||
+ case '!': | |||
+ if (*string == '(') /*)*/ | |||
+ return (1); | |||
+ continue; | |||
+ | |||
+ case '\\': | |||
+ if (*string == 0) | |||
+ return (0); | |||
+ } | |||
+ | |||
+ /* Advance one fewer byte than an entire multibyte character to | |||
+ account for the auto-increment in the loop above. */ | |||
+ #ifdef HANDLE_MULTIBYTE | |||
+ string--; | |||
+ ADVANCE_CHAR_P (string, send - string); | |||
+ string++; | |||
+ #else | |||
+ ADVANCE_CHAR_P (string, send - string); | |||
+ #endif | |||
+ } | |||
+ return (0); | |||
+ } | |||
+ | |||
static char *globtext; | |||
static char *globorig; | |||
*************** | |||
*** 3878,3882 **** | |||
} | |||
! if (t && glob_pattern_p (t) == 0) | |||
rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */ | |||
FREE (t); | |||
--- 3934,3938 ---- | |||
} | |||
! if (t && completion_glob_pattern (t) == 0) | |||
rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */ | |||
FREE (t); | |||
*** a/lib/glob/glob_loop.c 2018-12-31 13:35:15.000000000 -0500 | |||
--- b/lib/glob/glob_loop.c 2019-01-09 09:44:36.000000000 -0500 | |||
*************** | |||
*** 55,59 **** | |||
case L('\\'): | |||
- #if 0 | |||
/* 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, | |||
--- 55,58 ---- | |||
*************** | |||
*** 61,69 **** | |||
and it can be removed. */ | |||
return (*p != L('\0')); | |||
- #else | |||
- /* The pattern may not end with a backslash. */ | |||
- if (*p++ == L('\0')) | |||
- return 0; | |||
- #endif | |||
} | |||
--- 60,63 ---- | |||
*** 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 0 | |||
#endif /* _PATCHLEVEL_H_ */ | |||
--- 26,30 ---- | |||
looks for to find the patch level (for the sccs version string). */ | |||
! #define PATCHLEVEL 1 | |||
#endif /* _PATCHLEVEL_H_ */ |
@ -0,0 +1,113 @@ | |||
BASH PATCH REPORT | |||
================= | |||
Bash-Release: 5.0 | |||
Patch-ID: bash50-002 | |||
Bug-Reported-by: Ante Peric <synthmeat@gmail.com> | |||
Bug-Reference-ID: <B7E3B567-2467-4F7B-B6B9-CA4E75A9C93F@gmail.com> | |||
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00095.html | |||
Bug-Description: | |||
When an alias value ends with an unquoted literal tab (not part of a quoted | |||
string or comment), alias expansion cannot correctly detect the end of the | |||
alias value after expanding it. | |||
Patch (apply with `patch -p0'): | |||
*** a/parser.h 2018-12-28 19:11:18.000000000 -0500 | |||
--- b/parser.h 2019-01-11 15:13:03.000000000 -0500 | |||
*************** | |||
*** 48,51 **** | |||
--- 48,52 ---- | |||
#define PST_REDIRLIST 0x080000 /* parsing a list of redirections preceding a simple command name */ | |||
#define PST_COMMENT 0x100000 /* parsing a shell comment; used by aliases */ | |||
+ #define PST_ENDALIAS 0x200000 /* just finished expanding and consuming an alias */ | |||
/* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */ | |||
*** a/parse.y 2019-01-02 13:57:34.000000000 -0500 | |||
--- b/parse.y 2019-01-14 08:23:31.000000000 -0500 | |||
*************** | |||
*** 2558,2567 **** | |||
pushed_string_list->flags != PSH_DPAREN && | |||
(parser_state & PST_COMMENT) == 0 && | |||
shell_input_line_index > 0 && | |||
! shell_input_line[shell_input_line_index-1] != ' ' && | |||
shell_input_line[shell_input_line_index-1] != '\n' && | |||
shellmeta (shell_input_line[shell_input_line_index-1]) == 0 && | |||
(current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"')) | |||
{ | |||
return ' '; /* END_ALIAS */ | |||
} | |||
--- 2558,2569 ---- | |||
pushed_string_list->flags != PSH_DPAREN && | |||
(parser_state & PST_COMMENT) == 0 && | |||
+ (parser_state & PST_ENDALIAS) == 0 && /* only once */ | |||
shell_input_line_index > 0 && | |||
! shellblank (shell_input_line[shell_input_line_index-1]) == 0 && | |||
shell_input_line[shell_input_line_index-1] != '\n' && | |||
shellmeta (shell_input_line[shell_input_line_index-1]) == 0 && | |||
(current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"')) | |||
{ | |||
+ parser_state |= PST_ENDALIAS; | |||
return ' '; /* END_ALIAS */ | |||
} | |||
*************** | |||
*** 2572,2575 **** | |||
--- 2574,2578 ---- | |||
if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE) | |||
{ | |||
+ parser_state &= ~PST_ENDALIAS; | |||
pop_string (); | |||
uc = shell_input_line[shell_input_line_index]; | |||
*** a/y.tab.c 2019-01-02 13:57:43.000000000 -0500 | |||
--- b/y.tab.c 2019-01-14 08:39:23.000000000 -0500 | |||
*************** | |||
*** 4874,4883 **** | |||
pushed_string_list->flags != PSH_DPAREN && | |||
(parser_state & PST_COMMENT) == 0 && | |||
shell_input_line_index > 0 && | |||
! shell_input_line[shell_input_line_index-1] != ' ' && | |||
shell_input_line[shell_input_line_index-1] != '\n' && | |||
shellmeta (shell_input_line[shell_input_line_index-1]) == 0 && | |||
(current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"')) | |||
{ | |||
return ' '; /* END_ALIAS */ | |||
} | |||
--- 4874,4885 ---- | |||
pushed_string_list->flags != PSH_DPAREN && | |||
(parser_state & PST_COMMENT) == 0 && | |||
+ (parser_state & PST_ENDALIAS) == 0 && /* only once */ | |||
shell_input_line_index > 0 && | |||
! shellblank (shell_input_line[shell_input_line_index-1]) == 0 && | |||
shell_input_line[shell_input_line_index-1] != '\n' && | |||
shellmeta (shell_input_line[shell_input_line_index-1]) == 0 && | |||
(current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"')) | |||
{ | |||
+ parser_state |= PST_ENDALIAS; | |||
return ' '; /* END_ALIAS */ | |||
} | |||
*************** | |||
*** 4888,4891 **** | |||
--- 4890,4894 ---- | |||
if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE) | |||
{ | |||
+ parser_state &= ~PST_ENDALIAS; | |||
pop_string (); | |||
uc = shell_input_line[shell_input_line_index]; | |||
*** 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 1 | |||
#endif /* _PATCHLEVEL_H_ */ | |||
--- 26,30 ---- | |||
looks for to find the patch level (for the sccs version string). */ | |||
! #define PATCHLEVEL 2 | |||
#endif /* _PATCHLEVEL_H_ */ |