parent
588586c576
commit
c58d3fff91
60
bash-5.2-patch-3.patch
Normal file
60
bash-5.2-patch-3.patch
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
diff --git a/patchlevel.h b/patchlevel.h
|
||||||
|
--- a/patchlevel.h
|
||||||
|
+++ b/patchlevel.h
|
||||||
|
@@ -25,6 +25,6 @@
|
||||||
|
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||||
|
looks for to find the patch level (for the sccs version string). */
|
||||||
|
|
||||||
|
-#define PATCHLEVEL 2
|
||||||
|
+#define PATCHLEVEL 3
|
||||||
|
|
||||||
|
#endif /* _PATCHLEVEL_H_ */
|
||||||
|
diff --git a/print_cmd.c b/print_cmd.c
|
||||||
|
--- a/print_cmd.c
|
||||||
|
+++ b/print_cmd.c
|
||||||
|
@@ -297,10 +297,12 @@ make_command_string_internal (command)
|
||||||
|
case '\n': /* special case this */
|
||||||
|
{
|
||||||
|
char c = command->value.Connection->connector;
|
||||||
|
+ int was_newline;
|
||||||
|
|
||||||
|
s[0] = printing_comsub ? c : ';';
|
||||||
|
s[1] = '\0';
|
||||||
|
|
||||||
|
+ was_newline = deferred_heredocs == 0 && was_heredoc == 0 && c == '\n';
|
||||||
|
if (deferred_heredocs == 0)
|
||||||
|
{
|
||||||
|
if (was_heredoc == 0)
|
||||||
|
@@ -314,6 +316,8 @@ make_command_string_internal (command)
|
||||||
|
|
||||||
|
if (inside_function_def)
|
||||||
|
cprintf ("\n");
|
||||||
|
+ else if (printing_comsub && c == '\n' && was_newline == 0)
|
||||||
|
+ cprintf ("\n"); /* preserve newlines in comsubs but don't double them */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (c == ';')
|
||||||
|
@@ -1365,7 +1369,11 @@ print_function_def (func)
|
||||||
|
cmdcopy->redirects = func_redirects;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- newline ("}");
|
||||||
|
+ {
|
||||||
|
+ /* { */
|
||||||
|
+ newline ("}");
|
||||||
|
+ was_heredoc = 0; /* not printing any here-documents now */
|
||||||
|
+ }
|
||||||
|
|
||||||
|
dispose_command (cmdcopy);
|
||||||
|
}
|
||||||
|
@@ -1442,7 +1450,10 @@ named_function_string (name, command, flags)
|
||||||
|
cmdcopy->redirects = func_redirects;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- newline ("}");
|
||||||
|
+ { /* { */
|
||||||
|
+ newline ("}");
|
||||||
|
+ was_heredoc = 0;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
result = the_printed_command;
|
@ -1,7 +1,18 @@
|
|||||||
|
diff --git a/patchlevel.h b/patchlevel.h
|
||||||
|
--- a/patchlevel.h
|
||||||
|
+++ b/patchlevel.h
|
||||||
|
@@ -25,6 +25,6 @@
|
||||||
|
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||||
|
looks for to find the patch level (for the sccs version string). */
|
||||||
|
|
||||||
|
-#define PATCHLEVEL 3
|
||||||
|
+#define PATCHLEVEL 4
|
||||||
|
|
||||||
|
#endif /* _PATCHLEVEL_H_ */
|
||||||
diff --git a/subst.c b/subst.c
|
diff --git a/subst.c b/subst.c
|
||||||
--- a/subst.c
|
--- a/subst.c
|
||||||
+++ b/subst.c
|
+++ b/subst.c
|
||||||
@@ -1803,6 +1803,9 @@ extract_heredoc_dolbrace_string (string, sindex, quoted, flags)
|
@@ -1798,6 +1798,9 @@ extract_heredoc_dolbrace_string (string, sindex, quoted, flags)
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11,7 +22,7 @@ diff --git a/subst.c b/subst.c
|
|||||||
/* Extract a parameter expansion expression within ${ and } from STRING.
|
/* Extract a parameter expansion expression within ${ and } from STRING.
|
||||||
Obey the Posix.2 rules for finding the ending `}': count braces while
|
Obey the Posix.2 rules for finding the ending `}': count braces while
|
||||||
skipping over enclosed quoted strings and command substitutions.
|
skipping over enclosed quoted strings and command substitutions.
|
||||||
@@ -1833,6 +1836,8 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
|
@@ -1828,6 +1831,8 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
|
||||||
if (quoted == Q_HERE_DOCUMENT && dolbrace_state == DOLBRACE_QUOTE && (flags & SX_NOALLOC) == 0)
|
if (quoted == Q_HERE_DOCUMENT && dolbrace_state == DOLBRACE_QUOTE && (flags & SX_NOALLOC) == 0)
|
||||||
return (extract_heredoc_dolbrace_string (string, sindex, quoted, flags));
|
return (extract_heredoc_dolbrace_string (string, sindex, quoted, flags));
|
||||||
|
|
||||||
@ -20,7 +31,7 @@ diff --git a/subst.c b/subst.c
|
|||||||
pass_character = 0;
|
pass_character = 0;
|
||||||
nesting_level = 1;
|
nesting_level = 1;
|
||||||
slen = strlen (string + *sindex) + *sindex;
|
slen = strlen (string + *sindex) + *sindex;
|
||||||
@@ -1857,6 +1862,8 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
|
@@ -1852,6 +1857,8 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
|
||||||
|
|
||||||
if (string[i] == '$' && string[i+1] == LBRACE)
|
if (string[i] == '$' && string[i+1] == LBRACE)
|
||||||
{
|
{
|
||||||
@ -29,7 +40,7 @@ diff --git a/subst.c b/subst.c
|
|||||||
nesting_level++;
|
nesting_level++;
|
||||||
i += 2;
|
i += 2;
|
||||||
if (dolbrace_state == DOLBRACE_QUOTE || dolbrace_state == DOLBRACE_WORD)
|
if (dolbrace_state == DOLBRACE_QUOTE || dolbrace_state == DOLBRACE_WORD)
|
||||||
@@ -1869,6 +1876,7 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
|
@@ -1864,6 +1871,7 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
|
||||||
nesting_level--;
|
nesting_level--;
|
||||||
if (nesting_level == 0)
|
if (nesting_level == 0)
|
||||||
break;
|
break;
|
24
bash-5.2-patch-5.patch
Normal file
24
bash-5.2-patch-5.patch
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
diff --git a/patchlevel.h b/patchlevel.h
|
||||||
|
--- a/patchlevel.h
|
||||||
|
+++ b/patchlevel.h
|
||||||
|
@@ -25,6 +25,6 @@
|
||||||
|
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||||
|
looks for to find the patch level (for the sccs version string). */
|
||||||
|
|
||||||
|
-#define PATCHLEVEL 4
|
||||||
|
+#define PATCHLEVEL 5
|
||||||
|
|
||||||
|
#endif /* _PATCHLEVEL_H_ */
|
||||||
|
diff --git a/subst.c b/subst.c
|
||||||
|
--- a/subst.c
|
||||||
|
+++ b/subst.c
|
||||||
|
@@ -8965,7 +8965,8 @@ pat_subst (string, pat, rep, mflags)
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
else if (*string == 0 && (match_pattern (string, pat, mtype, &s, &e) != 0))
|
||||||
|
- return ((mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2) : savestring (rep));
|
||||||
|
+ return (mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2)
|
||||||
|
+ : (rep ? savestring (rep) : savestring (""));
|
||||||
|
|
||||||
|
ret = (char *)xmalloc (rsize = 64);
|
||||||
|
ret[0] = '\0';
|
230
bash-5.2-patch-6.patch
Normal file
230
bash-5.2-patch-6.patch
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
diff --git a/builtins/common.h b/builtins/common.h
|
||||||
|
--- a/builtins/common.h
|
||||||
|
+++ b/builtins/common.h
|
||||||
|
@@ -257,6 +257,8 @@ extern int print_shift_error;
|
||||||
|
extern int expand_once_flag;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+extern int expaliases_flag;
|
||||||
|
+
|
||||||
|
/* variables from source.def */
|
||||||
|
extern int source_searches_cwd;
|
||||||
|
extern int source_uses_path;
|
||||||
|
diff --git a/builtins/shopt.def b/builtins/shopt.def
|
||||||
|
--- a/builtins/shopt.def
|
||||||
|
+++ b/builtins/shopt.def
|
||||||
|
@@ -149,6 +149,9 @@ static int shopt_set_complete_direxpand PARAMS((char *, int));
|
||||||
|
static int set_assoc_expand PARAMS((char *, int));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+int expaliases_flag = 0;
|
||||||
|
+static int shopt_set_expaliases PARAMS((char *, int));
|
||||||
|
+
|
||||||
|
static int shopt_set_debug_mode PARAMS((char *, int));
|
||||||
|
|
||||||
|
static int shopt_login_shell;
|
||||||
|
@@ -198,7 +201,7 @@ static struct {
|
||||||
|
#endif
|
||||||
|
{ "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
|
||||||
|
{ "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
|
||||||
|
- { "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL },
|
||||||
|
+ { "expand_aliases", &expaliases_flag, shopt_set_expaliases },
|
||||||
|
#if defined (DEBUGGER)
|
||||||
|
{ "extdebug", &debugging_mode, shopt_set_debug_mode },
|
||||||
|
#endif
|
||||||
|
@@ -350,7 +353,7 @@ reset_shopt_options ()
|
||||||
|
check_window_size = CHECKWINSIZE_DEFAULT;
|
||||||
|
allow_null_glob_expansion = glob_dot_filenames = 0;
|
||||||
|
no_exit_on_failed_exec = 0;
|
||||||
|
- expand_aliases = 0;
|
||||||
|
+ expand_aliases = expaliases_flag = 0;
|
||||||
|
extended_quote = 1;
|
||||||
|
fail_glob_expansion = 0;
|
||||||
|
glob_asciirange = GLOBASCII_DEFAULT;
|
||||||
|
@@ -631,6 +634,15 @@ shopt_set_debug_mode (option_name, mode)
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+shopt_set_expaliases (option_name, mode)
|
||||||
|
+ char *option_name;
|
||||||
|
+ int mode;
|
||||||
|
+{
|
||||||
|
+ expand_aliases = expaliases_flag;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#if defined (READLINE)
|
||||||
|
static int
|
||||||
|
shopt_enable_hostname_completion (option_name, mode)
|
||||||
|
diff --git a/execute_cmd.c b/execute_cmd.c
|
||||||
|
--- a/execute_cmd.c
|
||||||
|
+++ b/execute_cmd.c
|
||||||
|
@@ -1536,7 +1536,7 @@ execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
|
||||||
|
expansion with `shopt -s expand_alias' to continue to expand
|
||||||
|
aliases. */
|
||||||
|
if (ois != interactive_shell)
|
||||||
|
- expand_aliases = 0;
|
||||||
|
+ expand_aliases = expaliases_flag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Subshells are neither login nor interactive. */
|
||||||
|
diff --git a/general.c b/general.c
|
||||||
|
--- a/general.c
|
||||||
|
+++ b/general.c
|
||||||
|
@@ -91,7 +91,7 @@ static struct {
|
||||||
|
{
|
||||||
|
&interactive_comments,
|
||||||
|
&source_uses_path,
|
||||||
|
- &expand_aliases,
|
||||||
|
+ &expaliases_flag,
|
||||||
|
&inherit_errexit,
|
||||||
|
&print_shift_error,
|
||||||
|
0
|
||||||
|
@@ -106,7 +106,8 @@ posix_initialize (on)
|
||||||
|
/* Things that should be turned on when posix mode is enabled. */
|
||||||
|
if (on != 0)
|
||||||
|
{
|
||||||
|
- interactive_comments = source_uses_path = expand_aliases = 1;
|
||||||
|
+ interactive_comments = source_uses_path = 1;
|
||||||
|
+ expand_aliases = expaliases_flag = 1;
|
||||||
|
inherit_errexit = 1;
|
||||||
|
source_searches_cwd = 0;
|
||||||
|
print_shift_error = 1;
|
||||||
|
@@ -116,13 +117,14 @@ posix_initialize (on)
|
||||||
|
else if (saved_posix_vars) /* on == 0, restore saved settings */
|
||||||
|
{
|
||||||
|
set_posix_options (saved_posix_vars);
|
||||||
|
+ expand_aliases = expaliases_flag;
|
||||||
|
free (saved_posix_vars);
|
||||||
|
saved_posix_vars = 0;
|
||||||
|
}
|
||||||
|
else /* on == 0, restore a default set of settings */
|
||||||
|
{
|
||||||
|
source_searches_cwd = 1;
|
||||||
|
- expand_aliases = interactive_shell;
|
||||||
|
+ expand_aliases = expaliases_flag = interactive_shell; /* XXX */
|
||||||
|
print_shift_error = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/parse.y b/parse.y
|
||||||
|
--- a/parse.y
|
||||||
|
+++ b/parse.y
|
||||||
|
@@ -3306,6 +3306,8 @@ reset_parser ()
|
||||||
|
if (parser_state & (PST_EXTPAT|PST_CMDSUBST))
|
||||||
|
extended_glob = global_extglob;
|
||||||
|
#endif
|
||||||
|
+ if (parser_state & (PST_CMDSUBST|PST_STRING))
|
||||||
|
+ expand_aliases = expaliases_flag;
|
||||||
|
|
||||||
|
parser_state = 0;
|
||||||
|
here_doc_first_line = 0;
|
||||||
|
@@ -4388,6 +4390,7 @@ parse_string_to_command (string, flags)
|
||||||
|
if (flags & SX_COMPLETE)
|
||||||
|
parser_state |= PST_NOERROR;
|
||||||
|
|
||||||
|
+ parser_state |= PST_STRING;
|
||||||
|
expand_aliases = 0;
|
||||||
|
|
||||||
|
cmd = 0;
|
||||||
|
@@ -6401,7 +6404,7 @@ parse_string_to_word_list (s, flags, whom)
|
||||||
|
/* State flags we don't want to persist into compound assignments. */
|
||||||
|
parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */
|
||||||
|
/* State flags we want to set for this run through the tokenizer. */
|
||||||
|
- parser_state |= PST_COMPASSIGN|PST_REPARSE;
|
||||||
|
+ parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((tok = read_token (READ)) != yacc_EOF)
|
||||||
|
diff --git a/parser.h b/parser.h
|
||||||
|
--- a/parser.h
|
||||||
|
+++ b/parser.h
|
||||||
|
@@ -50,6 +50,7 @@
|
||||||
|
#define PST_ENDALIAS 0x200000 /* just finished expanding and consuming an alias */
|
||||||
|
#define PST_NOEXPAND 0x400000 /* don't expand anything in read_token_word; for command substitution */
|
||||||
|
#define PST_NOERROR 0x800000 /* don't print error messages in yyerror */
|
||||||
|
+#define PST_STRING 0x1000000 /* parsing a string to a command or word list */
|
||||||
|
|
||||||
|
/* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */
|
||||||
|
struct dstack {
|
||||||
|
diff --git a/patchlevel.h b/patchlevel.h
|
||||||
|
--- a/patchlevel.h
|
||||||
|
+++ b/patchlevel.h
|
||||||
|
@@ -25,6 +25,6 @@
|
||||||
|
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||||
|
looks for to find the patch level (for the sccs version string). */
|
||||||
|
|
||||||
|
-#define PATCHLEVEL 5
|
||||||
|
+#define PATCHLEVEL 6
|
||||||
|
|
||||||
|
#endif /* _PATCHLEVEL_H_ */
|
||||||
|
diff --git a/shell.c b/shell.c
|
||||||
|
--- a/shell.c
|
||||||
|
+++ b/shell.c
|
||||||
|
@@ -1844,8 +1844,8 @@ reset_option_defaults ()
|
||||||
|
static void
|
||||||
|
init_interactive ()
|
||||||
|
{
|
||||||
|
- expand_aliases = interactive_shell = startup_state = 1;
|
||||||
|
- interactive = 1;
|
||||||
|
+ expand_aliases = expaliases_flag = 1;
|
||||||
|
+ interactive_shell = startup_state = interactive = 1;
|
||||||
|
#if defined (HISTORY)
|
||||||
|
if (enable_history_list == -1)
|
||||||
|
enable_history_list = 1; /* set default */
|
||||||
|
@@ -1865,7 +1865,7 @@ init_noninteractive ()
|
||||||
|
bash_history_reinit (0);
|
||||||
|
#endif /* HISTORY */
|
||||||
|
interactive_shell = startup_state = interactive = 0;
|
||||||
|
- expand_aliases = posixly_correct; /* XXX - was 0 not posixly_correct */
|
||||||
|
+ expand_aliases = expaliases_flag = posixly_correct; /* XXX - was 0 not posixly_correct */
|
||||||
|
no_line_editing = 1;
|
||||||
|
#if defined (JOB_CONTROL)
|
||||||
|
/* Even if the shell is not interactive, enable job control if the -i or
|
||||||
|
@@ -1882,7 +1882,7 @@ init_interactive_script ()
|
||||||
|
enable_history_list = 1;
|
||||||
|
#endif
|
||||||
|
init_noninteractive ();
|
||||||
|
- expand_aliases = interactive_shell = startup_state = 1;
|
||||||
|
+ expand_aliases = expaliases_flag = interactive_shell = startup_state = 1;
|
||||||
|
#if defined (HISTORY)
|
||||||
|
remember_on_history = enable_history_list; /* XXX */
|
||||||
|
#endif
|
||||||
|
@@ -2025,7 +2025,7 @@ shell_reinitialize ()
|
||||||
|
debugging = do_version = line_number = last_command_exit_value = 0;
|
||||||
|
forced_interactive = interactive_shell = 0;
|
||||||
|
subshell_environment = running_in_background = 0;
|
||||||
|
- expand_aliases = 0;
|
||||||
|
+ expand_aliases = expaliases_flag = 0;
|
||||||
|
bash_argv_initialized = 0;
|
||||||
|
|
||||||
|
/* XXX - should we set jobs_m_flag to 0 here? */
|
||||||
|
diff --git a/y.tab.c b/y.tab.c
|
||||||
|
--- a/y.tab.c
|
||||||
|
+++ b/y.tab.c
|
||||||
|
@@ -5617,6 +5617,8 @@ reset_parser ()
|
||||||
|
if (parser_state & (PST_EXTPAT|PST_CMDSUBST))
|
||||||
|
extended_glob = global_extglob;
|
||||||
|
#endif
|
||||||
|
+ if (parser_state & (PST_CMDSUBST|PST_STRING))
|
||||||
|
+ expand_aliases = expaliases_flag;
|
||||||
|
|
||||||
|
parser_state = 0;
|
||||||
|
here_doc_first_line = 0;
|
||||||
|
@@ -6699,6 +6701,7 @@ parse_string_to_command (string, flags)
|
||||||
|
if (flags & SX_COMPLETE)
|
||||||
|
parser_state |= PST_NOERROR;
|
||||||
|
|
||||||
|
+ parser_state |= PST_STRING;
|
||||||
|
expand_aliases = 0;
|
||||||
|
|
||||||
|
cmd = 0;
|
||||||
|
@@ -8712,7 +8715,7 @@ parse_string_to_word_list (s, flags, whom)
|
||||||
|
/* State flags we don't want to persist into compound assignments. */
|
||||||
|
parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */
|
||||||
|
/* State flags we want to set for this run through the tokenizer. */
|
||||||
|
- parser_state |= PST_COMPASSIGN|PST_REPARSE;
|
||||||
|
+ parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((tok = read_token (READ)) != yacc_EOF)
|
206
bash-5.2-patch-7.patch
Normal file
206
bash-5.2-patch-7.patch
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
|
||||||
|
--- a/builtins/evalstring.c
|
||||||
|
+++ b/builtins/evalstring.c
|
||||||
|
@@ -431,6 +431,8 @@ parse_and_execute (string, from_file, flags)
|
||||||
|
|
||||||
|
if (parse_command () == 0)
|
||||||
|
{
|
||||||
|
+ int local_expalias, local_alflag;
|
||||||
|
+
|
||||||
|
if ((flags & SEVAL_PARSEONLY) || (interactive_shell == 0 && read_but_dont_execute))
|
||||||
|
{
|
||||||
|
last_result = EXECUTION_SUCCESS;
|
||||||
|
@@ -507,6 +509,19 @@ parse_and_execute (string, from_file, flags)
|
||||||
|
}
|
||||||
|
#endif /* ONESHOT */
|
||||||
|
|
||||||
|
+ /* We play tricks in the parser and command_substitute() turning
|
||||||
|
+ expand_aliases on and off depending on which parsing pass and
|
||||||
|
+ whether or not we're in posix mode. This only matters for
|
||||||
|
+ parsing, and we let the higher layers deal with that. We just
|
||||||
|
+ want to ensure that expand_aliases is set to the appropriate
|
||||||
|
+ global value when we go to execute this command, so we save
|
||||||
|
+ and restore it around the execution (we don't restore it if
|
||||||
|
+ the global value of the flag (expaliases_flag) changes). */
|
||||||
|
+ local_expalias = expand_aliases;
|
||||||
|
+ local_alflag = expaliases_flag;
|
||||||
|
+ if (subshell_environment & SUBSHELL_COMSUB)
|
||||||
|
+ expand_aliases = expaliases_flag;
|
||||||
|
+
|
||||||
|
/* See if this is a candidate for $( <file ). */
|
||||||
|
if (startup_state == 2 &&
|
||||||
|
(subshell_environment & SUBSHELL_COMSUB) &&
|
||||||
|
@@ -524,6 +539,10 @@ parse_and_execute (string, from_file, flags)
|
||||||
|
dispose_fd_bitmap (bitmap);
|
||||||
|
discard_unwind_frame ("pe_dispose");
|
||||||
|
|
||||||
|
+ /* If the global value didn't change, we restore what we had. */
|
||||||
|
+ if ((subshell_environment & SUBSHELL_COMSUB) && local_alflag == expaliases_flag)
|
||||||
|
+ expand_aliases = local_expalias;
|
||||||
|
+
|
||||||
|
if (flags & SEVAL_ONECMD)
|
||||||
|
{
|
||||||
|
reset_parser ();
|
||||||
|
diff --git a/command.h b/command.h
|
||||||
|
--- a/command.h
|
||||||
|
+++ b/command.h
|
||||||
|
@@ -114,6 +114,7 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
|
||||||
|
#define PF_COMPLETE 0x10 /* same as W_COMPLETE, sets SX_COMPLETE */
|
||||||
|
#define PF_EXPANDRHS 0x20 /* same as W_EXPANDRHS */
|
||||||
|
#define PF_ALLINDS 0x40 /* array, act as if [@] was supplied */
|
||||||
|
+#define PF_BACKQUOTE 0x80 /* differentiate `` from $() for command_substitute */
|
||||||
|
|
||||||
|
/* Possible values for subshell_environment */
|
||||||
|
#define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */
|
||||||
|
diff --git a/parse.y b/parse.y
|
||||||
|
--- a/parse.y
|
||||||
|
+++ b/parse.y
|
||||||
|
@@ -3612,6 +3612,7 @@ tokword:
|
||||||
|
#define P_BACKQUOTE 0x0010 /* parsing a backquoted command substitution */
|
||||||
|
#define P_ARRAYSUB 0x0020 /* parsing a [...] array subscript for assignment */
|
||||||
|
#define P_DOLBRACE 0x0040 /* parsing a ${...} construct */
|
||||||
|
+#define P_ARITH 0x0080 /* parsing a $(( )) arithmetic expansion */
|
||||||
|
|
||||||
|
/* Lexical state while parsing a grouping construct or $(...). */
|
||||||
|
#define LEX_WASDOL 0x0001
|
||||||
|
@@ -3910,6 +3911,9 @@ parse_matched_pair (qc, open, close, lenp, flags)
|
||||||
|
}
|
||||||
|
else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
|
||||||
|
goto parse_dollar_word;
|
||||||
|
+ else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/
|
||||||
|
+ /* $() inside $(( ))/$[ ] */
|
||||||
|
+ goto parse_dollar_word;
|
||||||
|
#if defined (PROCESS_SUBSTITUTION)
|
||||||
|
/* XXX - technically this should only be recognized at the start of
|
||||||
|
a word */
|
||||||
|
@@ -3940,7 +3944,7 @@ parse_dollar_word:
|
||||||
|
else if (ch == '{') /* } */
|
||||||
|
nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
|
||||||
|
else if (ch == '[') /* ] */
|
||||||
|
- nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
|
||||||
|
+ nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH);
|
||||||
|
|
||||||
|
CHECK_NESTRET_ERROR ();
|
||||||
|
APPEND_NESTRET ();
|
||||||
|
@@ -4079,7 +4083,7 @@ parse_comsub (qc, open, close, lenp, flags)
|
||||||
|
peekc = shell_getc (1);
|
||||||
|
shell_ungetc (peekc);
|
||||||
|
if (peekc == '(') /*)*/
|
||||||
|
- return (parse_matched_pair (qc, open, close, lenp, 0));
|
||||||
|
+ return (parse_matched_pair (qc, open, close, lenp, P_ARITH));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
|
||||||
|
@@ -4500,7 +4504,7 @@ parse_arith_cmd (ep, adddq)
|
||||||
|
int ttoklen;
|
||||||
|
|
||||||
|
exp_lineno = line_number;
|
||||||
|
- ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
|
||||||
|
+ ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH);
|
||||||
|
rval = 1;
|
||||||
|
if (ttok == &matched_pair_error)
|
||||||
|
return -1;
|
||||||
|
@@ -5015,7 +5019,7 @@ read_token_word (character)
|
||||||
|
pop_delimiter (dstack);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
|
||||||
|
+ ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH);
|
||||||
|
if (ttok == &matched_pair_error)
|
||||||
|
return -1; /* Bail immediately. */
|
||||||
|
RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 3,
|
||||||
|
diff --git a/patchlevel.h b/patchlevel.h
|
||||||
|
--- a/patchlevel.h
|
||||||
|
+++ b/patchlevel.h
|
||||||
|
@@ -25,6 +25,6 @@
|
||||||
|
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||||
|
looks for to find the patch level (for the sccs version string). */
|
||||||
|
|
||||||
|
-#define PATCHLEVEL 6
|
||||||
|
+#define PATCHLEVEL 7
|
||||||
|
|
||||||
|
#endif /* _PATCHLEVEL_H_ */
|
||||||
|
diff --git a/subst.c b/subst.c
|
||||||
|
--- a/subst.c
|
||||||
|
+++ b/subst.c
|
||||||
|
@@ -7123,8 +7123,12 @@ command_substitute (string, quoted, flags)
|
||||||
|
remove_quoted_escapes (string);
|
||||||
|
|
||||||
|
/* We want to expand aliases on this pass if we are not in posix mode
|
||||||
|
- for backwards compatibility. */
|
||||||
|
- if (expand_aliases)
|
||||||
|
+ for backwards compatibility. parse_and_execute() takes care of
|
||||||
|
+ setting expand_aliases back to the global value when executing the
|
||||||
|
+ parsed string. We only do this for $(...) command substitution,
|
||||||
|
+ since that is what parse_comsub handles; `` comsubs are processed
|
||||||
|
+ using parse.y:parse_matched_pair(). */
|
||||||
|
+ if (expand_aliases && (flags & PF_BACKQUOTE) == 0)
|
||||||
|
expand_aliases = posixly_correct == 0;
|
||||||
|
|
||||||
|
startup_state = 2; /* see if we can avoid a fork */
|
||||||
|
@@ -11292,7 +11296,7 @@ add_string:
|
||||||
|
else
|
||||||
|
{
|
||||||
|
de_backslash (temp);
|
||||||
|
- tword = command_substitute (temp, quoted, 0);
|
||||||
|
+ tword = command_substitute (temp, quoted, PF_BACKQUOTE);
|
||||||
|
temp1 = tword ? tword->word : (char *)NULL;
|
||||||
|
if (tword)
|
||||||
|
dispose_word_desc (tword);
|
||||||
|
diff --git a/y.tab.c b/y.tab.c
|
||||||
|
--- a/y.tab.c
|
||||||
|
+++ b/y.tab.c
|
||||||
|
@@ -5923,6 +5923,7 @@ tokword:
|
||||||
|
#define P_BACKQUOTE 0x0010 /* parsing a backquoted command substitution */
|
||||||
|
#define P_ARRAYSUB 0x0020 /* parsing a [...] array subscript for assignment */
|
||||||
|
#define P_DOLBRACE 0x0040 /* parsing a ${...} construct */
|
||||||
|
+#define P_ARITH 0x0080 /* parsing a $(( )) arithmetic expansion */
|
||||||
|
|
||||||
|
/* Lexical state while parsing a grouping construct or $(...). */
|
||||||
|
#define LEX_WASDOL 0x0001
|
||||||
|
@@ -6221,6 +6222,9 @@ parse_matched_pair (qc, open, close, lenp, flags)
|
||||||
|
}
|
||||||
|
else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
|
||||||
|
goto parse_dollar_word;
|
||||||
|
+ else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/
|
||||||
|
+ /* $() inside $(( ))/$[ ] */
|
||||||
|
+ goto parse_dollar_word;
|
||||||
|
#if defined (PROCESS_SUBSTITUTION)
|
||||||
|
/* XXX - technically this should only be recognized at the start of
|
||||||
|
a word */
|
||||||
|
@@ -6251,7 +6255,7 @@ parse_dollar_word:
|
||||||
|
else if (ch == '{') /* } */
|
||||||
|
nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
|
||||||
|
else if (ch == '[') /* ] */
|
||||||
|
- nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
|
||||||
|
+ nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH);
|
||||||
|
|
||||||
|
CHECK_NESTRET_ERROR ();
|
||||||
|
APPEND_NESTRET ();
|
||||||
|
@@ -6390,7 +6394,7 @@ parse_comsub (qc, open, close, lenp, flags)
|
||||||
|
peekc = shell_getc (1);
|
||||||
|
shell_ungetc (peekc);
|
||||||
|
if (peekc == '(') /*)*/
|
||||||
|
- return (parse_matched_pair (qc, open, close, lenp, 0));
|
||||||
|
+ return (parse_matched_pair (qc, open, close, lenp, P_ARITH));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
|
||||||
|
@@ -6811,7 +6815,7 @@ parse_arith_cmd (ep, adddq)
|
||||||
|
int ttoklen;
|
||||||
|
|
||||||
|
exp_lineno = line_number;
|
||||||
|
- ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
|
||||||
|
+ ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH);
|
||||||
|
rval = 1;
|
||||||
|
if (ttok == &matched_pair_error)
|
||||||
|
return -1;
|
||||||
|
@@ -7326,7 +7330,7 @@ read_token_word (character)
|
||||||
|
pop_delimiter (dstack);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
|
||||||
|
+ ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH);
|
||||||
|
if (ttok == &matched_pair_error)
|
||||||
|
return -1; /* Bail immediately. */
|
||||||
|
RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 3,
|
34
bash-5.2-patch-8.patch
Normal file
34
bash-5.2-patch-8.patch
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
diff --git a/patchlevel.h b/patchlevel.h
|
||||||
|
--- a/patchlevel.h
|
||||||
|
+++ b/patchlevel.h
|
||||||
|
@@ -25,6 +25,6 @@
|
||||||
|
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||||
|
looks for to find the patch level (for the sccs version string). */
|
||||||
|
|
||||||
|
-#define PATCHLEVEL 7
|
||||||
|
+#define PATCHLEVEL 8
|
||||||
|
|
||||||
|
#endif /* _PATCHLEVEL_H_ */
|
||||||
|
diff --git a/subst.c b/subst.c
|
||||||
|
--- a/subst.c
|
||||||
|
+++ b/subst.c
|
||||||
|
@@ -3819,6 +3819,10 @@ pos_params (string, start, end, quoted, pflags)
|
||||||
|
#define EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~')
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/* We don't perform process substitution in arithmetic expressions, so don't
|
||||||
|
+ bother checking for it. */
|
||||||
|
+#define ARITH_EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~')
|
||||||
|
+
|
||||||
|
/* If there are any characters in STRING that require full expansion,
|
||||||
|
then call FUNC to expand STRING; otherwise just perform quote
|
||||||
|
removal if necessary. This returns a new string. */
|
||||||
|
@@ -4028,7 +4032,7 @@ expand_arith_string (string, quoted)
|
||||||
|
i = saw_quote = 0;
|
||||||
|
while (string[i])
|
||||||
|
{
|
||||||
|
- if (EXP_CHAR (string[i]))
|
||||||
|
+ if (ARITH_EXP_CHAR (string[i]))
|
||||||
|
break;
|
||||||
|
else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"')
|
||||||
|
saw_quote = string[i];
|
23
bash-5.2-patch-9.patch
Normal file
23
bash-5.2-patch-9.patch
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
diff --git a/expr.c b/expr.c
|
||||||
|
--- a/expr.c
|
||||||
|
+++ b/expr.c
|
||||||
|
@@ -1168,6 +1168,8 @@ expr_streval (tok, e, lvalue)
|
||||||
|
/* [[[[[ */
|
||||||
|
#if defined (ARRAY_VARS)
|
||||||
|
aflag = tflag; /* use a different variable for now */
|
||||||
|
+ if (shell_compatibility_level > 51)
|
||||||
|
+ aflag |= AV_ATSTARKEYS;
|
||||||
|
v = (e == ']') ? array_variable_part (tok, tflag, (char **)0, (int *)0) : find_variable (tok);
|
||||||
|
#else
|
||||||
|
v = find_variable (tok);
|
||||||
|
diff --git a/patchlevel.h b/patchlevel.h
|
||||||
|
--- a/patchlevel.h
|
||||||
|
+++ b/patchlevel.h
|
||||||
|
@@ -25,6 +25,6 @@
|
||||||
|
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||||
|
looks for to find the patch level (for the sccs version string). */
|
||||||
|
|
||||||
|
-#define PATCHLEVEL 8
|
||||||
|
+#define PATCHLEVEL 9
|
||||||
|
|
||||||
|
#endif /* _PATCHLEVEL_H_ */
|
12
bash.spec
12
bash.spec
@ -1,12 +1,12 @@
|
|||||||
#% define beta_tag rc2
|
#% define beta_tag rc2
|
||||||
%define patchlevel 2
|
%define patchlevel 9
|
||||||
%define baseversion 5.2
|
%define baseversion 5.2
|
||||||
%bcond_without tests
|
%bcond_without tests
|
||||||
|
|
||||||
Version: %{baseversion}.%{patchlevel}
|
Version: %{baseversion}.%{patchlevel}
|
||||||
Name: bash
|
Name: bash
|
||||||
Summary: The GNU Bourne Again shell
|
Summary: The GNU Bourne Again shell
|
||||||
Release: 2%{?dist}
|
Release: 1%{?dist}
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Url: https://www.gnu.org/software/bash
|
Url: https://www.gnu.org/software/bash
|
||||||
Source0: https://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz
|
Source0: https://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz
|
||||||
@ -89,10 +89,6 @@ Patch127: bash-4.4-no-loadable-builtins.patch
|
|||||||
# This option is undocumented in upstream and is documented by this patch
|
# This option is undocumented in upstream and is documented by this patch
|
||||||
Patch128: bash-5.0-syslog-history.patch
|
Patch128: bash-5.0-syslog-history.patch
|
||||||
|
|
||||||
# 2133097 - bash fails to handle nested expansions
|
|
||||||
# This patch should be removed with next rebase
|
|
||||||
Patch129: bash-5.2-nested-expansion.patch
|
|
||||||
|
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
BuildRequires: texinfo bison
|
BuildRequires: texinfo bison
|
||||||
BuildRequires: ncurses-devel
|
BuildRequires: ncurses-devel
|
||||||
@ -324,6 +320,10 @@ end
|
|||||||
%{_libdir}/pkgconfig/%{name}.pc
|
%{_libdir}/pkgconfig/%{name}.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Nov 18 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.9-1
|
||||||
|
- Update to bash-5.2 patchlevel 9
|
||||||
|
Resolves: #2140722
|
||||||
|
|
||||||
* Mon Oct 10 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.2-2
|
* Mon Oct 10 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.2-2
|
||||||
- Fix an issue with nested expansions
|
- Fix an issue with nested expansions
|
||||||
Resolves: #2133097
|
Resolves: #2133097
|
||||||
|
Loading…
Reference in New Issue
Block a user