diff --git a/package/bash/bash.mk b/package/bash/bash.mk
index 7da63171..4528c41e 100644
--- a/package/bash/bash.mk
+++ b/package/bash/bash.mk
@@ -4,13 +4,11 @@
#
################################################################################
-BASH_VERSION = 5.1.16
+BASH_VERSION = 5.0
BASH_DIR = bash-$(BASH_VERSION)
BASH_SOURCE = bash-$(BASH_VERSION).tar.gz
BASH_SITE = $(GNU_MIRROR)/bash
-BASH_DEPENDENCIES = ncurses readline host-bison
-
BASH_CONF_ENV += \
bash_cv_getcwd_malloc=yes \
bash_cv_job_control_missing=present \
diff --git a/package/bash/patches/0001-bash50-001.patch b/package/bash/patches/0001-bash50-001.patch
new file mode 100644
index 00000000..90e89ce5
--- /dev/null
+++ b/package/bash/patches/0001-bash50-001.patch
@@ -0,0 +1,170 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-001
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-001
+
+Bug-Reported-by: axel@freakout.de
+Bug-Reference-ID: <201901082050.x08KoShS006731@bongo.freakout.de>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00079.html
+
+Bug-Description:
+
+Under certain circumstances, the glob expansion code did not remove
+backslashes escaping characters in directory names (or portions of a
+pattern preceding a slash).
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0/bashline.c 2018-11-27 13:20:16.000000000 -0500
+--- b/bashline.c 2019-01-16 16:06:03.000000000 -0500
+***************
+*** 232,235 ****
+--- 232,236 ----
+ static int bash_possible_command_completions __P((int, int));
+
++ static int completion_glob_pattern __P((char *));
+ static char *glob_complete_word __P((const char *, int));
+ static int bash_glob_completion_internal __P((int));
+***************
+*** 1742,1746 ****
+ /* This could be a globbing pattern, so try to expand it using pathname
+ expansion. */
+! if (!matches && glob_pattern_p (text))
+ {
+ matches = rl_completion_matches (text, glob_complete_word);
+--- 1743,1747 ----
+ /* This could be a globbing pattern, so try to expand it using pathname
+ expansion. */
+! if (!matches && completion_glob_pattern ((char *)text))
+ {
+ matches = rl_completion_matches (text, glob_complete_word);
+***************
+*** 1851,1855 ****
+ }
+
+! globpat = glob_pattern_p (hint_text);
+
+ /* If this is an absolute program name, do not check it against
+--- 1852,1856 ----
+ }
+
+! globpat = completion_glob_pattern ((char *)hint_text);
+
+ /* If this is an absolute program name, do not check it against
+***************
+*** 3714,3717 ****
+--- 3715,3773 ----
+ }
+
++ static int
++ completion_glob_pattern (string)
++ char *string;
++ {
++ register int c;
++ char *send;
++ int open;
++
++ DECLARE_MBSTATE;
++
++ open = 0;
++ send = string + strlen (string);
++
++ while (c = *string++)
++ {
++ switch (c)
++ {
++ case '?':
++ case '*':
++ return (1);
++
++ case '[':
++ open++;
++ continue;
++
++ case ']':
++ if (open)
++ return (1);
++ continue;
++
++ case '+':
++ case '@':
++ case '!':
++ if (*string == '(') /*)*/
++ return (1);
++ continue;
++
++ case '\\':
++ if (*string == 0)
++ return (0);
++ }
++
++ /* Advance one fewer byte than an entire multibyte character to
++ account for the auto-increment in the loop above. */
++ #ifdef HANDLE_MULTIBYTE
++ string--;
++ ADVANCE_CHAR_P (string, send - string);
++ string++;
++ #else
++ ADVANCE_CHAR_P (string, send - string);
++ #endif
++ }
++ return (0);
++ }
++
+ static char *globtext;
+ static char *globorig;
+***************
+*** 3878,3882 ****
+ }
+
+! if (t && glob_pattern_p (t) == 0)
+ rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */
+ FREE (t);
+--- 3934,3938 ----
+ }
+
+! if (t && completion_glob_pattern (t) == 0)
+ rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */
+ FREE (t);
+*** ../bash-5.0/lib/glob/glob_loop.c 2018-12-31 13:35:15.000000000 -0500
+--- b/lib/glob/glob_loop.c 2019-01-09 09:44:36.000000000 -0500
+***************
+*** 55,59 ****
+
+ case L('\\'):
+- #if 0
+ /* Don't let the pattern end in a backslash (GMATCH returns no match
+ if the pattern ends in a backslash anyway), but otherwise return 1,
+--- 55,58 ----
+***************
+*** 61,69 ****
+ and it can be removed. */
+ return (*p != L('\0'));
+- #else
+- /* The pattern may not end with a backslash. */
+- if (*p++ == L('\0'))
+- return 0;
+- #endif
+ }
+
+--- 60,63 ----
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 0
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 1
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0002-bash50-002.patch b/package/bash/patches/0002-bash50-002.patch
new file mode 100644
index 00000000..60d0a76f
--- /dev/null
+++ b/package/bash/patches/0002-bash50-002.patch
@@ -0,0 +1,117 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-002
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-002
+
+Bug-Reported-by: Ante Peric
+Bug-Reference-ID:
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00095.html
+
+Bug-Description:
+
+When an alias value ends with an unquoted literal tab (not part of a quoted
+string or comment), alias expansion cannot correctly detect the end of the
+alias value after expanding it.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0/parser.h 2018-12-28 19:11:18.000000000 -0500
+--- b/parser.h 2019-01-11 15:13:03.000000000 -0500
+***************
+*** 48,51 ****
+--- 48,52 ----
+ #define PST_REDIRLIST 0x080000 /* parsing a list of redirections preceding a simple command name */
+ #define PST_COMMENT 0x100000 /* parsing a shell comment; used by aliases */
++ #define PST_ENDALIAS 0x200000 /* just finished expanding and consuming an alias */
+
+ /* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */
+*** ../bash-5.0/parse.y 2019-01-02 13:57:34.000000000 -0500
+--- b/parse.y 2019-01-14 08:23:31.000000000 -0500
+***************
+*** 2558,2567 ****
+ pushed_string_list->flags != PSH_DPAREN &&
+ (parser_state & PST_COMMENT) == 0 &&
+ shell_input_line_index > 0 &&
+! shell_input_line[shell_input_line_index-1] != ' ' &&
+ shell_input_line[shell_input_line_index-1] != '\n' &&
+ shellmeta (shell_input_line[shell_input_line_index-1]) == 0 &&
+ (current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"'))
+ {
+ return ' '; /* END_ALIAS */
+ }
+--- 2558,2569 ----
+ pushed_string_list->flags != PSH_DPAREN &&
+ (parser_state & PST_COMMENT) == 0 &&
++ (parser_state & PST_ENDALIAS) == 0 && /* only once */
+ shell_input_line_index > 0 &&
+! shellblank (shell_input_line[shell_input_line_index-1]) == 0 &&
+ shell_input_line[shell_input_line_index-1] != '\n' &&
+ shellmeta (shell_input_line[shell_input_line_index-1]) == 0 &&
+ (current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"'))
+ {
++ parser_state |= PST_ENDALIAS;
+ return ' '; /* END_ALIAS */
+ }
+***************
+*** 2572,2575 ****
+--- 2574,2578 ----
+ if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE)
+ {
++ parser_state &= ~PST_ENDALIAS;
+ pop_string ();
+ uc = shell_input_line[shell_input_line_index];
+*** ../bash-5.0/y.tab.c 2019-01-02 13:57:43.000000000 -0500
+--- b/y.tab.c 2019-01-14 08:39:23.000000000 -0500
+***************
+*** 4874,4883 ****
+ pushed_string_list->flags != PSH_DPAREN &&
+ (parser_state & PST_COMMENT) == 0 &&
+ shell_input_line_index > 0 &&
+! shell_input_line[shell_input_line_index-1] != ' ' &&
+ shell_input_line[shell_input_line_index-1] != '\n' &&
+ shellmeta (shell_input_line[shell_input_line_index-1]) == 0 &&
+ (current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"'))
+ {
+ return ' '; /* END_ALIAS */
+ }
+--- 4874,4885 ----
+ pushed_string_list->flags != PSH_DPAREN &&
+ (parser_state & PST_COMMENT) == 0 &&
++ (parser_state & PST_ENDALIAS) == 0 && /* only once */
+ shell_input_line_index > 0 &&
+! shellblank (shell_input_line[shell_input_line_index-1]) == 0 &&
+ shell_input_line[shell_input_line_index-1] != '\n' &&
+ shellmeta (shell_input_line[shell_input_line_index-1]) == 0 &&
+ (current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"'))
+ {
++ parser_state |= PST_ENDALIAS;
+ return ' '; /* END_ALIAS */
+ }
+***************
+*** 4888,4891 ****
+--- 4890,4894 ----
+ if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE)
+ {
++ parser_state &= ~PST_ENDALIAS;
+ pop_string ();
+ uc = shell_input_line[shell_input_line_index];
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 1
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 2
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0002-locale-fix-typo-local_shiftstates-vs.-locale_shiftst.patch b/package/bash/patches/0002-locale-fix-typo-local_shiftstates-vs.-locale_shiftst.patch
deleted file mode 100644
index 1636c180..00000000
--- a/package/bash/patches/0002-locale-fix-typo-local_shiftstates-vs.-locale_shiftst.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From 3d6b9e18506ad9daf4ec7b7d406b38d58ec88009 Mon Sep 17 00:00:00 2001
-From: Peter Seiderer
-Date: Thu, 11 Mar 2021 20:48:36 +0100
-Subject: [PATCH] locale: fix typo local_shiftstates vs. locale_shiftstates
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Fixes:
-
- locale.c:94:3: error: ‘local_shiftstates’ undeclared (first use in this function); did you mean ‘locale_shiftstates’?
- 94 | local_shiftstates = 0;
- | ^~~~~~~~~~~~~~~~~
- | locale_shiftstates
-
-Signed-off-by: Peter Seiderer
----
- locale.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/locale.c b/locale.c
-index 17ccc58..d6dd95a 100644
---- a/locale.c
-+++ b/locale.c
-@@ -91,7 +91,7 @@ set_default_locale ()
- #if defined (HANDLE_MULTIBYTE)
- locale_shiftstates = mblen ((char *)NULL, 0);
- #else
-- local_shiftstates = 0;
-+ locale_shiftstates = 0;
- #endif
- }
-
-@@ -117,7 +117,7 @@ set_default_locale_vars ()
- # if defined (HANDLE_MULTIBYTE)
- locale_shiftstates = mblen ((char *)NULL, 0);
- # else
-- local_shiftstates = 0;
-+ locale_shiftstates = 0;
- # endif
-
- u32reset ();
-@@ -226,7 +226,7 @@ set_locale_var (var, value)
- # if defined (HANDLE_MULTIBYTE)
- locale_shiftstates = mblen ((char *)NULL, 0);
- # else
-- local_shiftstates = 0;
-+ locale_shiftstates = 0;
- # endif
- u32reset ();
- return r;
-@@ -250,7 +250,7 @@ set_locale_var (var, value)
- #if defined (HANDLE_MULTIBYTE)
- locale_shiftstates = mblen ((char *)NULL, 0);
- #else
-- local_shiftstates = 0;
-+ locale_shiftstates = 0;
- #endif
- u32reset ();
- }
-@@ -391,7 +391,7 @@ reset_locale_vars ()
- # if defined (HANDLE_MULTIBYTE)
- locale_shiftstates = mblen ((char *)NULL, 0);
- # else
-- local_shiftstates = 0;
-+ locale_shiftstates = 0;
- # endif
- u32reset ();
- #endif
---
-2.30.1
-
diff --git a/package/bash/patches/0003-bash50-003.patch b/package/bash/patches/0003-bash50-003.patch
new file mode 100644
index 00000000..12edb16a
--- /dev/null
+++ b/package/bash/patches/0003-bash50-003.patch
@@ -0,0 +1,243 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-003
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-003
+
+Bug-Reported-by: Andrew Church
+Bug-Reference-ID: <5c534aa2.04371@msgid.achurch.org>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00276.html
+
+Bug-Description:
+
+There are several incompatibilities in how bash-5.0 processes pathname
+expansion (globbing) of filename arguments that have backslashes in the
+directory portion.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/lib/glob/glob_loop.c 2019-01-16 16:13:21.000000000 -0500
+--- b/lib/glob/glob_loop.c 2019-02-01 09:45:11.000000000 -0500
+***************
+*** 27,34 ****
+ register const GCHAR *p;
+ register GCHAR c;
+! int bopen;
+
+ p = pattern;
+! bopen = 0;
+
+ while ((c = *p++) != L('\0'))
+--- 27,34 ----
+ register const GCHAR *p;
+ register GCHAR c;
+! int bopen, bsquote;
+
+ p = pattern;
+! bopen = bsquote = 0;
+
+ while ((c = *p++) != L('\0'))
+***************
+*** 56,66 ****
+ 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'));
+ }
+
+! return 0;
+ }
+
+--- 56,75 ----
+ 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 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 bsquote ? 2 : 0;
+ }
+
+*** ../bash-5.0-patched/lib/glob/glob.h 2013-10-28 14:46:12.000000000 -0400
+--- b/lib/glob/glob.h 2019-03-07 11:06:47.000000000 -0500
+***************
+*** 31,34 ****
+--- 31,35 ----
+ #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 *));
+*** ../bash-5.0-patched/lib/glob/glob.c 2018-09-20 10:53:23.000000000 -0400
+--- b/lib/glob/glob.c 2019-03-07 14:23:43.000000000 -0500
+***************
+*** 1062,1066 ****
+ unsigned int directory_len;
+ int free_dirname; /* flag */
+! int dflags;
+
+ result = (char **) malloc (sizeof (char *));
+--- 1078,1082 ----
+ unsigned int directory_len;
+ int free_dirname; /* flag */
+! int dflags, hasglob;
+
+ result = (char **) malloc (sizeof (char *));
+***************
+*** 1111,1117 ****
+ }
+
+ /* 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))
+ {
+ char **directories, *d, *p;
+--- 1127,1136 ----
+ }
+
++ hasglob = 0;
+ /* If directory_name contains globbing characters, then we
+! 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;
+***************
+*** 1176,1180 ****
+ d[directory_len - 1] = '\0';
+
+! directories = glob_filename (d, dflags);
+
+ if (free_dirname)
+--- 1195,1199 ----
+ d[directory_len - 1] = '\0';
+
+! directories = glob_filename (d, dflags|GX_RECURSE);
+
+ if (free_dirname)
+***************
+*** 1333,1336 ****
+--- 1352,1369 ----
+ 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);
+*** ../bash-5.0-patched/pathexp.c 2018-04-29 17:44:48.000000000 -0400
+--- b/pathexp.c 2019-01-31 20:19:41.000000000 -0500
+***************
+*** 66,74 ****
+ register int c;
+ char *send;
+! int open;
+
+ DECLARE_MBSTATE;
+
+! open = 0;
+ send = string + strlen (string);
+
+--- 66,74 ----
+ register int c;
+ char *send;
+! int open, bsquote;
+
+ DECLARE_MBSTATE;
+
+! open = bsquote = 0;
+ send = string + strlen (string);
+
+***************
+*** 101,105 ****
+ globbing. */
+ case '\\':
+! return (*string != 0);
+
+ case CTLESC:
+--- 101,112 ----
+ globbing. */
+ case '\\':
+! if (*string != '\0' && *string != '/')
+! {
+! bsquote = 1;
+! string++;
+! continue;
+! }
+! else if (*string == 0)
+! return (0);
+
+ case CTLESC:
+***************
+*** 118,122 ****
+ #endif
+ }
+! return (0);
+ }
+
+--- 125,130 ----
+ #endif
+ }
+!
+! return (bsquote ? 2 : 0);
+ }
+
+*** ../bash-5.0-patched/bashline.c 2019-01-16 16:13:21.000000000 -0500
+--- b/bashline.c 2019-02-22 09:29:08.000000000 -0500
+***************
+*** 3753,3757 ****
+
+ case '\\':
+! if (*string == 0)
+ return (0);
+ }
+--- 3766,3770 ----
+
+ case '\\':
+! if (*string++ == 0)
+ return (0);
+ }
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 2
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 3
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0003-glob-fix-dequote_pathname-vs.-udequote_pathname.patch b/package/bash/patches/0003-glob-fix-dequote_pathname-vs.-udequote_pathname.patch
deleted file mode 100644
index a801f682..00000000
--- a/package/bash/patches/0003-glob-fix-dequote_pathname-vs.-udequote_pathname.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From a60ab1e5e88863acf9b0e9bcaa7919bbf093da05 Mon Sep 17 00:00:00 2001
-From: Peter Seiderer
-Date: Thu, 11 Mar 2021 20:55:52 +0100
-Subject: [PATCH] glob: fix dequote_pathname vs. udequote_pathname
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Fixes:
-
- glob.c:123:28: error: static declaration of ‘udequote_pathname’ follows non-static declaration
- 123 | # define dequote_pathname udequote_pathname
- | ^~~~~~~~~~~~~~~~~
- glob.c:125:13: note: in expansion of macro ‘dequote_pathname’
- 125 | static void dequote_pathname PARAMS((char *));
- | ^~~~~~~~~~~~~~~~
- glob.c:118:6: note: previous declaration of ‘udequote_pathname’ was here
- 118 | void udequote_pathname PARAMS((char *));
- | ^~~~~~~~~~~~~~~~~
-
-Signed-off-by: Peter Seiderer
----
- lib/glob/glob.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/lib/glob/glob.c b/lib/glob/glob.c
-index eb6277f..c903b15 100644
---- a/lib/glob/glob.c
-+++ b/lib/glob/glob.c
-@@ -117,6 +117,5 @@ static int mbskipname PARAMS((char *, char *, int));
- #else
- # define dequote_pathname udequote_pathname
- #endif
--static void dequote_pathname PARAMS((char *));
- static int glob_testdir PARAMS((char *, int));
- static char **glob_dir_to_array PARAMS((char *, char **, int));
-
---
-2.30.1
-
diff --git a/package/bash/patches/0004-bash50-004.patch b/package/bash/patches/0004-bash50-004.patch
new file mode 100644
index 00000000..b2735860
--- /dev/null
+++ b/package/bash/patches/0004-bash50-004.patch
@@ -0,0 +1,57 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-004
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-004
+
+Bug-Reported-by: Daniel Kahn Gillmor
+Bug-Reference-ID: <87lg0g8aiw.fsf@fifthhorseman.net>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-04/msg00076.html
+
+Bug-Description:
+
+In bash-5.0, the `wait' builtin without arguments waits for all children of the
+shell. This includes children it `inherited' at shell invocation time. This
+patch modifies the behavior to not wait for these inherited children, some
+of which might be long-lived.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/jobs.c 2018-12-06 11:44:34.000000000 -0500
+--- b/jobs.c 2019-04-12 15:15:10.000000000 -0400
+***************
+*** 2489,2496 ****
+ wait_procsubs ();
+ reap_procsubs ();
+! #if 1
+ /* 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)
+ {
+--- 2490,2495 ----
+ wait_procsubs ();
+ reap_procsubs ();
+! #if 0
+ /* We don't want to wait indefinitely if we have stopped children. */
+ if (any_stopped == 0)
+ {
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 3
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 4
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0005-bash50-005.patch b/package/bash/patches/0005-bash50-005.patch
new file mode 100644
index 00000000..df1772f9
--- /dev/null
+++ b/package/bash/patches/0005-bash50-005.patch
@@ -0,0 +1,114 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-005
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-005
+
+Bug-Reported-by: Brad Spencer
+Bug-Reference-ID: <1b993ff2-ce4f-662a-6be4-393457362e47@blackberry.com>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00250.html
+
+Bug-Description:
+
+In certain cases, bash optimizes out a fork() call too early and prevents
+traps from running.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/command.h 2018-07-20 21:16:31.000000000 -0400
+--- b/command.h 2019-02-20 11:09:36.000000000 -0500
+***************
+*** 187,190 ****
+--- 188,192 ----
+ #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. */
+*** ../bash-5.0-patched/builtins/evalstring.c 2018-12-26 11:19:21.000000000 -0500
+--- b/builtins/evalstring.c 2019-01-29 14:15:19.000000000 -0500
+***************
+*** 101,104 ****
+--- 101,113 ----
+ }
+
++ 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)
+***************
+*** 106,110 ****
+ {
+ if (command->type == cm_connection &&
+! (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR) &&
+ should_suppress_fork (command->value.Connection->second))
+ {
+--- 115,120 ----
+ {
+ if (command->type == cm_connection &&
+! (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))
+ {
+***************
+*** 413,418 ****
+ command->value.Simple->flags |= CMD_NO_FORK;
+ }
+! else if (command->type == cm_connection)
+! optimize_fork (command);
+ #endif /* ONESHOT */
+
+--- 423,438 ----
+ command->value.Simple->flags |= CMD_NO_FORK;
+ }
+!
+! /* 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 */
+
+*** ../bash-5.0-patched/execute_cmd.c 2018-12-05 09:05:14.000000000 -0500
+--- b/execute_cmd.c 2019-01-25 15:59:00.000000000 -0500
+***************
+*** 2768,2771 ****
+--- 2768,2773 ----
+ (exec_result != EXECUTION_SUCCESS)))
+ {
++ optimize_fork (command);
++
+ second = command->value.Connection->second;
+ if (ignore_return && second)
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 4
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 5
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0006-bash50-006.patch b/package/bash/patches/0006-bash50-006.patch
new file mode 100644
index 00000000..e447989d
--- /dev/null
+++ b/package/bash/patches/0006-bash50-006.patch
@@ -0,0 +1,51 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-006
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-006
+
+Bug-Reported-by: Tomas Mozes
+Bug-Reference-ID:
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-03/msg00037.html
+
+Bug-Description:
+
+Bash-5.0 did not build successfully if SYSLOG_HISTORY was defined without
+also defining SYSLOG_SHOPT.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/builtins/shopt.def 2018-10-05 14:49:02.000000000 -0400
+--- b/builtins/shopt.def 2019-01-23 09:55:22.000000000 -0500
+***************
+*** 123,127 ****
+ #endif
+
+! #if defined (SYSLOG_HISTORY) && defined (SYSLOG_SHOPT)
+ extern int syslog_history;
+ #endif
+--- 123,127 ----
+ #endif
+
+! #if defined (SYSLOG_HISTORY)
+ extern int syslog_history;
+ #endif
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 5
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 6
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0007-bash50-007.patch b/package/bash/patches/0007-bash50-007.patch
new file mode 100644
index 00000000..164dfcc9
--- /dev/null
+++ b/package/bash/patches/0007-bash50-007.patch
@@ -0,0 +1,66 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-007
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-007
+
+Bug-Reported-by: Grisha Levit
+Bug-Reference-ID:
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-02/msg00067.html
+
+Bug-Description:
+
+Running `exec' when job control was disabled, even temporarily, but after it
+had been initialized, could leave the terminal in the wrong process group for
+the executed process.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/jobs.c 2018-12-06 11:44:34.000000000 -0500
+--- b/jobs.c 2019-04-12 15:15:10.000000000 -0400
+***************
+*** 4838,4850 ****
+ {
+ if (job_control)
+! {
+! terminate_stopped_jobs ();
+
+! if (original_pgrp >= 0)
+! give_terminal_to (original_pgrp, 1);
+! }
+
+! if (original_pgrp >= 0)
+! setpgid (0, original_pgrp);
+ }
+
+--- 4838,4848 ----
+ {
+ if (job_control)
+! terminate_stopped_jobs ();
+
+! if (original_pgrp >= 0 && terminal_pgrp != original_pgrp)
+! give_terminal_to (original_pgrp, 1);
+
+! if (original_pgrp >= 0 && setpgid (0, original_pgrp) == 0)
+! shell_pgrp = original_pgrp;
+ }
+
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 6
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 7
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0008-bash50-008.patch b/package/bash/patches/0008-bash50-008.patch
new file mode 100644
index 00000000..b571c923
--- /dev/null
+++ b/package/bash/patches/0008-bash50-008.patch
@@ -0,0 +1,72 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-008
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-008
+
+Bug-Reported-by: Michael Albinus
+Bug-Reference-ID: <87bm36k3kz.fsf@gmx.de>
+Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2019-02/msg00111.html
+
+Bug-Description:
+
+When HISTSIZE is set to 0, history expansion can leave the history length
+set to an incorrect value, leading to subsequent attempts to access invalid
+memory.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/bashhist.c 2018-07-05 22:41:14.000000000 -0400
+--- b/bashhist.c 2019-02-20 16:20:04.000000000 -0500
+***************
+*** 561,573 ****
+ if (!history_expansion_inhibited && history_expansion && history_expansion_p (line))
+ {
+ /* 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. */
+ 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++;
+
+ if (expanded)
+--- 561,576 ----
+ 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 = old_len;
+
+ if (expanded)
+
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 7
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 8
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0009-bash50-009.patch b/package/bash/patches/0009-bash50-009.patch
new file mode 100644
index 00000000..c53f464a
--- /dev/null
+++ b/package/bash/patches/0009-bash50-009.patch
@@ -0,0 +1,46 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-009
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-009
+
+Bug-Reported-by: chet.ramey@case.edu
+Bug-Reference-ID:
+Bug-Reference-URL:
+
+Bug-Description:
+
+The history file reading code doesn't close the file descriptor open to
+the history file when it encounters a zero-length file.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/lib/readline/histfile.c 2018-06-11 09:14:52.000000000 -0400
+--- b/lib/readline/histfile.c 2019-05-16 15:55:57.000000000 -0400
+***************
+*** 306,309 ****
+--- 312,316 ----
+ {
+ free (input);
++ close (file);
+ return 0; /* don't waste time if we don't have to */
+ }
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 8
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 9
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0010-bash50-010.patch b/package/bash/patches/0010-bash50-010.patch
new file mode 100644
index 00000000..ebc06a66
--- /dev/null
+++ b/package/bash/patches/0010-bash50-010.patch
@@ -0,0 +1,176 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-010
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-010
+
+Bug-Reported-by: Thorsten Glaser
+Bug-Reference-ID: <156622962831.19438.16374961114836556294.reportbug@tglase.lan.tarent.de>
+Bug-Reference-URL: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=935115
+
+Bug-Description:
+
+Bash-5.0 changed the way assignment statements preceding special builtins
+and shell functions were handled in posix mode. They automatically created
+or modified global variables instead of modifying existing local variables
+as in bash-4.4.
+
+The bash-4.4 posix-mode semantics were buggy, and resulted in creating
+local variables where they were not intended and modifying global variables
+and local variables simultaneously.
+
+The bash-5.0 changes were intended to fix this issue, but did not preserve
+enough backwards compatibility. The posix standard also changed what it
+required in these cases, so bash-5.0 is not bound by the strict conformance
+requirements that existed in previous issues of the standard.
+
+This patch modifies the bash-5.0 posix mode behavior in an effort to restore
+some backwards compatibility and rationalize the behavior in the presence of
+local variables. It
+
+1. Changes the assignment semantics to be more similar to standalone assignment
+ statements: assignments preceding a function call or special builtin while
+ executing in a shell function will modify the value of a local variable
+ with the same name for the duration of the function's execution;
+
+2. Changes assignments preceding shell function calls or special builtins
+ from within a shell function to no longer create or modify global variables
+ in the presence of a local variable with the same name;
+
+3. Assignment statements preceding a shell function call or special builtin
+ at the global scope continue to modify the (global) calling environment,
+ but are unaffected by assignments preceding function calls or special
+ builtins within a function, as described in item 2. This is also similar
+ to the behavior of a standalone assignment statement.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/variables.c 2018-12-18 11:07:21.000000000 -0500
+--- b/variables.c 2019-08-22 10:53:44.000000000 -0400
+***************
+*** 4461,4467 ****
+
+ /* 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. */
+ static void
+ push_posix_temp_var (data)
+--- 4461,4467 ----
+
+ /* Take a variable from an assignment statement preceding a posix special
+! 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)
+***************
+*** 4473,4486 ****
+ var = (SHELL_VAR *)data;
+
+! binding_table = global_variables->table;
+! if (binding_table == 0)
+! binding_table = global_variables->table = hash_create (VARIABLES_HASH_BUCKETS);
+!
+! v = bind_variable_internal (var->name, value_cell (var), binding_table, 0, ASS_FORCE|ASS_NOLONGJMP);
+
+ /* global variables are no longer temporary and don't need propagating. */
+! var->attributes &= ~(att_tempvar|att_propagate);
+ if (v)
+! v->attributes |= var->attributes;
+
+ if (find_special_var (var->name) >= 0)
+--- 4473,4497 ----
+ var = (SHELL_VAR *)data;
+
+! /* 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);
+!
+! /* 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. */
+! if (binding_table == global_variables->table)
+! var->attributes &= ~(att_tempvar|att_propagate);
+!
+ if (v)
+! {
+! v->attributes |= var->attributes;
+! v->attributes &= ~att_tempvar; /* not a temp var now */
+! }
+
+ if (find_special_var (var->name) >= 0)
+***************
+*** 4576,4587 ****
+ {
+ int i;
+
+ tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1);
+ tempvar_list[tvlist_ind = 0] = 0;
+!
+! hash_flush (temporary_env, pushf);
+! hash_dispose (temporary_env);
+ temporary_env = (HASH_TABLE *)NULL;
+
+ tempvar_list[tvlist_ind] = 0;
+
+--- 4587,4601 ----
+ {
+ int i;
++ HASH_TABLE *disposer;
+
+ tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1);
+ tempvar_list[tvlist_ind = 0] = 0;
+!
+! disposer = temporary_env;
+ temporary_env = (HASH_TABLE *)NULL;
+
++ hash_flush (disposer, pushf);
++ hash_dispose (disposer);
++
+ tempvar_list[tvlist_ind] = 0;
+
+*** ../bash-5.0-patched/tests/varenv.right 2018-12-17 15:39:48.000000000 -0500
+--- b/tests/varenv.right 2019-08-22 16:05:25.000000000 -0400
+***************
+*** 147,153 ****
+ outside: declare -- var="one"
+ inside: declare -x var="value"
+! outside: declare -x var="value"
+! inside: declare -- var="local"
+! outside: declare -x var="global"
+ foo= environment foo=
+ foo=foo environment foo=foo
+--- 147,153 ----
+ outside: declare -- var="one"
+ inside: declare -x var="value"
+! outside: declare -- var="outside"
+! inside: declare -x var="global"
+! outside: declare -- var="outside"
+ foo= environment foo=
+ foo=foo environment foo=foo
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 9
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 10
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0011-bash50-011.patch b/package/bash/patches/0011-bash50-011.patch
new file mode 100644
index 00000000..555d0f8f
--- /dev/null
+++ b/package/bash/patches/0011-bash50-011.patch
@@ -0,0 +1,63 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-011
+
+Signed-off-by: Pascal de Bruijn
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-011
+
+Bug-Reported-by: Matt Whitlock
+Bug-Reference-ID:
+Bug-Reference-URL: https://savannah.gnu.org/support/?109671
+
+Bug-Description:
+
+The conditional command did not perform appropriate quoted null character
+removal on its arguments, causing syntax errors and attempts to stat
+invalid pathnames.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/subst.c 2018-12-22 17:43:37.000000000 -0500
+--- b/subst.c 2019-04-14 13:25:41.000000000 -0400
+***************
+*** 3626,3630 ****
+ 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. */
+ char *
+ cond_expand_word (w, special)
+--- 3642,3648 ----
+ 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. In
+! any case, since we don't perform word splitting, we need to do quoted
+! null character removal. */
+ char *
+ cond_expand_word (w, special)
+***************
+*** 3647,3650 ****
+--- 3665,3670 ----
+ if (special == 0) /* LHS */
+ {
++ if (l->word)
++ word_list_remove_quoted_nulls (l);
+ dequote_list (l);
+ r = string_list (l);
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 10
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 11
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0012-bash50-012.patch b/package/bash/patches/0012-bash50-012.patch
new file mode 100644
index 00000000..d634932e
--- /dev/null
+++ b/package/bash/patches/0012-bash50-012.patch
@@ -0,0 +1,68 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-012
+
+Signed-off-by: Fabrice Fontaine
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-012
+
+Bug-Reported-by: lessbug@qq.com
+Bug-Reference-ID:
+Bug-Reference-URL:
+
+Bug-Description:
+
+When using previous-history to go back beyond the beginning of the history list,
+it's possible to move to an incorrect partial line.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/lib/readline/misc.c 2017-07-07 17:30:12.000000000 -0400
+--- b/lib/readline/misc.c 2019-05-16 11:43:46.000000000 -0400
+***************
+*** 577,580 ****
+--- 590,594 ----
+ {
+ HIST_ENTRY *old_temp, *temp;
++ int had_saved_line;
+
+ if (count < 0)
+***************
+*** 589,592 ****
+--- 603,607 ----
+
+ /* 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 ();
+
+***************
+*** 612,616 ****
+ if (temp == 0)
+ {
+! rl_maybe_unsave_line ();
+ rl_ding ();
+ }
+--- 627,632 ----
+ if (temp == 0)
+ {
+! if (had_saved_line == 0)
+! _rl_free_saved_history_line ();
+ rl_ding ();
+ }
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 11
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 12
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0013-bash50-013.patch b/package/bash/patches/0013-bash50-013.patch
new file mode 100644
index 00000000..1c99f5c8
--- /dev/null
+++ b/package/bash/patches/0013-bash50-013.patch
@@ -0,0 +1,77 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-013
+
+Signed-off-by: Fabrice Fontaine
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-013
+
+Bug-Reported-by: HIROSE Masaaki
+Bug-Reference-ID:
+Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2019-05/msg00038.html
+
+Bug-Description:
+
+Reading history entries with timestamps can result in history entries joined
+by linefeeds.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/lib/readline/histfile.c 2018-06-11 09:14:52.000000000 -0400
+--- b/lib/readline/histfile.c 2019-05-16 15:55:57.000000000 -0400
+***************
+*** 370,376 ****
+
+ has_timestamps = HIST_TIMESTAMP_START (buffer);
+! history_multiline_entries += has_timestamps && history_write_timestamps;
+
+ /* Skip lines until we are at FROM. */
+ for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++)
+ if (*line_end == '\n')
+--- 370,378 ----
+
+ has_timestamps = HIST_TIMESTAMP_START (buffer);
+! 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')
+***************
+*** 381,385 ****
+--- 383,398 ----
+ 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;
++ }
+ }
+
+
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 12
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 13
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0014-bash50-014.patch b/package/bash/patches/0014-bash50-014.patch
new file mode 100644
index 00000000..2aadbda8
--- /dev/null
+++ b/package/bash/patches/0014-bash50-014.patch
@@ -0,0 +1,56 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-014
+
+Signed-off-by: Fabrice Fontaine
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-014
+
+Bug-Reported-by: Johannes Hielscher
+Bug-Reference-ID: <20190208205048.77c25a83@hordevm>
+Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2019-02/msg00032.html
+
+Bug-Description:
+
+If the current line is empty, using the emacs C-xC-e binding to enter the
+editor will edit the previous command instead of the current (empty) one.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/bashline.c 2019-01-16 16:13:21.000000000 -0500
+--- b/bashline.c 2019-02-11 11:18:57.000000000 -0500
+***************
+*** 962,970 ****
+ 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 = 0; /* for dummy history entry */
+ bash_add_history ("");
+--- 965,970 ----
+ finished with the command, so we should not ignore the last command */
+ using_history ();
+! 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 ("");
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 13
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 14
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0015-bash50-015.patch b/package/bash/patches/0015-bash50-015.patch
new file mode 100644
index 00000000..d927f41a
--- /dev/null
+++ b/package/bash/patches/0015-bash50-015.patch
@@ -0,0 +1,82 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-015
+
+Signed-off-by: Fabrice Fontaine
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-015
+
+Bug-Reported-by: Yu Kou
+Bug-Reference-ID:
+Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2019-05/msg00032.html
+
+Bug-Description:
+
+If alias expansion is enabled when processing the command argument to the
+`-c' option, an alias is defined in that command, and the command ends with
+the invocation of that alias, the shell's command parser can prematurely
+terminate before the entire command is executed.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-20190426/builtins/evalstring.c 2019-01-29 14:15:19.000000000 -0500
+--- b/builtins/evalstring.c 2019-05-15 14:19:36.000000000 -0400
+***************
+*** 92,95 ****
+--- 92,96 ----
+ running_trap == 0 &&
+ *bash_input.location.string == '\0' &&
++ parser_expanding_alias () == 0 &&
+ command->type == cm_simple &&
+ signal_is_trapped (EXIT_TRAP) == 0 &&
+***************
+*** 106,109 ****
+--- 107,111 ----
+ {
+ 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);
+***************
+*** 291,295 ****
+ with_input_from_string (string, from_file);
+ clear_shell_input_line ();
+! while (*(bash_input.location.string))
+ {
+ command = (COMMAND *)NULL;
+--- 293,297 ----
+ with_input_from_string (string, from_file);
+ clear_shell_input_line ();
+! while (*(bash_input.location.string) || parser_expanding_alias ())
+ {
+ command = (COMMAND *)NULL;
+***************
+*** 546,550 ****
+
+ with_input_from_string (string, from_file);
+! while (*(bash_input.location.string))
+ {
+ command = (COMMAND *)NULL;
+--- 548,552 ----
+
+ with_input_from_string (string, from_file);
+! while (*(bash_input.location.string)) /* XXX - parser_expanding_alias () ? */
+ {
+ command = (COMMAND *)NULL;
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 14
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 15
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0016-bash50-016.patch b/package/bash/patches/0016-bash50-016.patch
new file mode 100644
index 00000000..8dec1fb3
--- /dev/null
+++ b/package/bash/patches/0016-bash50-016.patch
@@ -0,0 +1,62 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-016
+
+Signed-off-by: Fabrice Fontaine
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-016
+
+Bug-Reported-by: sunnycemetery@gmail.com
+Bug-Reference-ID: <20190316041534.GB22884@midnight>
+Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2019-03/msg00070.html
+
+Bug-Description:
+
+Bash waits too long to reap /dev/fd process substitutions used as redirections
+with loops and group commands, which can lead to file descriptor exhaustion.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.0-patched/execute_cmd.c 2019-04-19 15:46:36.000000000 -0400
+--- b/execute_cmd.c 2019-07-01 16:45:49.000000000 -0400
+***************
+*** 1104,1107 ****
+--- 1085,1104 ----
+ 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
+
+
+*** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 15
+
+ #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 16
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0017-bash50-017.patch b/package/bash/patches/0017-bash50-017.patch
new file mode 100644
index 00000000..6758b203
--- /dev/null
+++ b/package/bash/patches/0017-bash50-017.patch
@@ -0,0 +1,293 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash55-017
+
+Signed-off-by: Peter Korsgaard
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-017
+
+Bug-Reported-by: Valentin Lab
+Bug-Reference-ID:
+Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2020-03/msg00062.html
+
+Bug-Description:
+
+There were cases where patch 16 reaped process substitution file descriptors
+(or FIFOs) and processes to early. This is a better fix for the problem that
+bash50-016 attempted to solve.
+
+Patch (apply with `patch -p0'):
+
+*** bash-5.0-patched/subst.c 2019-08-29 11:16:49.000000000 -0400
+--- b/subst.c 2020-04-02 16:24:19.000000000 -0400
+***************
+*** 5337,5341 ****
+ }
+
+! char *
+ copy_fifo_list (sizep)
+ int *sizep;
+--- b/5337,5341 ----
+ }
+
+! void *
+ copy_fifo_list (sizep)
+ int *sizep;
+***************
+*** 5343,5347 ****
+ if (sizep)
+ *sizep = 0;
+! return (char *)NULL;
+ }
+
+--- b/5343,5347 ----
+ if (sizep)
+ *sizep = 0;
+! return (void *)NULL;
+ }
+
+***************
+*** 5409,5414 ****
+ if (fifo_list[i].file)
+ {
+! fifo_list[j].file = fifo_list[i].file;
+! fifo_list[j].proc = fifo_list[i].proc;
+ j++;
+ }
+--- b/5409,5419 ----
+ if (fifo_list[i].file)
+ {
+! 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++;
+ }
+***************
+*** 5426,5433 ****
+ void
+ close_new_fifos (list, lsize)
+! char *list;
+ int lsize;
+ {
+ int i;
+
+ if (list == 0)
+--- b/5431,5439 ----
+ void
+ close_new_fifos (list, lsize)
+! void *list;
+ int lsize;
+ {
+ int i;
++ char *plist;
+
+ if (list == 0)
+***************
+*** 5437,5442 ****
+ }
+
+! for (i = 0; i < lsize; i++)
+! if (list[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1)
+ unlink_fifo (i);
+
+--- b/5443,5448 ----
+ }
+
+! 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);
+
+***************
+*** 5560,5568 ****
+ }
+
+! char *
+ copy_fifo_list (sizep)
+ int *sizep;
+ {
+! char *ret;
+
+ if (nfds == 0 || totfds == 0)
+--- b/5566,5574 ----
+ }
+
+! void *
+ copy_fifo_list (sizep)
+ int *sizep;
+ {
+! void *ret;
+
+ if (nfds == 0 || totfds == 0)
+***************
+*** 5570,5579 ****
+ if (sizep)
+ *sizep = 0;
+! return (char *)NULL;
+ }
+
+ if (sizep)
+ *sizep = totfds;
+! ret = (char *)xmalloc (totfds * sizeof (pid_t));
+ return (memcpy (ret, dev_fd_list, totfds * sizeof (pid_t)));
+ }
+--- b/5576,5585 ----
+ if (sizep)
+ *sizep = 0;
+! return (void *)NULL;
+ }
+
+ if (sizep)
+ *sizep = totfds;
+! ret = xmalloc (totfds * sizeof (pid_t));
+ return (memcpy (ret, dev_fd_list, totfds * sizeof (pid_t)));
+ }
+***************
+*** 5648,5655 ****
+ void
+ close_new_fifos (list, lsize)
+! char *list;
+ int lsize;
+ {
+ int i;
+
+ if (list == 0)
+--- b/5654,5662 ----
+ void
+ close_new_fifos (list, lsize)
+! void *list;
+ int lsize;
+ {
+ int i;
++ pid_t *plist;
+
+ if (list == 0)
+***************
+*** 5659,5664 ****
+ }
+
+! for (i = 0; i < lsize; i++)
+! if (list[i] == 0 && i < totfds && dev_fd_list[i])
+ unlink_fifo (i);
+
+--- b/5666,5671 ----
+ }
+
+! for (plist = (pid_t *)list, i = 0; i < lsize; i++)
+! if (plist[i] == 0 && i < totfds && dev_fd_list[i])
+ unlink_fifo (i);
+
+*** bash-5.0-patched/subst.h 2018-10-21 18:46:09.000000000 -0400
+--- b/subst.h 2020-04-02 16:29:28.000000000 -0400
+***************
+*** 274,280 ****
+ 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 clear_fifo_list __P((void));
+--- b/274,279 ----
+ extern void unlink_fifo __P((int));
+
+! extern void *copy_fifo_list __P((int *));
+! extern void close_new_fifos __P((void *, int));
+
+ extern void clear_fifo_list __P((void));
+*** bash-5.0-patched/execute_cmd.c 2020-02-06 20:16:48.000000000 -0500
+--- b/execute_cmd.c 2020-04-02 17:00:10.000000000 -0400
+***************
+*** 565,569 ****
+ #if defined (PROCESS_SUBSTITUTION)
+ volatile int ofifo, nfifo, osize, saved_fifo;
+! volatile char *ofifo_list;
+ #endif
+
+--- b/565,569 ----
+ #if defined (PROCESS_SUBSTITUTION)
+ volatile int ofifo, nfifo, osize, saved_fifo;
+! volatile void *ofifo_list;
+ #endif
+
+***************
+*** 751,760 ****
+ # endif
+
+! if (variable_context != 0) /* XXX - also if sourcelevel != 0? */
+ {
+ ofifo = num_fifos ();
+ ofifo_list = copy_fifo_list ((int *)&osize);
+ begin_unwind_frame ("internal_fifos");
+! add_unwind_protect (xfree, ofifo_list);
+ saved_fifo = 1;
+ }
+--- b/751,762 ----
+ # endif
+
+! /* XXX - also if sourcelevel != 0? */
+! if (variable_context != 0)
+ {
+ ofifo = num_fifos ();
+ ofifo_list = copy_fifo_list ((int *)&osize);
+ begin_unwind_frame ("internal_fifos");
+! if (ofifo_list)
+! add_unwind_protect (xfree, ofifo_list);
+ saved_fifo = 1;
+ }
+***************
+*** 1100,1123 ****
+ nfifo = num_fifos ();
+ if (nfifo > ofifo)
+! close_new_fifos ((char *)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
+
+--- b/1102,1109 ----
+ nfifo = num_fifos ();
+ if (nfifo > ofifo)
+! close_new_fifos ((void *)ofifo_list, osize);
+ free ((void *)ofifo_list);
+ discard_unwind_frame ("internal_fifos");
+ }
+ #endif
+
+
+*** bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 16
+
+ #endif /* _PATCHLEVEL_H_ */
+--- b/26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 17
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0018-bash50-018.patch b/package/bash/patches/0018-bash50-018.patch
new file mode 100644
index 00000000..efecb189
--- /dev/null
+++ b/package/bash/patches/0018-bash50-018.patch
@@ -0,0 +1,49 @@
+From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash55-018
+
+Signed-off-by: Peter Korsgaard
+
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 5.0
+Patch-ID: bash50-018
+
+Bug-Reported-by: oguzismailuysal@gmail.com
+Bug-Reference-ID:
+Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2019-10/msg00098.html
+
+Bug-Description:
+
+In certain cases, bash does not perform quoted null removal on patterns
+that are used as part of word expansions such as ${parameter##pattern}, so
+empty patterns are treated as non-empty.
+
+Patch (apply with `patch -p0'):
+
+*** bash-5.0.17/subst.c 2020-04-02 17:14:58.000000000 -0400
+--- b/subst.c 2020-07-09 15:28:19.000000000 -0400
+***************
+*** 5113,5116 ****
+--- b/5113,5118 ----
+ (int *)NULL, (int *)NULL)
+ : (WORD_LIST *)0;
++ if (l)
++ word_list_remove_quoted_nulls (l);
+ pat = string_list (l);
+ dispose_words (l);
+
+*** bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
+--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 17
+
+ #endif /* _PATCHLEVEL_H_ */
+--- b/26,30 ----
+ looks for to find the patch level (for the sccs version string). */
+
+! #define PATCHLEVEL 18
+
+ #endif /* _PATCHLEVEL_H_ */
diff --git a/package/bash/patches/0001-input.h-add-missing-include-on-stdio.h.patch b/package/bash/patches/0019-input.h-add-missing-include-on-stdio.h.patch
similarity index 100%
rename from package/bash/patches/0001-input.h-add-missing-include-on-stdio.h.patch
rename to package/bash/patches/0019-input.h-add-missing-include-on-stdio.h.patch
diff --git a/package/bash/patches/0020-locale.c-fix-build-without-wchar.patch b/package/bash/patches/0020-locale.c-fix-build-without-wchar.patch
new file mode 100644
index 00000000..15c5f2e4
--- /dev/null
+++ b/package/bash/patches/0020-locale.c-fix-build-without-wchar.patch
@@ -0,0 +1,84 @@
+From 73ca494c60d46103f806325e6ccbe9e400238008 Mon Sep 17 00:00:00 2001
+From: Fabrice Fontaine
+Date: Sun, 23 Feb 2020 11:41:09 +0100
+Subject: [PATCH] locale.c: fix build without wchar
+
+bash unconditionally builds locale.c which depends on mblen since
+version 5.0 and
+https://github.com/bminor/bash/commit/d233b485e83c3a784b803fb894280773f16f2deb
+
+This results in the following build failure if wchar is not available:
+
+/home/buildroot/autobuild/run/instance-0/output-1/host/bin/microblazeel-buildroot-linux-uclibc-gcc -L./builtins -L/home/buildroot/autobuild/run/instance-0/output-1/host/microblazeel-buildroot-linux-uclibc/sysroot/lib -L/home/buildroot/autobuild/run/instance-0/output-1/host/microblazeel-buildroot-linux-uclibc/sysroot/lib -L./lib/glob -L./lib/tilde -L./lib/sh -rdynamic -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -Wno-parentheses -Wno-format-security -o bash shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o expr.o flags.o jobs.o subst.o hashcmd.o hashlib.o mailcheck.o trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o alias.o array.o arrayfunc.o assoc.o braces.o bracecomp.o bashhist.o bashline.o list.o stringlib.o locale.o findcmd.o redir.o pcomplete.o pcomplib.o syntax.o xmalloc.o signames.o -lbuiltins -lglob -lsh -lreadline -lhistory -lcurses -ltilde -ldl
+/home/buildroot/autobuild/run/instance-0/output-1/host/lib/gcc/microblazeel-buildroot-linux-uclibc/8.3.0/../../../../microblazeel-buildroot-linux-uclibc/bin/ld: locale.o: in function `set_default_locale':
+(.text+0x260): undefined reference to `mblen'
+
+To fix this issue, don't use mblen if HANDLE_MULTIBYTE is not defined,
+an other possibility would be to use MBLEN wrapper defined in shmbutil.h
+
+Fixes:
+ - http://autobuild.buildroot.org/results/298fb9c785e137bff432dd304eb56986e54ce3ed
+
+Signed-off-by: Fabrice Fontaine
+[Upstream status: https://savannah.gnu.org/support/index.php?110200]
+---
+ locale.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/locale.c b/locale.c
+index d62547f6..a64c5b4b 100644
+--- a/locale.c
++++ b/locale.c
+@@ -86,7 +86,9 @@ set_default_locale ()
+
+ locale_mb_cur_max = MB_CUR_MAX;
+ locale_utf8locale = locale_isutf8 (default_locale);
++#if defined (HANDLE_MULTIBYTE)
+ locale_shiftstates = mblen ((char *)NULL, 0);
++#endif
+ }
+
+ /* Set default values for LC_CTYPE, LC_COLLATE, LC_MESSAGES, LC_NUMERIC and
+@@ -107,7 +109,9 @@ set_default_locale_vars ()
+ locale_setblanks ();
+ locale_mb_cur_max = MB_CUR_MAX;
+ locale_utf8locale = locale_isutf8 (lc_all);
++# if defined (HANDLE_MULTIBYTE)
+ locale_shiftstates = mblen ((char *)NULL, 0);
++# endif
+ u32reset ();
+ }
+ # endif
+@@ -211,7 +215,9 @@ set_locale_var (var, value)
+ /* if LC_ALL == "", reset_locale_vars has already called this */
+ if (*lc_all && x)
+ locale_utf8locale = locale_isutf8 (lc_all);
++# if defined (HANDLE_MULTIBYTE)
+ locale_shiftstates = mblen ((char *)NULL, 0);
++# endif
+ u32reset ();
+ return r;
+ #else
+@@ -231,7 +237,9 @@ set_locale_var (var, value)
+ /* if setlocale() returns NULL, the locale is not changed */
+ if (x)
+ locale_utf8locale = locale_isutf8 (x);
++# if defined (HANDLE_MULTIBYTE)
+ locale_shiftstates = mblen ((char *)NULL, 0);
++# endif
+ u32reset ();
+ }
+ # endif
+@@ -368,7 +376,9 @@ reset_locale_vars ()
+ locale_mb_cur_max = MB_CUR_MAX;
+ if (x)
+ locale_utf8locale = locale_isutf8 (x);
++# if defined (HANDLE_MULTIBYTE)
+ locale_shiftstates = mblen ((char *)NULL, 0);
++# endif
+ u32reset ();
+ #endif
+ return 1;
+--
+2.25.0
+