Merged update from upstream sources

This is an automated DistroBaker update from upstream sources.
If you do not know what this is about or would like to opt out,
contact the OSCI team.

Source: https://src.fedoraproject.org/rpms/bash.git#a52a705fbcc97249e1abea732fe4e6fc73de767a
This commit is contained in:
DistroBaker 2021-01-07 13:40:37 +00:00
parent c6c1337fe2
commit 62c46545a8
26 changed files with 87 additions and 1512 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@ bash-4.1.tar.gz
/bash-4.3.tar.gz
/bash-4.4.tar.gz
/bash-5.0.tar.gz
/bash-5.1.tar.gz

View File

@ -1,8 +1,8 @@
diff --git a/config.h.in b/config.h.in
index 0adc903..366e639 100644
index ab316d4..11d1d68 100644
--- a/config.h.in
+++ b/config.h.in
@@ -758,6 +758,9 @@
@@ -775,6 +775,9 @@
/* Define if you have the pselect function. */
#undef HAVE_PSELECT
@ -12,7 +12,7 @@ index 0adc903..366e639 100644
/* Define if you have the putenv function. */
#undef HAVE_PUTENV
@@ -956,6 +959,9 @@
@@ -981,6 +984,9 @@
/* Define if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
@ -23,20 +23,20 @@ index 0adc903..366e639 100644
#undef HAVE_GRP_H
diff --git a/configure.ac b/configure.ac
index 2c74f13..4e9c3a4 100644
index 2fe3e7d..f1b7f1b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -782,7 +782,7 @@ dnl checks for system calls
AC_CHECK_FUNCS(dup2 eaccess fcntl getdtablesize getgroups gethostname \
getpagesize getpeername getrlimit getrusage gettimeofday \
kill killpg lstat pselect readlink select setdtablesize \
- setitimer tcgetpgrp uname ulimit waitpid)
+ setitimer tcgetpgrp uname ulimit waitpid pread)
@@ -827,7 +827,7 @@ dnl checks for system calls
AC_CHECK_FUNCS(dup2 eaccess fcntl getdtablesize getentropy getgroups \
gethostname getpagesize getpeername getrandom getrlimit \
getrusage gettimeofday kill killpg lstat pselect readlink \
- select setdtablesize setitimer tcgetpgrp uname ulimit waitpid)
+ select setdtablesize setitimer tcgetpgrp uname ulimit waitpid pread)
AC_REPLACE_FUNCS(rename)
dnl checks for c library functions
diff --git a/execute_cmd.c b/execute_cmd.c
index 4eae19c..0af6f8f 100644
index d2a0dd7..d2555ad 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -41,6 +41,10 @@
@ -50,7 +50,7 @@ index 4eae19c..0af6f8f 100644
#include "posixtime.h"
#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)
@@ -5706,6 +5710,14 @@ shell_execve (command, args, env)
@@ -5832,6 +5836,14 @@ shell_execve (command, args, env)
{
/* The file has the execute bits set, but the kernel refuses to
run it for some reason. See why. */
@ -65,7 +65,7 @@ index 4eae19c..0af6f8f 100644
#if defined (HAVE_HASH_BANG_EXEC)
READ_SAMPLE_BUF (command, sample, sample_len);
if (sample_len > 0)
@@ -5715,6 +5727,7 @@ shell_execve (command, args, env)
@@ -5841,6 +5853,7 @@ shell_execve (command, args, env)
char *interp;
int ilen;
@ -73,7 +73,7 @@ index 4eae19c..0af6f8f 100644
interp = getinterp (sample, sample_len, (int *)NULL);
ilen = strlen (interp);
errno = i;
@@ -5730,7 +5743,138 @@ shell_execve (command, args, env)
@@ -5856,7 +5869,138 @@ shell_execve (command, args, env)
return (EX_NOEXEC);
}
#endif
@ -213,6 +213,3 @@ index 4eae19c..0af6f8f 100644
file_error (command);
}
return (last_command_exit_value);
--
2.17.2

View File

@ -1,12 +1,13 @@
diff -up bash-4.0/config-top.h.ssh_source_bash bash-4.0/config-top.h
--- bash-4.0/config-top.h.ssh_source_bash 2009-01-21 15:20:06.000000000 +0100
+++ bash-4.0/config-top.h 2009-01-21 15:25:46.000000000 +0100
@@ -90,7 +90,7 @@
diff --git a/config-top.h b/config-top.h
index e5cc147..f5e0a52 100644
--- a/config-top.h
+++ b/config-top.h
@@ -106,7 +106,7 @@
sshd and source the .bashrc if so (like the rshd behavior). This checks
for the presence of SSH_CLIENT or SSH2_CLIENT in the initial environment,
which can be fooled under certain not-uncommon circumstances. */
-/* #define SSH_SOURCE_BASHRC */
+#define SSH_SOURCE_BASHRC
/* Define if you want the case-capitalizing operators (~[~]) and the
/* Define if you want the case-toggling operators (~[~]) and the
`capcase' variable attribute (declare -c). */

View File

@ -1,12 +1,13 @@
diff -up bash-4.3/locale.c.old bash-4.3/locale.c
--- bash-4.3/locale.c.old 2015-07-15 11:55:00.002857301 +0200
+++ bash-4.3/locale.c 2015-07-15 11:48:36.698086257 +0200
@@ -77,8 +77,6 @@ set_default_locale ()
diff --git a/locale.c b/locale.c
index 17ccc58..a6c07a3 100644
--- a/locale.c
+++ b/locale.c
@@ -78,8 +78,6 @@ set_default_locale ()
{
#if defined (HAVE_SETLOCALE)
default_locale = setlocale (LC_ALL, "");
- if (default_locale)
- default_locale = savestring (default_locale);
#else
default_locale = savestring ("C");
#endif /* HAVE_SETLOCALE */
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);

View File

@ -1,8 +1,8 @@
diff --git a/parse.y b/parse.y
index 07e6e3e..4cd373f 100644
index df1231d..2449fa8 100644
--- a/parse.y
+++ b/parse.y
@@ -4410,6 +4410,8 @@ xparse_dolparen (base, string, indp, flags)
@@ -4482,6 +4482,8 @@ xparse_dolparen (base, string, indp, flags)
save_parser_state (&ps);
save_input_line_state (&ls);
orig_eof_token = shell_eof_token;
@ -12,18 +12,18 @@ index 07e6e3e..4cd373f 100644
saved_pushed_strings = pushed_string_list; /* separate parsing context */
pushed_string_list = (STRING_SAVER *)NULL;
diff --git a/subst.c b/subst.c
index 9559187..0c2caa6 100644
index 9ccbf33..8a9ee5c 100644
--- a/subst.c
+++ b/subst.c
@@ -9145,6 +9145,7 @@ param_expand (string, sindex, quoted, expanded_something,
WORD_LIST *list;
@@ -9453,6 +9453,7 @@ param_expand (string, sindex, quoted, expanded_something,
WORD_LIST *list, *l;
WORD_DESC *tdesc, *ret;
int tflag;
int tflag, nullarg;
+ int old_echo_input;
/*itrace("param_expand: `%s' pflags = %d", string+*sindex, pflags);*/
zindex = *sindex;
@@ -9514,6 +9515,9 @@ arithsub:
@@ -9843,6 +9844,9 @@ arithsub:
}
comsub:
@ -33,7 +33,7 @@ index 9559187..0c2caa6 100644
if (pflags & PF_NOCOMSUB)
/* we need zindex+1 because string[zindex] == RPAREN */
temp1 = substring (string, *sindex, zindex+1);
@@ -9526,6 +9530,7 @@ comsub:
@@ -9855,6 +9859,7 @@ comsub:
}
FREE (temp);
temp = temp1;
@ -41,6 +41,3 @@ index 9559187..0c2caa6 100644
break;
/* Do POSIX.2d9-style arithmetic substitution. This will probably go
--
2.17.2

View File

@ -1,150 +0,0 @@
From 4d2e315490b778707b3a3afdfc514d5083a97a11 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 18 Jan 2019 15:12:37 -0500
Subject: [PATCH] Bash-5.0 patch 1: fix pathname expansion of directory names
containing backslashes
---
bashline.c | 62 +++++++++++++++++++++++++++++++++++++++++---
lib/glob/glob_loop.c | 6 -----
patchlevel.h | 2 +-
3 files changed, 60 insertions(+), 10 deletions(-)
diff --git a/bashline.c b/bashline.c
index 2846aabf..75e79f1a 100644
--- a/bashline.c
+++ b/bashline.c
@@ -231,6 +231,7 @@ static int bash_possible_variable_completions __P((int, int));
static int bash_complete_command __P((int, int));
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));
static int bash_glob_complete_word __P((int, int));
@@ -1741,7 +1742,7 @@ bash_default_completion (text, start, end, qc, compflags)
/* This could be a globbing pattern, so try to expand it using pathname
expansion. */
- if (!matches && glob_pattern_p (text))
+ if (!matches && completion_glob_pattern ((char *)text))
{
matches = rl_completion_matches (text, glob_complete_word);
/* A glob expression that matches more than one filename is problematic.
@@ -1850,7 +1851,7 @@ command_word_completion_function (hint_text, state)
glob_matches = (char **)NULL;
}
- globpat = glob_pattern_p (hint_text);
+ globpat = completion_glob_pattern ((char *)hint_text);
/* If this is an absolute program name, do not check it against
aliases, reserved words, functions or builtins. We must check
@@ -3713,6 +3714,61 @@ bash_complete_command_internal (what_to_do)
return bash_specific_completion (what_to_do, command_word_completion_function);
}
+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;
@@ -3877,7 +3933,7 @@ bash_vi_complete (count, key)
t = substring (rl_line_buffer, p, rl_point);
}
- if (t && glob_pattern_p (t) == 0)
+ if (t && completion_glob_pattern (t) == 0)
rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */
FREE (t);
diff --git a/lib/glob/glob_loop.c b/lib/glob/glob_loop.c
index 5f319cc2..7d6ae211 100644
--- a/lib/glob/glob_loop.c
+++ b/lib/glob/glob_loop.c
@@ -54,17 +54,11 @@ INTERNAL_GLOB_PATTERN_P (pattern)
continue;
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,
since the matching engine uses backslash as an escape character
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
}
return 0;
diff --git a/patchlevel.h b/patchlevel.h
index 1cd7c96c..40db1a32 100644
--- 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 0
+#define PATCHLEVEL 1
#endif /* _PATCHLEVEL_H_ */
--
2.17.2

View File

@ -1,116 +0,0 @@
From 6a3116f58c876ca58a786f0ddff578ecf126588e Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Thu, 29 Aug 2019 11:20:15 -0400
Subject: [PATCH] Bash-5.0 patch 10: changes to posix-mode assignment
statements preceding functions and special builtins
---
patchlevel.h | 2 +-
tests/varenv.right | 6 +++---
variables.c | 38 ++++++++++++++++++++++++++------------
3 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/patchlevel.h b/patchlevel.h
index 02f1d606..8002af70 100644
--- 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 9
+#define PATCHLEVEL 10
#endif /* _PATCHLEVEL_H_ */
diff --git a/tests/varenv.right b/tests/varenv.right
index 159a8773..ca7d4cf1 100644
--- a/tests/varenv.right
+++ b/tests/varenv.right
@@ -146,9 +146,9 @@ declare -x foo="abc"
inside: declare -x var="value"
outside: declare -- var="one"
inside: declare -x var="value"
-outside: declare -x var="value"
-inside: declare -- var="local"
-outside: declare -x var="global"
+outside: declare -- var="outside"
+inside: declare -x var="global"
+outside: declare -- var="outside"
foo=<unset> environment foo=
foo=foo environment foo=foo
foo=foo environment foo=foo
diff --git a/variables.c b/variables.c
index 610629ab..af3fd04a 100644
--- a/variables.c
+++ b/variables.c
@@ -4460,9 +4460,9 @@ char **tempvar_list;
int tvlist_ind;
/* 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. */
+ 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)
PTR_T data;
@@ -4472,16 +4472,27 @@ push_posix_temp_var (data)
var = (SHELL_VAR *)data;
- binding_table = global_variables->table;
- if (binding_table == 0)
- binding_table = global_variables->table = hash_create (VARIABLES_HASH_BUCKETS);
+ /* 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);
- v = bind_variable_internal (var->name, value_cell (var), binding_table, 0, 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. */
- var->attributes &= ~(att_tempvar|att_propagate);
+ if (binding_table == global_variables->table)
+ var->attributes &= ~(att_tempvar|att_propagate);
+
if (v)
- v->attributes |= var->attributes;
+ {
+ v->attributes |= var->attributes;
+ v->attributes &= ~att_tempvar; /* not a temp var now */
+ }
if (find_special_var (var->name) >= 0)
tempvar_list[tvlist_ind++] = savestring (var->name);
@@ -4575,14 +4586,17 @@ dispose_temporary_env (pushf)
sh_free_func_t *pushf;
{
int i;
+ HASH_TABLE *disposer;
tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1);
tempvar_list[tvlist_ind = 0] = 0;
-
- hash_flush (temporary_env, pushf);
- hash_dispose (temporary_env);
+
+ disposer = temporary_env;
temporary_env = (HASH_TABLE *)NULL;
+ hash_flush (disposer, pushf);
+ hash_dispose (disposer);
+
tempvar_list[tvlist_ind] = 0;
array_needs_making = 1;
--
2.21.0

View File

@ -1,50 +0,0 @@
From d894cfd104086ddf68c286e67a5fb2e02eb43b7b Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Thu, 29 Aug 2019 11:21:20 -0400
Subject: [PATCH] Bash-5.0 patch 11: fix quoted null character removal in
operands of conditional ([[) commands
---
patchlevel.h | 2 +-
subst.c | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/patchlevel.h b/patchlevel.h
index 8002af70..772676c8 100644
--- 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 10
+#define PATCHLEVEL 11
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index 95591878..fd6db240 100644
--- a/subst.c
+++ b/subst.c
@@ -3625,7 +3625,9 @@ remove_backslashes (string)
this case, we quote the string specially for the globbing code. If
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. */
+ 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)
WORD_DESC *w;
@@ -3646,6 +3648,8 @@ cond_expand_word (w, special)
{
if (special == 0) /* LHS */
{
+ if (l->word)
+ word_list_remove_quoted_nulls (l);
dequote_list (l);
r = string_list (l);
}
--
2.21.0

View File

@ -1,56 +0,0 @@
From b0852fb54efbcee630847fcfdc435133f82043b9 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:16:28 -0500
Subject: [PATCH] Bash-5.0 patch 12: fix problems moving back beyond start of
history
---
lib/readline/misc.c | 5 ++++-
patchlevel.h | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/lib/readline/misc.c b/lib/readline/misc.c
index 64b1457d..42005b0c 100644
--- a/lib/readline/misc.c
+++ b/lib/readline/misc.c
@@ -576,6 +576,7 @@ int
rl_get_previous_history (int count, int key)
{
HIST_ENTRY *old_temp, *temp;
+ int had_saved_line;
if (count < 0)
return (rl_get_next_history (-count, key));
@@ -588,6 +589,7 @@ rl_get_previous_history (int count, int key)
_rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
/* If we don't have a line saved, then save this one. */
+ had_saved_line = _rl_saved_line_for_history != 0;
rl_maybe_save_line ();
/* If the current line has changed, save the changes. */
@@ -611,7 +613,8 @@ rl_get_previous_history (int count, int key)
if (temp == 0)
{
- rl_maybe_unsave_line ();
+ if (had_saved_line == 0)
+ _rl_free_saved_history_line ();
rl_ding ();
}
else
diff --git a/patchlevel.h b/patchlevel.h
index 772676c8..93dbe0db 100644
--- 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 11
+#define PATCHLEVEL 12
#endif /* _PATCHLEVEL_H_ */
--
2.25.1

View File

@ -1,62 +0,0 @@
From f747f9ff4c8aed2d51fa54db3cb10e8118034753 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:17:29 -0500
Subject: [PATCH] Bash-5.0 patch 13: reading history entries with timestamps
can result in joined entries
---
lib/readline/histfile.c | 15 ++++++++++++++-
patchlevel.h | 2 +-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/lib/readline/histfile.c b/lib/readline/histfile.c
index a8a92aa3..6c3adc9b 100644
--- a/lib/readline/histfile.c
+++ b/lib/readline/histfile.c
@@ -369,9 +369,11 @@ read_history_range (const char *filename, int from, int to)
}
has_timestamps = HIST_TIMESTAMP_START (buffer);
- history_multiline_entries += has_timestamps && history_write_timestamps;
+ history_multiline_entries += has_timestamps && history_write_timestamps;
/* Skip lines until we are at FROM. */
+ if (has_timestamps)
+ last_ts = buffer;
for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++)
if (*line_end == '\n')
{
@@ -380,7 +382,18 @@ read_history_range (const char *filename, int from, int to)
line. We should check more extensively here... */
if (HIST_TIMESTAMP_START(p) == 0)
current_line++;
+ else
+ last_ts = p;
line_start = p;
+ /* If we are at the last line (current_line == from) but we have
+ timestamps (has_timestamps), then line_start points to the
+ text of the last command, and we need to skip to its end. */
+ if (current_line >= from && has_timestamps)
+ {
+ for (line_end = p; line_end < bufend && *line_end != '\n'; line_end++)
+ ;
+ line_start = (*line_end == '\n') ? line_end + 1 : line_end;
+ }
}
/* If there are lines left to gobble, then gobble them now. */
diff --git a/patchlevel.h b/patchlevel.h
index 93dbe0db..779671cd 100644
--- 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 12
+#define PATCHLEVEL 13
#endif /* _PATCHLEVEL_H_ */
--
2.25.1

View File

@ -1,44 +0,0 @@
From 8b6524c482573ea12eb20be756cdb8ca31d945f3 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:18:41 -0500
Subject: [PATCH] Bash-5.0 patch 14: edit-and-execute-command does not handle
empty command lines
---
bashline.c | 7 ++-----
patchlevel.h | 2 +-
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/bashline.c b/bashline.c
index 824ea9d9..97adaa0f 100644
--- a/bashline.c
+++ b/bashline.c
@@ -961,11 +961,8 @@ edit_and_execute_command (count, c, editing_mode, edit_command)
/* This breaks down when using command-oriented history and are not
finished with the command, so we should not ignore the last command */
using_history ();
- if (rl_line_buffer[0])
- {
- current_command_line_count++; /* for rl_newline above */
- bash_add_history (rl_line_buffer);
- }
+ current_command_line_count++; /* for rl_newline above */
+ bash_add_history (rl_line_buffer);
current_command_line_count = 0; /* for dummy history entry */
bash_add_history ("");
history_lines_this_session++;
diff --git a/patchlevel.h b/patchlevel.h
index 779671cd..09a3cc84 100644
--- 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 13
+#define PATCHLEVEL 14
#endif /* _PATCHLEVEL_H_ */
--
2.25.1

View File

@ -1,64 +0,0 @@
From ad1b3e68229273b4983b607c5eeb56551536c583 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:19:53 -0500
Subject: [PATCH] Bash-5.0 patch 15: aliases and -c commands can cause
premature termination
---
builtins/evalstring.c | 6 ++++--
patchlevel.h | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
index cadc9bc0..2f13a66a 100644
--- a/builtins/evalstring.c
+++ b/builtins/evalstring.c
@@ -91,6 +91,7 @@ should_suppress_fork (command)
return (startup_state == 2 && parse_and_execute_level == 1 &&
running_trap == 0 &&
*bash_input.location.string == '\0' &&
+ parser_expanding_alias () == 0 &&
command->type == cm_simple &&
signal_is_trapped (EXIT_TRAP) == 0 &&
signal_is_trapped (ERROR_TRAP) == 0 &&
@@ -105,6 +106,7 @@ can_optimize_connection (command)
COMMAND *command;
{
return (*bash_input.location.string == '\0' &&
+ parser_expanding_alias () == 0 &&
(command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') &&
command->value.Connection->second->type == cm_simple);
}
@@ -290,7 +292,7 @@ parse_and_execute (string, from_file, flags)
with_input_from_string (string, from_file);
clear_shell_input_line ();
- while (*(bash_input.location.string))
+ while (*(bash_input.location.string) || parser_expanding_alias ())
{
command = (COMMAND *)NULL;
@@ -545,7 +547,7 @@ parse_string (string, from_file, flags, endp)
ostring = string;
with_input_from_string (string, from_file);
- while (*(bash_input.location.string))
+ while (*(bash_input.location.string)) /* XXX - parser_expanding_alias () ? */
{
command = (COMMAND *)NULL;
diff --git a/patchlevel.h b/patchlevel.h
index 09a3cc84..6e9ed3fc 100644
--- 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 14
+#define PATCHLEVEL 15
#endif /* _PATCHLEVEL_H_ */
--
2.25.1

View File

@ -1,53 +0,0 @@
From 6c6454cb18d7cd30b3b26d5ba6479431e599f3ed Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:20:38 -0500
Subject: [PATCH] Bash-5.0 patch 16: bash waits too long to reap /dev/fd
process substitutions with loops and group commands
---
execute_cmd.c | 16 ++++++++++++++++
patchlevel.h | 2 +-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/execute_cmd.c b/execute_cmd.c
index f1d74bfe..3864986d 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -1103,6 +1103,22 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
free ((void *)ofifo_list);
discard_unwind_frame ("internal_fifos");
}
+# if defined (HAVE_DEV_FD)
+ /* Reap process substitutions at the end of loops */
+ switch (command->type)
+ {
+ case cm_while:
+ case cm_until:
+ case cm_for:
+ case cm_group:
+# if defined (ARITH_FOR_COMMAND)
+ case cm_arith_for:
+# endif
+ reap_procsubs ();
+ default:
+ break;
+ }
+# endif /* HAVE_DEV_FD */
#endif
/* Invert the return value if we have to */
diff --git a/patchlevel.h b/patchlevel.h
index 6e9ed3fc..9074f4dd 100644
--- 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 15
+#define PATCHLEVEL 16
#endif /* _PATCHLEVEL_H_ */
--
2.25.1

View File

@ -1,213 +0,0 @@
From 9e49d343e3cd7e20dad1b86ebfb764e8027596a7 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 24 Apr 2020 11:05:06 -0400
Subject: [PATCH] Bash-5.0 patch 17: better fix for reaping process
substitution file descriptors
---
execute_cmd.c | 26 ++++++--------------------
patchlevel.h | 2 +-
subst.c | 35 +++++++++++++++++++++--------------
subst.h | 5 ++---
4 files changed, 30 insertions(+), 38 deletions(-)
diff --git a/execute_cmd.c b/execute_cmd.c
index 3864986d..4a05758d 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -564,7 +564,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
volatile int save_line_number;
#if defined (PROCESS_SUBSTITUTION)
volatile int ofifo, nfifo, osize, saved_fifo;
- volatile char *ofifo_list;
+ volatile void *ofifo_list;
#endif
if (breaking || continuing)
@@ -750,12 +750,14 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
reap_procsubs ();
# endif
- if (variable_context != 0) /* XXX - also if sourcelevel != 0? */
+ /* XXX - also if sourcelevel != 0? */
+ if (variable_context != 0)
{
ofifo = num_fifos ();
ofifo_list = copy_fifo_list ((int *)&osize);
begin_unwind_frame ("internal_fifos");
- add_unwind_protect (xfree, ofifo_list);
+ if (ofifo_list)
+ add_unwind_protect (xfree, ofifo_list);
saved_fifo = 1;
}
else
@@ -1099,26 +1101,10 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
{
nfifo = num_fifos ();
if (nfifo > ofifo)
- close_new_fifos ((char *)ofifo_list, osize);
+ close_new_fifos ((void *)ofifo_list, osize);
free ((void *)ofifo_list);
discard_unwind_frame ("internal_fifos");
}
-# if defined (HAVE_DEV_FD)
- /* Reap process substitutions at the end of loops */
- switch (command->type)
- {
- case cm_while:
- case cm_until:
- case cm_for:
- case cm_group:
-# if defined (ARITH_FOR_COMMAND)
- case cm_arith_for:
-# endif
- reap_procsubs ();
- default:
- break;
- }
-# endif /* HAVE_DEV_FD */
#endif
/* Invert the return value if we have to */
diff --git a/patchlevel.h b/patchlevel.h
index 9074f4dd..98e714da 100644
--- 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 16
+#define PATCHLEVEL 17
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index fd6db240..8884b487 100644
--- a/subst.c
+++ b/subst.c
@@ -5336,13 +5336,13 @@ clear_fifo_list ()
{
}
-char *
+void *
copy_fifo_list (sizep)
int *sizep;
{
if (sizep)
*sizep = 0;
- return (char *)NULL;
+ return (void *)NULL;
}
static void
@@ -5408,8 +5408,13 @@ unlink_fifo_list ()
for (i = j = 0; i < nfifo; i++)
if (fifo_list[i].file)
{
- fifo_list[j].file = fifo_list[i].file;
- fifo_list[j].proc = fifo_list[i].proc;
+ if (i != j)
+ {
+ fifo_list[j].file = fifo_list[i].file;
+ fifo_list[j].proc = fifo_list[i].proc;
+ fifo_list[i].file = (char *)NULL;
+ fifo_list[i].proc = 0;
+ }
j++;
}
nfifo = j;
@@ -5425,10 +5430,11 @@ unlink_fifo_list ()
case it's larger than fifo_list_size (size of fifo_list). */
void
close_new_fifos (list, lsize)
- char *list;
+ void *list;
int lsize;
{
int i;
+ char *plist;
if (list == 0)
{
@@ -5436,8 +5442,8 @@ close_new_fifos (list, lsize)
return;
}
- for (i = 0; i < lsize; i++)
- if (list[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1)
+ for (plist = (char *)list, i = 0; i < lsize; i++)
+ if (plist[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1)
unlink_fifo (i);
for (i = lsize; i < fifo_list_size; i++)
@@ -5559,22 +5565,22 @@ clear_fifo_list ()
nfds = 0;
}
-char *
+void *
copy_fifo_list (sizep)
int *sizep;
{
- char *ret;
+ void *ret;
if (nfds == 0 || totfds == 0)
{
if (sizep)
*sizep = 0;
- return (char *)NULL;
+ return (void *)NULL;
}
if (sizep)
*sizep = totfds;
- ret = (char *)xmalloc (totfds * sizeof (pid_t));
+ ret = xmalloc (totfds * sizeof (pid_t));
return (memcpy (ret, dev_fd_list, totfds * sizeof (pid_t)));
}
@@ -5647,10 +5653,11 @@ unlink_fifo_list ()
totfds (size of dev_fd_list). */
void
close_new_fifos (list, lsize)
- char *list;
+ void *list;
int lsize;
{
int i;
+ pid_t *plist;
if (list == 0)
{
@@ -5658,8 +5665,8 @@ close_new_fifos (list, lsize)
return;
}
- for (i = 0; i < lsize; i++)
- if (list[i] == 0 && i < totfds && dev_fd_list[i])
+ for (plist = (pid_t *)list, i = 0; i < lsize; i++)
+ if (plist[i] == 0 && i < totfds && dev_fd_list[i])
unlink_fifo (i);
for (i = lsize; i < totfds; i++)
diff --git a/subst.h b/subst.h
index 34763222..faf831bd 100644
--- a/subst.h
+++ b/subst.h
@@ -273,9 +273,8 @@ extern int num_fifos __P((void));
extern void unlink_fifo_list __P((void));
extern void unlink_fifo __P((int));
-extern char *copy_fifo_list __P((int *));
-extern void unlink_new_fifos __P((char *, int));
-extern void close_new_fifos __P((char *, int));
+extern void *copy_fifo_list __P((int *));
+extern void close_new_fifos __P((void *, int));
extern void clear_fifo_list __P((void));
--
2.25.1

View File

@ -1,96 +0,0 @@
From ddf3f643cb9b9a2ca8e6d996c605e4332204874c Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 18 Jan 2019 15:13:57 -0500
Subject: [PATCH] Bash-5.0 patch 2: fix expansion of aliases whose value ends
with an unquoted tab
---
parse.y | 5 ++++-
parser.h | 1 +
patchlevel.h | 2 +-
y.tab.c | 5 ++++-
4 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/parse.y b/parse.y
index 3ff87bcc..07e6e3e4 100644
--- a/parse.y
+++ b/parse.y
@@ -2557,12 +2557,14 @@ next_alias_char:
if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE &&
pushed_string_list->flags != PSH_DPAREN &&
(parser_state & PST_COMMENT) == 0 &&
+ (parser_state & PST_ENDALIAS) == 0 && /* only once */
shell_input_line_index > 0 &&
- shell_input_line[shell_input_line_index-1] != ' ' &&
+ 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 */
}
#endif
@@ -2571,6 +2573,7 @@ pop_alias:
/* This case works for PSH_DPAREN as well */
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];
if (uc)
diff --git a/parser.h b/parser.h
index 54dd2c88..6d08915d 100644
--- a/parser.h
+++ b/parser.h
@@ -47,6 +47,7 @@
#define PST_REPARSE 0x040000 /* re-parsing in parse_string_to_word_list */
#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. */
struct dstack {
diff --git a/patchlevel.h b/patchlevel.h
index 40db1a32..a988d852 100644
--- 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 1
+#define PATCHLEVEL 2
#endif /* _PATCHLEVEL_H_ */
diff --git a/y.tab.c b/y.tab.c
index 1abe2c50..7efce3c8 100644
--- a/y.tab.c
+++ b/y.tab.c
@@ -4873,12 +4873,14 @@ next_alias_char:
if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE &&
pushed_string_list->flags != PSH_DPAREN &&
(parser_state & PST_COMMENT) == 0 &&
+ (parser_state & PST_ENDALIAS) == 0 && /* only once */
shell_input_line_index > 0 &&
- shell_input_line[shell_input_line_index-1] != ' ' &&
+ 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 */
}
#endif
@@ -4887,6 +4889,7 @@ pop_alias:
/* This case works for PSH_DPAREN as well */
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];
if (uc)
--
2.17.2

View File

@ -1,202 +0,0 @@
From fcf6ae7d069a64741e9484cf219d7fe95de9e796 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Tue, 19 Mar 2019 10:05:39 -0400
Subject: [PATCH] Bash-5.0 patch 3: improvements when globbing directory names
containing backslashes
---
bashline.c | 2 +-
lib/glob/glob.c | 25 +++++++++++++++++++++----
lib/glob/glob.h | 1 +
lib/glob/glob_loop.c | 23 ++++++++++++++++-------
patchlevel.h | 2 +-
pathexp.c | 16 ++++++++++++----
6 files changed, 52 insertions(+), 17 deletions(-)
diff --git a/bashline.c b/bashline.c
index 75e79f1a..824ea9d9 100644
--- a/bashline.c
+++ b/bashline.c
@@ -3752,7 +3752,7 @@ completion_glob_pattern (string)
continue;
case '\\':
- if (*string == 0)
+ if (*string++ == 0)
return (0);
}
diff --git a/lib/glob/glob.c b/lib/glob/glob.c
index 22d90a5c..398253b5 100644
--- a/lib/glob/glob.c
+++ b/lib/glob/glob.c
@@ -1061,7 +1061,7 @@ glob_filename (pathname, flags)
char *directory_name, *filename, *dname, *fn;
unsigned int directory_len;
int free_dirname; /* flag */
- int dflags;
+ int dflags, hasglob;
result = (char **) malloc (sizeof (char *));
result_size = 1;
@@ -1110,9 +1110,12 @@ glob_filename (pathname, flags)
free_dirname = 1;
}
+ hasglob = 0;
/* 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))
+ 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;
register unsigned int i;
@@ -1175,7 +1178,7 @@ glob_filename (pathname, flags)
if (d[directory_len - 1] == '/')
d[directory_len - 1] = '\0';
- directories = glob_filename (d, dflags);
+ directories = glob_filename (d, dflags|GX_RECURSE);
if (free_dirname)
{
@@ -1332,6 +1335,20 @@ only_filename:
free (directory_name);
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);
if (result[0] == NULL)
diff --git a/lib/glob/glob.h b/lib/glob/glob.h
index b9462333..56ac08ba 100644
--- a/lib/glob/glob.h
+++ b/lib/glob/glob.h
@@ -30,6 +30,7 @@
#define GX_NULLDIR 0x100 /* internal -- no directory preceding pattern */
#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 *));
extern char **glob_vector __P((char *, char *, int));
diff --git a/lib/glob/glob_loop.c b/lib/glob/glob_loop.c
index 7d6ae211..3a4f4f1e 100644
--- a/lib/glob/glob_loop.c
+++ b/lib/glob/glob_loop.c
@@ -26,10 +26,10 @@ INTERNAL_GLOB_PATTERN_P (pattern)
{
register const GCHAR *p;
register GCHAR c;
- int bopen;
+ int bopen, bsquote;
p = pattern;
- bopen = 0;
+ bopen = bsquote = 0;
while ((c = *p++) != L('\0'))
switch (c)
@@ -55,13 +55,22 @@ INTERNAL_GLOB_PATTERN_P (pattern)
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'));
+ 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 0;
+ return bsquote ? 2 : 0;
}
#undef INTERNAL_GLOB_PATTERN_P
diff --git a/patchlevel.h b/patchlevel.h
index a988d852..e7e960c1 100644
--- 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/pathexp.c b/pathexp.c
index b51729a7..c1bf2d89 100644
--- a/pathexp.c
+++ b/pathexp.c
@@ -65,11 +65,11 @@ unquoted_glob_pattern_p (string)
{
register int c;
char *send;
- int open;
+ int open, bsquote;
DECLARE_MBSTATE;
- open = 0;
+ open = bsquote = 0;
send = string + strlen (string);
while (c = *string++)
@@ -100,7 +100,14 @@ unquoted_glob_pattern_p (string)
can be removed by the matching engine, so we have to run it through
globbing. */
case '\\':
- return (*string != 0);
+ if (*string != '\0' && *string != '/')
+ {
+ bsquote = 1;
+ string++;
+ continue;
+ }
+ else if (*string == 0)
+ return (0);
case CTLESC:
if (*string++ == '\0')
@@ -117,7 +124,8 @@ unquoted_glob_pattern_p (string)
ADVANCE_CHAR_P (string, send - string);
#endif
}
- return (0);
+
+ return (bsquote ? 2 : 0);
}
/* Return 1 if C is a character that is `special' in a POSIX ERE and needs to
--
2.17.2

View File

@ -1,42 +0,0 @@
From 16c907aa3bb427618733e5a6f2f4e2fc5a3488d3 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Sat, 20 Apr 2019 14:24:28 -0400
Subject: [PATCH] Bash-5.0 patch 4: the wait builtin without arguments only
waits for known children the shell started
---
jobs.c | 4 +---
patchlevel.h | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/jobs.c b/jobs.c
index ce2bdf24..ae3c54c6 100644
--- a/jobs.c
+++ b/jobs.c
@@ -2488,10 +2488,8 @@ wait_for_background_pids ()
r = wait_for (last_procsub_child->pid);
wait_procsubs ();
reap_procsubs ();
-#if 1
+#if 0
/* 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)
{
/* Check whether or not we have any unreaped children. */
diff --git a/patchlevel.h b/patchlevel.h
index e7e960c1..c059f0bd 100644
--- 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_ */
--
2.17.2

View File

@ -1,102 +0,0 @@
From 41f5420db7a911fb0833be693205f4db41f05434 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Sat, 20 Apr 2019 14:25:52 -0400
Subject: [PATCH] Bash-5.0 patch 5: prevent optimizing forks away too
aggressively
---
builtins/evalstring.c | 26 +++++++++++++++++++++++---
command.h | 1 +
execute_cmd.c | 2 ++
patchlevel.h | 2 +-
4 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
index 1496eeec..cadc9bc0 100644
--- a/builtins/evalstring.c
+++ b/builtins/evalstring.c
@@ -100,12 +100,22 @@ should_suppress_fork (command)
((command->flags & CMD_INVERT_RETURN) == 0));
}
+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)
COMMAND *command;
{
if (command->type == cm_connection &&
- (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR) &&
+ (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))
{
command->value.Connection->second->flags |= CMD_NO_FORK;
@@ -412,8 +422,18 @@ parse_and_execute (string, from_file, flags)
command->flags |= CMD_NO_FORK;
command->value.Simple->flags |= CMD_NO_FORK;
}
- else if (command->type == cm_connection)
- optimize_fork (command);
+
+ /* 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 */
/* See if this is a candidate for $( <file ). */
diff --git a/command.h b/command.h
index 32495162..b9e9b669 100644
--- a/command.h
+++ b/command.h
@@ -186,6 +186,7 @@ typedef struct element {
#define CMD_COPROC_SUBSHELL 0x1000
#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. */
typedef struct command {
diff --git a/execute_cmd.c b/execute_cmd.c
index 8b3c83aa..f1d74bfe 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -2767,6 +2767,8 @@ execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
((command->value.Connection->connector == OR_OR) &&
(exec_result != EXECUTION_SUCCESS)))
{
+ optimize_fork (command);
+
second = command->value.Connection->second;
if (ignore_return && second)
second->flags |= CMD_IGNORE_RETURN;
diff --git a/patchlevel.h b/patchlevel.h
index c059f0bd..1bc098b8 100644
--- 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_ */
--
2.17.2

View File

@ -1,39 +0,0 @@
From dfd2cc6ac5558e252af0a7cb829a9629bf782e17 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Sat, 20 Apr 2019 14:27:00 -0400
Subject: [PATCH] Bash-5.0 patch 6: allow building with SYSLOG_HISTORY defined
without defining SYSLOG_SHOPT
---
builtins/shopt.def | 2 +-
patchlevel.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/builtins/shopt.def b/builtins/shopt.def
index f6dc6f97..1c485361 100644
--- a/builtins/shopt.def
+++ b/builtins/shopt.def
@@ -122,7 +122,7 @@ extern int assoc_expand_once;
extern int array_expand_once;
#endif
-#if defined (SYSLOG_HISTORY) && defined (SYSLOG_SHOPT)
+#if defined (SYSLOG_HISTORY)
extern int syslog_history;
#endif
diff --git a/patchlevel.h b/patchlevel.h
index 1bc098b8..14bff9fc 100644
--- 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_ */
--
2.17.2

View File

@ -1,51 +0,0 @@
From 3ba697465bc74fab513a26dea700cc82e9f4724e Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Sat, 20 Apr 2019 14:27:56 -0400
Subject: [PATCH] Bash-5.0 patch 7: fix exec builtin leaving the terminal in
the wrong process group
---
jobs.c | 12 +++++-------
patchlevel.h | 2 +-
2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/jobs.c b/jobs.c
index ae3c54c6..6bc31dca 100644
--- a/jobs.c
+++ b/jobs.c
@@ -4837,15 +4837,13 @@ void
end_job_control ()
{
if (job_control)
- {
- terminate_stopped_jobs ();
+ terminate_stopped_jobs ();
- if (original_pgrp >= 0)
- give_terminal_to (original_pgrp, 1);
- }
+ if (original_pgrp >= 0 && terminal_pgrp != original_pgrp)
+ give_terminal_to (original_pgrp, 1);
- if (original_pgrp >= 0)
- setpgid (0, original_pgrp);
+ if (original_pgrp >= 0 && setpgid (0, original_pgrp) == 0)
+ shell_pgrp = original_pgrp;
}
/* Restart job control by closing shell tty and reinitializing. This is
diff --git a/patchlevel.h b/patchlevel.h
index 14bff9fc..deb9c5b7 100644
--- 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_ */
--
2.17.2

View File

@ -1,50 +0,0 @@
From 01323582f773ef4d08fa26a90e9a21285a8405f5 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Wed, 14 Aug 2019 14:57:48 -0400
Subject: [PATCH] Bash-5.0 patch 8: fix history offset when HISTSIZE == 0 that
can lead to crashes
---
bashhist.c | 5 ++++-
patchlevel.h | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/bashhist.c b/bashhist.c
index 7912cce3..d2155dce 100644
--- a/bashhist.c
+++ b/bashhist.c
@@ -560,15 +560,18 @@ pre_process_line (line, print_changes, addit)
add that line to the history if ADDIT is non-zero. */
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++;
+ history_length = old_len;
if (expanded)
{
diff --git a/patchlevel.h b/patchlevel.h
index deb9c5b7..16c87404 100644
--- 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_ */
--
2.21.0

View File

@ -1,38 +0,0 @@
From 9f597fd10993313262cab400bf3c46ffb3f6fd1e Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Wed, 14 Aug 2019 14:58:44 -0400
Subject: [PATCH] Bash-5.0 patch 9: fix file descriptor leak with zero-length
history file
---
lib/readline/histfile.c | 1 +
patchlevel.h | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/lib/readline/histfile.c b/lib/readline/histfile.c
index dc64bde1..a8a92aa3 100644
--- a/lib/readline/histfile.c
+++ b/lib/readline/histfile.c
@@ -305,6 +305,7 @@ read_history_range (const char *filename, int from, int to)
if (file_size == 0)
{
free (input);
+ close (file);
return 0; /* don't waste time if we don't have to */
}
diff --git a/patchlevel.h b/patchlevel.h
index 16c87404..02f1d606 100644
--- 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_ */
--
2.21.0

View File

@ -11,7 +11,7 @@ index dac95fd..5b7e811 100644
#define BASE_INDENT 4
diff --git a/builtins/mkbuiltins.c b/builtins/mkbuiltins.c
index 4f51201..91c25db 100644
index e243021..0a7a0e5 100644
--- a/builtins/mkbuiltins.c
+++ b/builtins/mkbuiltins.c
@@ -69,10 +69,15 @@ extern char *strcpy ();
@ -89,7 +89,7 @@ index 4f51201..91c25db 100644
static int
rename (from, to)
diff --git a/doc/bash.1 b/doc/bash.1
index d91f1fd..111a66d 100644
index 5af7d42..7539368 100644
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -239,6 +239,14 @@ The shell becomes restricted (see
@ -108,10 +108,10 @@ index d91f1fd..111a66d 100644
Equivalent to \fB\-v\fP.
.TP
diff --git a/doc/bashref.texi b/doc/bashref.texi
index d33cd57..6fc4d18 100644
index 9e23f58..d02151e 100644
--- a/doc/bashref.texi
+++ b/doc/bashref.texi
@@ -6453,6 +6453,13 @@ standard. @xref{Bash POSIX Mode}, for a description of the Bash
@@ -6554,6 +6554,13 @@ standard. @xref{Bash POSIX Mode}, for a description of the Bash
@item --restricted
Make the shell a restricted shell (@pxref{The Restricted Shell}).
@ -126,10 +126,10 @@ index d33cd57..6fc4d18 100644
Equivalent to @option{-v}. Print shell input lines as they're read.
diff --git a/eval.c b/eval.c
index f02d6e4..76c1e8d 100644
index 1d967da..f197033 100644
--- a/eval.c
+++ b/eval.c
@@ -142,7 +142,8 @@ reader_loop ()
@@ -137,7 +137,8 @@ reader_loop ()
if (read_command () == 0)
{
@ -137,13 +137,13 @@ index f02d6e4..76c1e8d 100644
+
+ if (interactive_shell == 0 && (read_but_dont_execute && !rpm_requires))
{
last_command_exit_value = EXECUTION_SUCCESS;
set_exit_status (EXECUTION_SUCCESS);
dispose_command (global_command);
diff --git a/execute_cmd.c b/execute_cmd.c
index 8b3c83a..4eae19c 100644
index d2555ad..397e283 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -542,6 +542,8 @@ async_redirect_stdin ()
@@ -543,6 +543,8 @@ async_redirect_stdin ()
#define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)
@ -151,8 +151,8 @@ index 8b3c83a..4eae19c 100644
+
/* Execute the command passed in COMMAND, perhaps doing it asynchronously.
COMMAND is exactly what read_command () places into GLOBAL_COMMAND.
ASYNCHROUNOUS, if non-zero, says to do this command in the background.
@@ -573,7 +575,13 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
ASYNCHRONOUS, if non-zero, says to do this command in the background.
@@ -574,7 +576,13 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
if (breaking || continuing)
return (last_command_exit_value);
@ -167,7 +167,7 @@ index 8b3c83a..4eae19c 100644
return (EXECUTION_SUCCESS);
QUIT;
@@ -2819,7 +2827,7 @@ execute_for_command (for_command)
@@ -2836,7 +2844,7 @@ execute_for_command (for_command)
save_line_number = line_number;
if (check_identifier (for_command->name, 1) == 0)
{
@ -177,7 +177,7 @@ index 8b3c83a..4eae19c 100644
last_command_exit_value = EX_BADUSAGE;
jump_to_top_level (ERREXIT);
diff --git a/execute_cmd.h b/execute_cmd.h
index dc2f15e..506fff4 100644
index 465030a..9c7fd1c 100644
--- a/execute_cmd.h
+++ b/execute_cmd.h
@@ -22,6 +22,9 @@
@ -191,7 +191,7 @@ index dc2f15e..506fff4 100644
#if defined (ARRAY_VARS)
struct func_array_state
diff --git a/make_cmd.c b/make_cmd.c
index ecbbfd6..3d8bfa4 100644
index 2d7ac96..ac53526 100644
--- a/make_cmd.c
+++ b/make_cmd.c
@@ -35,6 +35,8 @@
@ -264,10 +264,10 @@ index ecbbfd6..3d8bfa4 100644
return (command);
}
diff --git a/shell.c b/shell.c
index a2b2a55..c5d99b3 100644
index ce8087f..7dcd000 100644
--- a/shell.c
+++ b/shell.c
@@ -193,6 +193,9 @@ int have_devfd = 0;
@@ -194,6 +194,9 @@ int have_devfd = 0;
/* The name of the .(shell)rc file. */
static char *bashrc_file = DEFAULT_BASHRC;
@ -277,7 +277,7 @@ index a2b2a55..c5d99b3 100644
/* Non-zero means to act more like the Bourne shell on startup. */
static int act_like_sh;
@@ -259,6 +262,7 @@ static const struct {
@@ -260,6 +263,7 @@ static const struct {
{ "protected", Int, &protected_mode, (char **)0x0 },
#endif
{ "rcfile", Charp, (int *)0x0, &bashrc_file },
@ -285,7 +285,7 @@ index a2b2a55..c5d99b3 100644
#if defined (RESTRICTED_SHELL)
{ "restricted", Int, &restricted, (char **)0x0 },
#endif
@@ -496,6 +500,12 @@ main (argc, argv, env)
@@ -502,6 +506,12 @@ main (argc, argv, env)
if (dump_translatable_strings)
read_but_dont_execute = 1;
@ -299,7 +299,7 @@ index a2b2a55..c5d99b3 100644
disable_priv_mode ();
diff --git a/shell.h b/shell.h
index 8072605..6c4149d 100644
index 8b41792..29b0efb 100644
--- a/shell.h
+++ b/shell.h
@@ -99,6 +99,7 @@ extern int interactive, interactive_shell;

View File

@ -1,5 +1,5 @@
diff --git a/tests/exec.right b/tests/exec.right
index 6075cc8..0b3f02c 100644
index 0a249dd..fe8a127 100644
--- a/tests/exec.right
+++ b/tests/exec.right
@@ -51,7 +51,6 @@ this is ohio-state
@ -11,7 +11,7 @@ index 6075cc8..0b3f02c 100644
1
1
diff --git a/tests/execscript b/tests/execscript
index c1819de..9227a4a 100644
index 2809676..1216828 100644
--- a/tests/execscript
+++ b/tests/execscript
@@ -108,8 +108,6 @@ ${THIS_SH} ./exec6.sub
@ -24,7 +24,7 @@ index c1819de..9227a4a 100644
${THIS_SH} ./exec10.sub
diff --git a/tests/read.right b/tests/read.right
index 73cb704..a92fe7f 100644
index 1144083..09cd422 100644
--- a/tests/read.right
+++ b/tests/read.right
@@ -33,14 +33,6 @@ a = abcdefg
@ -35,18 +35,18 @@ index 73cb704..a92fe7f 100644
-
-timeout 2: ok
-
-./read2.sub: line 23: read: -3: invalid timeout specification
-./read2.sub: line 36: read: -3: invalid timeout specification
-1
-
-abcde
./read3.sub: line 4: read: -1: invalid number
./read3.sub: line 17: read: -1: invalid number
abc
ab
diff --git a/tests/read.tests b/tests/read.tests
index f67cd00..083f4a4 100644
index 7384f05..43fcf8d 100644
--- a/tests/read.tests
+++ b/tests/read.tests
@@ -82,9 +82,6 @@ echo " foo" | { IFS=$':' ; read line; recho "$line"; }
@@ -95,9 +95,6 @@ echo " foo" | { IFS=$':' ; read line; recho "$line"; }
# test read -d delim behavior
${THIS_SH} ./read1.sub
@ -56,6 +56,3 @@ index f67cd00..083f4a4 100644
# test read -n nchars behavior
${THIS_SH} ./read3.sub
--
2.17.2

View File

@ -1,12 +1,12 @@
#% define beta_tag rc2
%define patchleveltag .17
%define baseversion 5.0
%define patchleveltag .0
%define baseversion 5.1
%bcond_without tests
Version: %{baseversion}%{patchleveltag}
Name: bash
Summary: The GNU Bourne Again shell
Release: 3%{?dist}
Release: 1%{?dist}
License: GPLv3+
Url: https://www.gnu.org/software/bash
Source0: https://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz
@ -20,7 +20,6 @@ Source3: dot-bash_logout
# Official upstream patches
# Patches are converted to apply with '-p1'
%{lua:for i=1,17 do print(string.format("Patch%u: bash-5.0-patch-%u.patch\n", i, i)) end}
# Other patches
# We don't want to add '/etc:/usr/etc' in standard utils path.
@ -44,20 +43,20 @@ Patch109: bash-requires.patch
Patch110: bash-setlocale.patch
# Disable tty tests while doing bash builds
Patch111: bash-tty-tests.patch
# 484809, check if interp section is NOBITS
Patch116: bash-4.0-nobits.patch
# Do the same CFLAGS in generated Makefile in examples
Patch117: bash-4.1-examples.patch
# Builtins like echo and printf won't report errors
# when output does not succeed due to EPIPE
Patch118: bash-4.1-broken_pipe.patch
# # Enable system-wide .bash_logout for login shells
Patch119: bash-4.2-rc2-logout.patch
#
# Static analyzis shows some issues in bash-2.05a-interpreter.patch
Patch120: bash-4.2-coverity.patch
@ -68,17 +67,17 @@ Patch122: bash-4.2-manpage_trap.patch
# https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow
# This patch should be upstreamed.
Patch123: bash-4.2-size_type.patch
#
# 1112710 - mention ulimit -c and -f POSIX block size
# This patch should be upstreamed.
Patch124: bash-4.3-man-ulimit.patch
#
# 1102815 - fix double echoes in vi visual mode
Patch125: bash-4.3-noecho.patch
#
# #1241533,1224855 - bash leaks memory when LC_ALL set
#1241533,1224855 - bash leaks memory when LC_ALL set
Patch126: bash-4.3-memleak-lc_all.patch
#
# bash-4.4 builds loadable builtin examples by default
# this patch disables it
Patch127: bash-4.4-no-loadable-builtins.patch
@ -89,6 +88,7 @@ BuildRequires: ncurses-devel
BuildRequires: autoconf, gettext
# Required for bash tests
BuildRequires: glibc-all-langpacks
BuildRequires: make
Requires: filesystem >= 3
Provides: /bin/sh
Provides: /bin/bash
@ -129,7 +129,12 @@ autoconf
# Recycles pids is neccessary. When bash's last fork's pid was X
# and new fork's pid is also X, bash has to wait for this same pid.
# Without Recycles pids bash will not wait.
make "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS -DDEFAULT_PATH_VALUE='\"/usr/local/bin:/usr/bin\"' `getconf LFS_CFLAGS`" %{?_smp_mflags}
MFLAGS="CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS -DDEFAULT_PATH_VALUE='\"/usr/local/bin:/usr/bin\"' `getconf LFS_CFLAGS`"
# work around missing deps in Makefiles
make "$MFLAGS" version.h
make "$MFLAGS" %{?_smp_mflags} -C builtins
make "$MFLAGS" %{?_smp_mflags}
%install
if [ -e autoconf ]; then
@ -252,7 +257,7 @@ end
%postun -p <lua>
-- Run it only if we are uninstalling
if arg[2] == "0"
if arg[2] == 0
then
t={}
for line in io.lines("/etc/shells")
@ -308,6 +313,10 @@ end
%{_libdir}/pkgconfig/%{name}.pc
%changelog
* Wed Jan 6 10:40:25 CET 2021 Siteshwar Vashisht <svashisht@redhat.com> - 5.1.0-1
- Rebase to bash 5.1
Resolves: #1904866
* Fri Dec 4 14:44:06 CET 2020 Siteshwar Vashisht <svashisht@redhat.com> - 5.0.17-3
- Enable sourcing files from ~/.bashrc.d
Resolves: #1726397

View File

@ -1 +1 @@
SHA512 (bash-5.0.tar.gz) = bb4519f06e278f271d08722b531e49d2e842cc3e0b02a6b3eee422e2efcb5b6226111af43f5e5eae56beb85ac8bfebcd6a4aacbabb8f609e529aa4d571890864
SHA512 (bash-5.1.tar.gz) = c44a0ce381469219548a3a27589af3fea4f22eda1ca4e9434b59fc16da81b471c29ce18e31590e0860a6a251a664b68c2b45e3a17d22cfc02799ffd9a208390c