diff --git a/.gitignore b/.gitignore
index 72362fe..dc0eff1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
diff --git a/bash-2.05a-interpreter.patch b/bash-2.05a-interpreter.patch
index 110e44d..e8ca4ca 100644
--- a/bash-2.05a-interpreter.patch
+++ b/bash-2.05a-interpreter.patch
@@ -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
-
diff --git a/bash-3.2-ssh_source_bash.patch b/bash-3.2-ssh_source_bash.patch
index 5bd19ce..e675957 100644
--- a/bash-3.2-ssh_source_bash.patch
+++ b/bash-3.2-ssh_source_bash.patch
@@ -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). */
diff --git a/bash-4.3-memleak-lc_all.patch b/bash-4.3-memleak-lc_all.patch
index 77e86de..4de1753 100644
--- a/bash-4.3-memleak-lc_all.patch
+++ b/bash-4.3-memleak-lc_all.patch
@@ -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);
diff --git a/bash-4.3-noecho.patch b/bash-4.3-noecho.patch
index 8adf36d..f20cd6f 100644
--- a/bash-4.3-noecho.patch
+++ b/bash-4.3-noecho.patch
@@ -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
-
diff --git a/bash-5.0-patch-1.patch b/bash-5.0-patch-1.patch
deleted file mode 100644
index 254fd9e..0000000
--- a/bash-5.0-patch-1.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-10.patch b/bash-5.0-patch-10.patch
deleted file mode 100644
index b9b916e..0000000
--- a/bash-5.0-patch-10.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-11.patch b/bash-5.0-patch-11.patch
deleted file mode 100644
index 3a4172e..0000000
--- a/bash-5.0-patch-11.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-12.patch b/bash-5.0-patch-12.patch
deleted file mode 100644
index 3b383b1..0000000
--- a/bash-5.0-patch-12.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-13.patch b/bash-5.0-patch-13.patch
deleted file mode 100644
index f9060ae..0000000
--- a/bash-5.0-patch-13.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-14.patch b/bash-5.0-patch-14.patch
deleted file mode 100644
index efc0ee5..0000000
--- a/bash-5.0-patch-14.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-15.patch b/bash-5.0-patch-15.patch
deleted file mode 100644
index ce5e72f..0000000
--- a/bash-5.0-patch-15.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-16.patch b/bash-5.0-patch-16.patch
deleted file mode 100644
index a5e710d..0000000
--- a/bash-5.0-patch-16.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-17.patch b/bash-5.0-patch-17.patch
deleted file mode 100644
index bca2d4d..0000000
--- a/bash-5.0-patch-17.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-2.patch b/bash-5.0-patch-2.patch
deleted file mode 100644
index b9858ae..0000000
--- a/bash-5.0-patch-2.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-3.patch b/bash-5.0-patch-3.patch
deleted file mode 100644
index 509f52e..0000000
--- a/bash-5.0-patch-3.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-4.patch b/bash-5.0-patch-4.patch
deleted file mode 100644
index 8993833..0000000
--- a/bash-5.0-patch-4.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-5.patch b/bash-5.0-patch-5.patch
deleted file mode 100644
index 1fb4faf..0000000
--- a/bash-5.0-patch-5.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-6.patch b/bash-5.0-patch-6.patch
deleted file mode 100644
index bfd8460..0000000
--- a/bash-5.0-patch-6.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-7.patch b/bash-5.0-patch-7.patch
deleted file mode 100644
index 2a4315e..0000000
--- a/bash-5.0-patch-7.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-8.patch b/bash-5.0-patch-8.patch
deleted file mode 100644
index cb23681..0000000
--- a/bash-5.0-patch-8.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-5.0-patch-9.patch b/bash-5.0-patch-9.patch
deleted file mode 100644
index be8a347..0000000
--- a/bash-5.0-patch-9.patch
+++ /dev/null
@@ -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
-
diff --git a/bash-requires.patch b/bash-requires.patch
index 6167af1..86d0792 100644
--- a/bash-requires.patch
+++ b/bash-requires.patch
@@ -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;
diff --git a/bash-tty-tests.patch b/bash-tty-tests.patch
index f9b6532..9311746 100644
--- a/bash-tty-tests.patch
+++ b/bash-tty-tests.patch
@@ -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
-
diff --git a/bash.spec b/bash.spec
index 4527da7..e5df999 100644
--- a/bash.spec
+++ b/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.
@@ -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
diff --git a/sources b/sources
index dff100d..0e5cb59 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (bash-5.0.tar.gz) = bb4519f06e278f271d08722b531e49d2e842cc3e0b02a6b3eee422e2efcb5b6226111af43f5e5eae56beb85ac8bfebcd6a4aacbabb8f609e529aa4d571890864
+SHA512 (bash-5.1.tar.gz) = c44a0ce381469219548a3a27589af3fea4f22eda1ca4e9434b59fc16da81b471c29ce18e31590e0860a6a251a664b68c2b45e3a17d22cfc02799ffd9a208390c