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:
parent
c6c1337fe2
commit
62c46545a8
1
.gitignore
vendored
1
.gitignore
vendored
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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). */
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
33
bash.spec
33
bash.spec
@ -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.
|
||||
@ -57,7 +56,7 @@ 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
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (bash-5.0.tar.gz) = bb4519f06e278f271d08722b531e49d2e842cc3e0b02a6b3eee422e2efcb5b6226111af43f5e5eae56beb85ac8bfebcd6a4aacbabb8f609e529aa4d571890864
|
||||
SHA512 (bash-5.1.tar.gz) = c44a0ce381469219548a3a27589af3fea4f22eda1ca4e9434b59fc16da81b471c29ce18e31590e0860a6a251a664b68c2b45e3a17d22cfc02799ffd9a208390c
|
||||
|
Loading…
Reference in New Issue
Block a user