23 changed files with 115 additions and 1947 deletions
			
			
		| @ -1,170 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-001 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     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_ */ |  | ||||
| @ -1,117 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-002 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-002 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Ante Peric <synthmeat@gmail.com> |  | ||||
| Bug-Reference-ID:	<B7E3B567-2467-4F7B-B6B9-CA4E75A9C93F@gmail.com> |  | ||||
| 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_ */ |  | ||||
| @ -0,0 +1,72 @@ | |||||
|  | From 3d6b9e18506ad9daf4ec7b7d406b38d58ec88009 Mon Sep 17 00:00:00 2001 | ||||
|  | From: Peter Seiderer <ps.report@gmx.net> | ||||
|  | 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 <ps.report@gmx.net> | ||||
|  | ---
 | ||||
|  |  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 | ||||
|  | 
 | ||||
| @ -1,243 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-003 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-003 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Andrew Church <achurch+bash@achurch.org> |  | ||||
| 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_ */ |  | ||||
| @ -0,0 +1,40 @@ | |||||
|  | From a60ab1e5e88863acf9b0e9bcaa7919bbf093da05 Mon Sep 17 00:00:00 2001 | ||||
|  | From: Peter Seiderer <ps.report@gmx.net> | ||||
|  | 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 <ps.report@gmx.net> | ||||
|  | ---
 | ||||
|  |  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 | ||||
|  | 
 | ||||
| @ -1,57 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-004 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-004 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Daniel Kahn Gillmor <dkg@fifthhorseman.net> |  | ||||
| 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_ */ |  | ||||
| @ -1,114 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-005 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-005 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Brad Spencer <bspencer@blackberry.com> |  | ||||
| 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_ */ |  | ||||
| @ -1,51 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-006 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-006 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Tomas Mozes <hydrapolic@gmail.com> |  | ||||
| Bug-Reference-ID:	<CAG6MAzQumLU2vhnmr1UrYAUQAFW5Yo8hfM_sEibX9RJQWJkRrA@mail.gmail.com> |  | ||||
| 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_ */ |  | ||||
| @ -1,66 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-007 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-007 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Grisha Levit <grishalevit@gmail.com> |  | ||||
| Bug-Reference-ID:	<CAMu=BroHapG1AS3xB5SQaCX2XKu=-E2Ob9uW6LNuHvd=YohrDw@mail.gmail.com> |  | ||||
| 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_ */ |  | ||||
| @ -1,72 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-008 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-008 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Michael Albinus <michael.albinus@gmx.de> |  | ||||
| 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_ */ |  | ||||
| @ -1,46 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-009 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     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_ */ |  | ||||
| @ -1,176 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-010 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-010 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Thorsten Glaser <tg@mirbsd.de> |  | ||||
| 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=<unset> 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=<unset> 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_ */ |  | ||||
| @ -1,63 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-011 |  | ||||
| 
 |  | ||||
| Signed-off-by: Pascal de Bruijn <p.debruijn@unilogic.nl> |  | ||||
| 
 |  | ||||
| 			     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_ */ |  | ||||
| @ -1,68 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-012 |  | ||||
| 
 |  | ||||
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-012 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	lessbug@qq.com |  | ||||
| Bug-Reference-ID:	<tencent_6AA531D9A5CC4121D86BD5CDA2E0DA98C605@qq.com> |  | ||||
| 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_ */ |  | ||||
| @ -1,77 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-013 |  | ||||
| 
 |  | ||||
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-013 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	HIROSE Masaaki <hirose31@gmail.com> |  | ||||
| Bug-Reference-ID:	<CAGSOfA-RqiTe=+GsXsDKyZrrMWH4bDbXgMVVegMa6OjqC5xbnQ@mail.gmail.com> |  | ||||
| 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_ */ |  | ||||
| @ -1,56 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-014 |  | ||||
| 
 |  | ||||
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-014 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Johannes Hielscher <jhielscher@posteo.de> |  | ||||
| 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_ */ |  | ||||
| @ -1,82 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-015 |  | ||||
| 
 |  | ||||
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-015 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Yu Kou <ckyoog@gmail.com> |  | ||||
| Bug-Reference-ID:	<CAAqoF9Ko3nAShJXGzucafs-ByUagzZ4nbQonwEkwC7s9UqfWKw@mail.gmail.com> |  | ||||
| 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_ */ |  | ||||
| @ -1,62 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-016 |  | ||||
| 
 |  | ||||
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |  | ||||
| 
 |  | ||||
| 			     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_ */ |  | ||||
| @ -1,293 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash55-017 |  | ||||
| 
 |  | ||||
| Signed-off-by: Peter Korsgaard <peter@korsgaard.com> |  | ||||
| 
 |  | ||||
| 			     BASH PATCH REPORT |  | ||||
| 			     ================= |  | ||||
| 
 |  | ||||
| Bash-Release:	5.0 |  | ||||
| Patch-ID:	bash50-017 |  | ||||
| 
 |  | ||||
| Bug-Reported-by:	Valentin Lab <valentin.lab@kalysto.org> |  | ||||
| Bug-Reference-ID:	<ab981b9c-60a5-46d0-b7e6-a6d88b80df50@kalysto.org> |  | ||||
| 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_ */ |  | ||||
| @ -1,49 +0,0 @@ | |||||
| From https://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash55-018 |  | ||||
| 
 |  | ||||
| Signed-off-by: Peter Korsgaard <peter@korsgaard.com> |  | ||||
| 
 |  | ||||
| 			     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_ */ |  | ||||
| @ -1,84 +0,0 @@ | |||||
| From 73ca494c60d46103f806325e6ccbe9e400238008 Mon Sep 17 00:00:00 2001 |  | ||||
| From: Fabrice Fontaine <fontaine.fabrice@gmail.com> |  | ||||
| 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 <fontaine.fabrice@gmail.com> |  | ||||
| [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 |  | ||||
| 
 |  | ||||
					Loading…
					
					
				
		Reference in new issue