From 8102db7f8e5ab2493b7bcb4bd5ad4897d83faf69 Mon Sep 17 00:00:00 2001 From: Marcel Denia Date: Thu, 25 Sep 2014 02:39:47 +0200 Subject: [PATCH 1/5] bash: Import from oldpackages Signed-off-by: Marcel Denia --- utils/bash/Makefile | 64 +++++ utils/bash/patches/001-compile-fix.patch | 15 ++ .../patches/002-force-internal-readline.patch | 24 ++ .../patches/101-upstream-bash42-001.patch | 65 +++++ .../patches/102-upstream-bash42-002.patch | 50 ++++ .../patches/103-upstream-bash42-003.patch | 231 ++++++++++++++++++ .../patches/104-upstream-bash42-004.patch | 40 +++ .../patches/105-upstream-bash42-005.patch | 114 +++++++++ .../patches/106-upstream-bash42-006.patch | 37 +++ .../patches/107-upstream-bash42-007.patch | 39 +++ .../patches/108-upstream-bash42-008.patch | 65 +++++ .../patches/109-upstream-bash42-009.patch | 65 +++++ .../patches/110-upstream-bash42-010.patch | 56 +++++ .../patches/111-upstream-bash42-011.patch | 41 ++++ .../patches/112-upstream-bash42-012.patch | 145 +++++++++++ .../patches/113-upstream-bash42-013.patch | 43 ++++ .../patches/114-upstream-bash42-014.patch | 38 +++ .../patches/115-upstream-bash42-015.patch | 71 ++++++ .../patches/116-upstream-bash42-016.patch | 37 +++ .../patches/117-upstream-bash42-017.patch | 42 ++++ .../patches/118-upstream-bash42-018.patch | 57 +++++ .../patches/119-upstream-bash42-019.patch | 42 ++++ .../patches/120-upstream-bash42-020.patch | 47 ++++ .../patches/121-upstream-bash42-021.patch | 48 ++++ .../patches/122-upstream-bash42-022.patch | 46 ++++ .../patches/123-upstream-bash42-023.patch | 53 ++++ .../patches/124-upstream-bash42-024.patch | 40 +++ .../patches/125-upstream-bash42-025.patch | 111 +++++++++ .../patches/126-upstream-bash42-026.patch | 48 ++++ .../patches/127-upstream-bash42-027.patch | 38 +++ .../patches/128-upstream-bash42-028.patch | 46 ++++ utils/bash/patches/129-no_doc.patch | 14 ++ 32 files changed, 1872 insertions(+) create mode 100644 utils/bash/Makefile create mode 100644 utils/bash/patches/001-compile-fix.patch create mode 100644 utils/bash/patches/002-force-internal-readline.patch create mode 100644 utils/bash/patches/101-upstream-bash42-001.patch create mode 100644 utils/bash/patches/102-upstream-bash42-002.patch create mode 100644 utils/bash/patches/103-upstream-bash42-003.patch create mode 100644 utils/bash/patches/104-upstream-bash42-004.patch create mode 100644 utils/bash/patches/105-upstream-bash42-005.patch create mode 100644 utils/bash/patches/106-upstream-bash42-006.patch create mode 100644 utils/bash/patches/107-upstream-bash42-007.patch create mode 100644 utils/bash/patches/108-upstream-bash42-008.patch create mode 100644 utils/bash/patches/109-upstream-bash42-009.patch create mode 100644 utils/bash/patches/110-upstream-bash42-010.patch create mode 100644 utils/bash/patches/111-upstream-bash42-011.patch create mode 100644 utils/bash/patches/112-upstream-bash42-012.patch create mode 100644 utils/bash/patches/113-upstream-bash42-013.patch create mode 100644 utils/bash/patches/114-upstream-bash42-014.patch create mode 100644 utils/bash/patches/115-upstream-bash42-015.patch create mode 100644 utils/bash/patches/116-upstream-bash42-016.patch create mode 100644 utils/bash/patches/117-upstream-bash42-017.patch create mode 100644 utils/bash/patches/118-upstream-bash42-018.patch create mode 100644 utils/bash/patches/119-upstream-bash42-019.patch create mode 100644 utils/bash/patches/120-upstream-bash42-020.patch create mode 100644 utils/bash/patches/121-upstream-bash42-021.patch create mode 100644 utils/bash/patches/122-upstream-bash42-022.patch create mode 100644 utils/bash/patches/123-upstream-bash42-023.patch create mode 100644 utils/bash/patches/124-upstream-bash42-024.patch create mode 100644 utils/bash/patches/125-upstream-bash42-025.patch create mode 100644 utils/bash/patches/126-upstream-bash42-026.patch create mode 100644 utils/bash/patches/127-upstream-bash42-027.patch create mode 100644 utils/bash/patches/128-upstream-bash42-028.patch create mode 100644 utils/bash/patches/129-no_doc.patch diff --git a/utils/bash/Makefile b/utils/bash/Makefile new file mode 100644 index 000000000..bef9bccc9 --- /dev/null +++ b/utils/bash/Makefile @@ -0,0 +1,64 @@ +# +# Copyright (C) 2007-2012 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=bash +PKG_VERSION:=4.2 +PKG_RELEASE:=3 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=@GNU/bash +PKG_MD5SUM:=3fb927c7c33022f1c327f14a81c0d4b0 + +include $(INCLUDE_DIR)/package.mk + +define Package/bash + SECTION:=utils + CATEGORY:=Utilities + TITLE:=The GNU Bourne Again SHell + DEPENDS:=+libncurses + URL:=http://www.gnu.org/software/bash/ +endef + +define Package/bash/description + Bash is an sh-compatible command language interpreter that executes + commands read from the standard input or from a file. Bash also + incorporates useful features from the Korn and C shells (ksh and csh). +endef + + +define Build/Configure + $(call Build/Configure/Default, \ + --without-bash-malloc \ + --bindir=/bin \ + ) +endef + + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR)/builtins LDFLAGS_FOR_BUILD= mkbuiltins + $(MAKE) -C $(PKG_BUILD_DIR) \ + DESTDIR="$(PKG_INSTALL_DIR)" \ + SHELL="/bin/bash" \ + all install +endef + +define Package/bash/postinst +#!/bin/sh +grep bash $${IPKG_INSTROOT}/etc/shells || \ + echo "/bin/bash" >> $${IPKG_INSTROOT}/etc/shells + echo "/bin/rbash" >> $${IPKG_INSTROOT}/etc/shells +endef + +define Package/bash/install + $(INSTALL_DIR) $(1)/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/bin/bash $(1)/bin/ + ln -sf bash $(1)/bin/rbash +endef + +$(eval $(call BuildPackage,bash)) diff --git a/utils/bash/patches/001-compile-fix.patch b/utils/bash/patches/001-compile-fix.patch new file mode 100644 index 000000000..8f4090b27 --- /dev/null +++ b/utils/bash/patches/001-compile-fix.patch @@ -0,0 +1,15 @@ +--- a/execute_cmd.c ++++ b/execute_cmd.c +@@ -2202,7 +2202,11 @@ execute_pipeline (command, asynchronous, + /* If the `lastpipe' option is set with shopt, and job control is not + enabled, execute the last element of non-async pipelines in the + current shell environment. */ +- if (lastpipe_opt && job_control == 0 && asynchronous == 0 && pipe_out == NO_PIPE && prev > 0) ++ if (lastpipe_opt && ++#if defined(JOB_CONTROL) ++ job_control == 0 && ++#endif ++ asynchronous == 0 && pipe_out == NO_PIPE && prev > 0) + { + lstdin = move_to_high_fd (0, 0, 255); + if (lstdin > 0) diff --git a/utils/bash/patches/002-force-internal-readline.patch b/utils/bash/patches/002-force-internal-readline.patch new file mode 100644 index 000000000..ecb8375d5 --- /dev/null +++ b/utils/bash/patches/002-force-internal-readline.patch @@ -0,0 +1,24 @@ +--- a/configure ++++ b/configure +@@ -5748,8 +5748,7 @@ _ACEOF + # static version specified as -llibname to override the + # dynamic version + case "${host_os}" in +- darwin[89]*|darwin10*) READLINE_LIB='${READLINE_LIBRARY}' ;; +- *) READLINE_LIB=-lreadline ;; ++ *) READLINE_LIB='${READLINE_LIBRARY}' ;; + esac + fi + else +--- a/configure.in ++++ b/configure.in +@@ -540,8 +540,7 @@ if test $opt_readline = yes; then + # static version specified as -llibname to override the + # dynamic version + case "${host_os}" in +- darwin[[89]]*|darwin10*) READLINE_LIB='${READLINE_LIBRARY}' ;; +- *) READLINE_LIB=-lreadline ;; ++ *) READLINE_LIB='${READLINE_LIBRARY}' ;; + esac + fi + else diff --git a/utils/bash/patches/101-upstream-bash42-001.patch b/utils/bash/patches/101-upstream-bash42-001.patch new file mode 100644 index 000000000..8aca8156b --- /dev/null +++ b/utils/bash/patches/101-upstream-bash42-001.patch @@ -0,0 +1,65 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-001 + +Bug-Reported-by: Juergen Daubert +Bug-Reference-ID: <20110214175132.GA19813@jue.netz> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00125.html + +Bug-Description: + +When running in Posix mode, bash does not correctly expand the right-hand +side of a double-quoted word expansion containing single quotes. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -1379,10 +1379,12 @@ extract_dollar_brace_string (string, sin + slen = strlen (string + *sindex) + *sindex; + + /* The handling of dolbrace_state needs to agree with the code in parse.y: +- parse_matched_pair() */ +- dolbrace_state = 0; +- if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) +- dolbrace_state = (flags & SX_POSIXEXP) ? DOLBRACE_QUOTE : DOLBRACE_PARAM; ++ parse_matched_pair(). The different initial value is to handle the ++ case where this function is called to parse the word in ++ ${param op word} (SX_WORD). */ ++ dolbrace_state = (flags & SX_WORD) ? DOLBRACE_WORD : DOLBRACE_PARAM; ++ if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && (flags & SX_POSIXEXP)) ++ dolbrace_state = DOLBRACE_QUOTE; + + i = *sindex; + while (c = string[i]) +@@ -7176,7 +7178,7 @@ parameter_brace_expand (string, indexp, + { + /* Extract the contents of the ${ ... } expansion + according to the Posix.2 rules. */ +- value = extract_dollar_brace_string (string, &sindex, quoted, (c == '%' || c == '#') ? SX_POSIXEXP : 0); ++ value = extract_dollar_brace_string (string, &sindex, quoted, (c == '%' || c == '#' || c =='/' || c == '^' || c == ',' || c ==':') ? SX_POSIXEXP|SX_WORD : SX_WORD); + if (string[sindex] == RBRACE) + sindex++; + else +--- a/subst.h ++++ b/subst.h +@@ -56,6 +56,7 @@ + #define SX_NOLONGJMP 0x0040 /* don't longjmp on fatal error */ + #define SX_ARITHSUB 0x0080 /* extracting $(( ... )) (currently unused) */ + #define SX_POSIXEXP 0x0100 /* extracting new Posix pattern removal expansions in extract_dollar_brace_string */ ++#define SX_WORD 0x0200 /* extracting word in ${param op word} */ + + /* Remove backslashes which are quoting backquotes from STRING. Modifies + STRING, and returns a pointer to it. */ +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 0 ++#define PATCHLEVEL 1 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/102-upstream-bash42-002.patch b/utils/bash/patches/102-upstream-bash42-002.patch new file mode 100644 index 000000000..3756ac18f --- /dev/null +++ b/utils/bash/patches/102-upstream-bash42-002.patch @@ -0,0 +1,50 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-002 + +Bug-Reported-by: Clark J. Wang +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00157.html + +Bug-Description: + +The readline vi-mode `cc', `dd', and `yy' commands failed to modify the +entire line. + +Patch (apply with `patch -p0'): + +--- a/lib/readline/vi_mode.c ++++ b/lib/readline/vi_mode.c +@@ -1114,7 +1114,7 @@ rl_domove_read_callback (m) + rl_beg_of_line (1, c); + _rl_vi_last_motion = c; + RL_UNSETSTATE (RL_STATE_VIMOTION); +- return (0); ++ return (vidomove_dispatch (m)); + } + #if defined (READLINE_CALLBACKS) + /* XXX - these need to handle rl_universal_argument bindings */ +--- a/lib/readline/callback.c ++++ b/lib/readline/callback.c +@@ -148,6 +148,9 @@ rl_callback_read_char () + eof = _rl_vi_domove_callback (_rl_vimvcxt); + /* Should handle everything, including cleanup, numeric arguments, + and turning off RL_STATE_VIMOTION */ ++ if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) ++ _rl_internal_char_cleanup (); ++ + return; + } + #endif +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 1 ++#define PATCHLEVEL 2 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/103-upstream-bash42-003.patch b/utils/bash/patches/103-upstream-bash42-003.patch new file mode 100644 index 000000000..ad82635ae --- /dev/null +++ b/utils/bash/patches/103-upstream-bash42-003.patch @@ -0,0 +1,231 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-003 + +Bug-Reported-by: Clark J. Wang +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00136.html + +Bug-Description: + +When using the pattern replacement and pattern removal word expansions, bash +miscalculates the possible match length in the presence of an unescaped left +bracket without a closing right bracket, resulting in a failure to match +the pattern. + +Patch (apply with `patch -p0'): + +--- a/lib/glob/gmisc.c ++++ b/lib/glob/gmisc.c +@@ -77,8 +77,8 @@ wmatchlen (wpat, wmax) + wchar_t *wpat; + size_t wmax; + { +- wchar_t wc, *wbrack; +- int matlen, t, in_cclass, in_collsym, in_equiv; ++ wchar_t wc; ++ int matlen, bracklen, t, in_cclass, in_collsym, in_equiv; + + if (*wpat == 0) + return (0); +@@ -118,58 +118,80 @@ wmatchlen (wpat, wmax) + break; + case L'[': + /* scan for ending `]', skipping over embedded [:...:] */ +- wbrack = wpat; ++ bracklen = 1; + wc = *wpat++; + do + { + if (wc == 0) + { +- matlen += wpat - wbrack - 1; /* incremented below */ +- break; ++ wpat--; /* back up to NUL */ ++ matlen += bracklen; ++ goto bad_bracket; + } + else if (wc == L'\\') + { +- wc = *wpat++; +- if (*wpat == 0) +- break; ++ /* *wpat == backslash-escaped character */ ++ bracklen++; ++ /* If the backslash or backslash-escape ends the string, ++ bail. The ++wpat skips over the backslash escape */ ++ if (*wpat == 0 || *++wpat == 0) ++ { ++ matlen += bracklen; ++ goto bad_bracket; ++ } + } + else if (wc == L'[' && *wpat == L':') /* character class */ + { + wpat++; ++ bracklen++; + in_cclass = 1; + } + else if (in_cclass && wc == L':' && *wpat == L']') + { + wpat++; ++ bracklen++; + in_cclass = 0; + } + else if (wc == L'[' && *wpat == L'.') /* collating symbol */ + { + wpat++; ++ bracklen++; + if (*wpat == L']') /* right bracket can appear as collating symbol */ +- wpat++; ++ { ++ wpat++; ++ bracklen++; ++ } + in_collsym = 1; + } + else if (in_collsym && wc == L'.' && *wpat == L']') + { + wpat++; ++ bracklen++; + in_collsym = 0; + } + else if (wc == L'[' && *wpat == L'=') /* equivalence class */ + { + wpat++; ++ bracklen++; + if (*wpat == L']') /* right bracket can appear as equivalence class */ +- wpat++; ++ { ++ wpat++; ++ bracklen++; ++ } + in_equiv = 1; + } + else if (in_equiv && wc == L'=' && *wpat == L']') + { + wpat++; ++ bracklen++; + in_equiv = 0; + } ++ else ++ bracklen++; + } + while ((wc = *wpat++) != L']'); + matlen++; /* bracket expression can only match one char */ ++bad_bracket: + break; + } + } +@@ -213,8 +235,8 @@ umatchlen (pat, max) + char *pat; + size_t max; + { +- char c, *brack; +- int matlen, t, in_cclass, in_collsym, in_equiv; ++ char c; ++ int matlen, bracklen, t, in_cclass, in_collsym, in_equiv; + + if (*pat == 0) + return (0); +@@ -254,58 +276,80 @@ umatchlen (pat, max) + break; + case '[': + /* scan for ending `]', skipping over embedded [:...:] */ +- brack = pat; ++ bracklen = 1; + c = *pat++; + do + { + if (c == 0) + { +- matlen += pat - brack - 1; /* incremented below */ +- break; ++ pat--; /* back up to NUL */ ++ matlen += bracklen; ++ goto bad_bracket; + } + else if (c == '\\') + { +- c = *pat++; +- if (*pat == 0) +- break; ++ /* *pat == backslash-escaped character */ ++ bracklen++; ++ /* If the backslash or backslash-escape ends the string, ++ bail. The ++pat skips over the backslash escape */ ++ if (*pat == 0 || *++pat == 0) ++ { ++ matlen += bracklen; ++ goto bad_bracket; ++ } + } + else if (c == '[' && *pat == ':') /* character class */ + { + pat++; ++ bracklen++; + in_cclass = 1; + } + else if (in_cclass && c == ':' && *pat == ']') + { + pat++; ++ bracklen++; + in_cclass = 0; + } + else if (c == '[' && *pat == '.') /* collating symbol */ + { + pat++; ++ bracklen++; + if (*pat == ']') /* right bracket can appear as collating symbol */ +- pat++; ++ { ++ pat++; ++ bracklen++; ++ } + in_collsym = 1; + } + else if (in_collsym && c == '.' && *pat == ']') + { + pat++; ++ bracklen++; + in_collsym = 0; + } + else if (c == '[' && *pat == '=') /* equivalence class */ + { + pat++; ++ bracklen++; + if (*pat == ']') /* right bracket can appear as equivalence class */ +- pat++; ++ { ++ pat++; ++ bracklen++; ++ } + in_equiv = 1; + } + else if (in_equiv && c == '=' && *pat == ']') + { + pat++; ++ bracklen++; + in_equiv = 0; + } ++ else ++ bracklen++; + } + while ((c = *pat++) != ']'); + matlen++; /* bracket expression can only match one char */ ++bad_bracket: + break; + } + } +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 2 ++#define PATCHLEVEL 3 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/104-upstream-bash42-004.patch b/utils/bash/patches/104-upstream-bash42-004.patch new file mode 100644 index 000000000..e353c5b9d --- /dev/null +++ b/utils/bash/patches/104-upstream-bash42-004.patch @@ -0,0 +1,40 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-004 + +Bug-Reported-by: Mike Frysinger +Bug-Reference-ID: <201102182106.17834.vapier@gentoo.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00222.html + +Bug-Description: + +When used in contexts where word splitting and quote removal were not +performed, such as pattern removal or pattern substitution, empty strings +(either literal or resulting from quoted variables that were unset or +null) were not matched correctly, resulting in failure. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -3373,7 +3373,7 @@ expand_string_for_rhs (string, quoted, d + if (string == 0 || *string == '\0') + return (WORD_LIST *)NULL; + +- td.flags = 0; ++ td.flags = W_NOSPLIT2; /* no splitting, remove "" and '' */ + td.word = string; + tresult = call_expand_word_internal (&td, quoted, 1, dollar_at_p, has_dollar_at); + return (tresult); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 3 ++#define PATCHLEVEL 4 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/105-upstream-bash42-005.patch b/utils/bash/patches/105-upstream-bash42-005.patch new file mode 100644 index 000000000..5df63c7ea --- /dev/null +++ b/utils/bash/patches/105-upstream-bash42-005.patch @@ -0,0 +1,114 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-005 + +Bug-Reported-by: Dennis Williamson +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00147.html + +Bug-Description: + +Systems that use tzset() to set the local timezone require the TZ variable +to be in the environment. Bash must make sure the environment has been +modified with any updated value for TZ before calling tzset(). This +affects prompt string expansions and the `%T' printf conversion specification +on systems that do not allow bash to supply a replacement for getenv(3). + +Patch (apply with `patch -p0'): + +--- a/variables.h ++++ b/variables.h +@@ -313,6 +313,7 @@ extern void set_func_auto_export __P((co + + extern void sort_variables __P((SHELL_VAR **)); + ++extern int chkexport __P((char *)); + extern void maybe_make_export_env __P((void)); + extern void update_export_env_inplace __P((char *, int, char *)); + extern void put_command_name_into_env __P((char *)); +--- a/variables.c ++++ b/variables.c +@@ -3653,6 +3653,22 @@ n_shell_variables () + return n; + } + ++int ++chkexport (name) ++ char *name; ++{ ++ SHELL_VAR *v; ++ ++ v = find_variable (name); ++ if (exported_p (v)) ++ { ++ array_needs_making = 1; ++ maybe_make_export_env (); ++ return 1; ++ } ++ return 0; ++} ++ + void + maybe_make_export_env () + { +@@ -4214,7 +4230,7 @@ static struct name_and_function special_ + { "TEXTDOMAIN", sv_locale }, + { "TEXTDOMAINDIR", sv_locale }, + +-#if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE) ++#if defined (HAVE_TZSET) + { "TZ", sv_tz }, + #endif + +@@ -4558,12 +4574,13 @@ sv_histtimefmt (name) + } + #endif /* HISTORY */ + +-#if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE) ++#if defined (HAVE_TZSET) + void + sv_tz (name) + char *name; + { +- tzset (); ++ if (chkexport (name)) ++ tzset (); + } + #endif + +--- a/parse.y ++++ b/parse.y +@@ -5135,6 +5135,9 @@ decode_prompt_string (string) + case 'A': + /* Make the current time/date into a string. */ + (void) time (&the_time); ++#if defined (HAVE_TZSET) ++ sv_tz ("TZ"); /* XXX -- just make sure */ ++#endif + tm = localtime (&the_time); + + if (c == 'd') +--- a/builtins/printf.def ++++ b/builtins/printf.def +@@ -465,6 +465,9 @@ printf_builtin (list) + secs = shell_start_time; /* roughly $SECONDS */ + else + secs = arg; ++#if defined (HAVE_TZSET) ++ sv_tz ("TZ"); /* XXX -- just make sure */ ++#endif + tm = localtime (&secs); + n = strftime (timebuf, sizeof (timebuf), timefmt, tm); + free (timefmt); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 4 ++#define PATCHLEVEL 5 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/106-upstream-bash42-006.patch b/utils/bash/patches/106-upstream-bash42-006.patch new file mode 100644 index 000000000..89c887e55 --- /dev/null +++ b/utils/bash/patches/106-upstream-bash42-006.patch @@ -0,0 +1,37 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-006 + +Bug-Reported-by: Allan McRae +Bug-Reference-ID: <4D6D0D0B.50908@archlinux.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-03/msg00001.html + +Bug-Description: + +A problem with bash42-005 caused it to dump core if TZ was unset. + +Patch (apply with `patch -p0'): + +--- a/variables.c ++++ b/variables.c +@@ -3660,7 +3660,7 @@ chkexport (name) + SHELL_VAR *v; + + v = find_variable (name); +- if (exported_p (v)) ++ if (v && exported_p (v)) + { + array_needs_making = 1; + maybe_make_export_env (); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 5 ++#define PATCHLEVEL 6 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/107-upstream-bash42-007.patch b/utils/bash/patches/107-upstream-bash42-007.patch new file mode 100644 index 000000000..75871959b --- /dev/null +++ b/utils/bash/patches/107-upstream-bash42-007.patch @@ -0,0 +1,39 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-007 + +Bug-Reported-by: Matthias Klose +Bug-Reference-ID: <4D6FD2AC.1010500@debian.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-03/msg00015.html + +Bug-Description: + +When used in contexts where word splitting and quote removal were not +performed, such as case statement word expansion, empty strings +(either literal or resulting from quoted variables that were unset or +null) were not expanded correctly, resulting in failure. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -4609,6 +4609,7 @@ expand_word_unsplit (word, quoted) + if (ifs_firstc == 0) + #endif + word->flags |= W_NOSPLIT; ++ word->flags |= W_NOSPLIT2; + result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL); + expand_no_split_dollar_star = 0; + +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 6 ++#define PATCHLEVEL 7 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/108-upstream-bash42-008.patch b/utils/bash/patches/108-upstream-bash42-008.patch new file mode 100644 index 000000000..29493b523 --- /dev/null +++ b/utils/bash/patches/108-upstream-bash42-008.patch @@ -0,0 +1,65 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-008 + +Bug-Reported-by: Doug McMahon +Bug-Reference-ID: <1299441211.2535.11.camel@doug-XPS-M1330> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-03/msg00050.html + +Bug-Description: + +Bash-4.2 does not attempt to save the shell history on receipt of a +terminating signal that is handled synchronously. Unfortunately, the +`close' button on most X11 terminal emulators sends SIGHUP, which +kills the shell. + +This is a very small patch to save the history in the case that an +interactive shell receives a SIGHUP or SIGTERM while in readline and +reading a command. + +The next version of bash will do this differently. + +Patch (apply with `patch -p0'): + +--- a/sig.c ++++ b/sig.c +@@ -46,6 +46,7 @@ + + #if defined (READLINE) + # include "bashline.h" ++# include + #endif + + #if defined (HISTORY) +@@ -62,6 +63,7 @@ extern int parse_and_execute_level, shel + #if defined (HISTORY) + extern int history_lines_this_session; + #endif ++extern int no_line_editing; + + extern void initialize_siglist (); + +@@ -505,7 +507,10 @@ termsig_sighandler (sig) + { + #if defined (HISTORY) + /* XXX - will inhibit history file being written */ +- history_lines_this_session = 0; ++# if defined (READLINE) ++ if (interactive_shell == 0 || interactive == 0 || (sig != SIGHUP && sig != SIGTERM) || no_line_editing || (RL_ISSTATE (RL_STATE_READCMD) == 0)) ++# endif ++ history_lines_this_session = 0; + #endif + terminate_immediately = 0; + termsig_handler (sig); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 7 ++#define PATCHLEVEL 8 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/109-upstream-bash42-009.patch b/utils/bash/patches/109-upstream-bash42-009.patch new file mode 100644 index 000000000..d05f499af --- /dev/null +++ b/utils/bash/patches/109-upstream-bash42-009.patch @@ -0,0 +1,65 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-009 + +Bug-Reported-by: +Bug-Reference-ID: <4DAAC0DB.7060606@piumalab.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-04/msg00075.html + +Bug-Description: + +Under certain circumstances, running `fc -l' two times in succession with a +relative history offset at the end of the history will result in an incorrect +calculation of the last history entry and a seg fault. + +Patch (apply with `patch -p0'): + +--- a/builtins/fc.def ++++ b/builtins/fc.def +@@ -304,7 +304,7 @@ fc_builtin (list) + last_hist = i - rh - hist_last_line_added; + + /* XXX */ +- if (saved_command_line_count > 0 && i == last_hist && hlist[last_hist] == 0) ++ if (i == last_hist && hlist[last_hist] == 0) + while (last_hist >= 0 && hlist[last_hist] == 0) + last_hist--; + if (last_hist < 0) +@@ -475,7 +475,7 @@ fc_gethnum (command, hlist) + HIST_ENTRY **hlist; + { + int sign, n, clen, rh; +- register int i, j; ++ register int i, j, last_hist; + register char *s; + + sign = 1; +@@ -495,7 +495,15 @@ fc_gethnum (command, hlist) + has been enabled (interactive or not) should use it in the last_hist + calculation as if it were on. */ + rh = remember_on_history || ((subshell_environment & SUBSHELL_COMSUB) && enable_history_list); +- i -= rh + hist_last_line_added; ++ last_hist = i - rh - hist_last_line_added; ++ ++ if (i == last_hist && hlist[last_hist] == 0) ++ while (last_hist >= 0 && hlist[last_hist] == 0) ++ last_hist--; ++ if (last_hist < 0) ++ return (-1); ++ ++ i = last_hist; + + /* No specification defaults to most recent command. */ + if (command == NULL) +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 8 ++#define PATCHLEVEL 9 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/110-upstream-bash42-010.patch b/utils/bash/patches/110-upstream-bash42-010.patch new file mode 100644 index 000000000..06cdb615e --- /dev/null +++ b/utils/bash/patches/110-upstream-bash42-010.patch @@ -0,0 +1,56 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-010 + +Bug-Reported-by: Mike Frysinger +Bug-Reference-ID: <201104122356.20160.vapier@gentoo.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-04/msg00058.html + +Bug-Description: + +Bash did not correctly print/reproduce here documents attached to commands +inside compound commands such as arithmetic for loops and user-specified +subshells. This affected the execution of such commands inside a shell +function when the function definition is saved and later restored using +`.' or `eval'. + +Patch (apply with `patch -p0'): + +--- a/print_cmd.c ++++ b/print_cmd.c +@@ -315,6 +315,7 @@ make_command_string_internal (command) + cprintf ("( "); + skip_this_indent++; + make_command_string_internal (command->value.Subshell->command); ++ PRINT_DEFERRED_HEREDOCS (""); + cprintf (" )"); + break; + +@@ -592,6 +593,7 @@ print_arith_for_command (arith_for_comma + newline ("do\n"); + indentation += indentation_amount; + make_command_string_internal (arith_for_command->action); ++ PRINT_DEFERRED_HEREDOCS (""); + semicolon (); + indentation -= indentation_amount; + newline ("done"); +@@ -653,6 +655,7 @@ print_group_command (group_command) + } + + make_command_string_internal (group_command->command); ++ PRINT_DEFERRED_HEREDOCS (""); + + if (inside_function_def) + { +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 9 ++#define PATCHLEVEL 10 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/111-upstream-bash42-011.patch b/utils/bash/patches/111-upstream-bash42-011.patch new file mode 100644 index 000000000..bb84a8d95 --- /dev/null +++ b/utils/bash/patches/111-upstream-bash42-011.patch @@ -0,0 +1,41 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-011 + +Bug-Reported-by: "David Parks" +Bug-Reference-ID: <014101cc82c6$46ac1540$d4043fc0$@com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-10/msg00031.html + +Bug-Description: + +Overwriting a value in an associative array causes the memory allocated to +store the key on the second and subsequent assignments to leak. + +Patch (apply with `patch -p0'): + +--- a/assoc.c ++++ b/assoc.c +@@ -77,6 +77,11 @@ assoc_insert (hash, key, value) + b = hash_search (key, hash, HASH_CREATE); + if (b == 0) + return -1; ++ /* If we are overwriting an existing element's value, we're not going to ++ use the key. Nothing in the array assignment code path frees the key ++ string, so we can free it here to avoid a memory leak. */ ++ if (b->key != key) ++ free (key); + FREE (b->data); + b->data = value ? savestring (value) : (char *)0; + return (0); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 10 ++#define PATCHLEVEL 11 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/112-upstream-bash42-012.patch b/utils/bash/patches/112-upstream-bash42-012.patch new file mode 100644 index 000000000..697ed1aa5 --- /dev/null +++ b/utils/bash/patches/112-upstream-bash42-012.patch @@ -0,0 +1,145 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-012 + +Bug-Reported-by: Rui Santos +Bug-Reference-ID: <4E04C6D0.2020507@grupopie.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-06/msg00079.html + +Bug-Description: + +When calling the parser to recursively parse a command substitution within +an arithmetic expansion, the shell overwrote the saved shell input line and +associated state, resulting in a garbled command. + +Patch (apply with `patch -p0'): + +--- a/parse.y ++++ b/parse.y +@@ -3842,6 +3842,7 @@ xparse_dolparen (base, string, indp, fla + int flags; + { + sh_parser_state_t ps; ++ sh_input_line_state_t ls; + int orig_ind, nc, sflags; + char *ret, *s, *ep, *ostring; + +@@ -3849,10 +3850,12 @@ xparse_dolparen (base, string, indp, fla + orig_ind = *indp; + ostring = string; + ++/*itrace("xparse_dolparen: size = %d shell_input_line = `%s'", shell_input_line_size, shell_input_line);*/ + sflags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOFREE; + if (flags & SX_NOLONGJMP) + sflags |= SEVAL_NOLONGJMP; + save_parser_state (&ps); ++ save_input_line_state (&ls); + + /*(*/ + parser_state |= PST_CMDSUBST|PST_EOFTOKEN; /* allow instant ')' */ /*(*/ +@@ -3861,6 +3864,8 @@ xparse_dolparen (base, string, indp, fla + + restore_parser_state (&ps); + reset_parser (); ++ /* reset_parser clears shell_input_line and associated variables */ ++ restore_input_line_state (&ls); + if (interactive) + token_to_read = 0; + +@@ -5908,6 +5913,12 @@ save_parser_state (ps) + ps->expand_aliases = expand_aliases; + ps->echo_input_at_read = echo_input_at_read; + ++ ps->token = token; ++ ps->token_buffer_size = token_buffer_size; ++ /* Force reallocation on next call to read_token_word */ ++ token = 0; ++ token_buffer_size = 0; ++ + return (ps); + } + +@@ -5949,6 +5960,42 @@ restore_parser_state (ps) + + expand_aliases = ps->expand_aliases; + echo_input_at_read = ps->echo_input_at_read; ++ ++ FREE (token); ++ token = ps->token; ++ token_buffer_size = ps->token_buffer_size; ++} ++ ++sh_input_line_state_t * ++save_input_line_state (ls) ++ sh_input_line_state_t *ls; ++{ ++ if (ls == 0) ++ ls = (sh_input_line_state_t *)xmalloc (sizeof (sh_input_line_state_t)); ++ if (ls == 0) ++ return ((sh_input_line_state_t *)NULL); ++ ++ ls->input_line = shell_input_line; ++ ls->input_line_size = shell_input_line_size; ++ ls->input_line_len = shell_input_line_len; ++ ls->input_line_index = shell_input_line_index; ++ ++ /* force reallocation */ ++ shell_input_line = 0; ++ shell_input_line_size = shell_input_line_len = shell_input_line_index = 0; ++} ++ ++void ++restore_input_line_state (ls) ++ sh_input_line_state_t *ls; ++{ ++ FREE (shell_input_line); ++ shell_input_line = ls->input_line; ++ shell_input_line_size = ls->input_line_size; ++ shell_input_line_len = ls->input_line_len; ++ shell_input_line_index = ls->input_line_index; ++ ++ set_line_mbstate (); + } + + /************************************************ +--- a/shell.h ++++ b/shell.h +@@ -136,6 +136,9 @@ typedef struct _sh_parser_state_t { + int parser_state; + int *token_state; + ++ char *token; ++ int token_buffer_size; ++ + /* input line state -- line number saved elsewhere */ + int input_line_terminator; + int eof_encountered; +@@ -166,6 +169,16 @@ typedef struct _sh_parser_state_t { + + } sh_parser_state_t; + ++typedef struct _sh_input_line_state_t { ++ char *input_line; ++ int input_line_index; ++ int input_line_size; ++ int input_line_len; ++} sh_input_line_state_t; ++ + /* Let's try declaring these here. */ + extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *)); + extern void restore_parser_state __P((sh_parser_state_t *)); ++ ++extern sh_input_line_state_t *save_input_line_state __P((sh_input_line_state_t *)); ++extern void restore_input_line_state __P((sh_input_line_state_t *)); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 11 ++#define PATCHLEVEL 12 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/113-upstream-bash42-013.patch b/utils/bash/patches/113-upstream-bash42-013.patch new file mode 100644 index 000000000..aee78a2f2 --- /dev/null +++ b/utils/bash/patches/113-upstream-bash42-013.patch @@ -0,0 +1,43 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-013 + +Bug-Reported-by: Marten Wikstrom +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-05/msg00049.html + +Bug-Description: + +An off-by-one error caused the shell to skip over CTLNUL characters, +which are used internally to mark quoted null strings. The effect +was to have stray 0x7f characters left after expanding words like +""""""""aa. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -3706,7 +3706,10 @@ remove_quoted_nulls (string) + break; + } + else if (string[i] == CTLNUL) +- i++; ++ { ++ i++; ++ continue; ++ } + + prev_i = i; + ADVANCE_CHAR (string, slen, i); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 12 ++#define PATCHLEVEL 13 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/114-upstream-bash42-014.patch b/utils/bash/patches/114-upstream-bash42-014.patch new file mode 100644 index 000000000..dfbc990a0 --- /dev/null +++ b/utils/bash/patches/114-upstream-bash42-014.patch @@ -0,0 +1,38 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-014 + +Bug-Reported-by: Shawn Bohrer +Bug-Reference-ID: <20110504152320.6E8F28130527@dev1.rgmadvisors.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-05/msg00018.html + +Bug-Description: + +The regular expression matching operator did not correctly match +expressions with an embedded ^A. + +Patch (apply with `patch -p0'): + +--- a/pathexp.c ++++ b/pathexp.c +@@ -196,7 +196,7 @@ quote_string_for_globbing (pathname, qfl + { + if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/') + continue; +- if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0) ++ if (pathname[i+1] != CTLESC && (qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0) + continue; + temp[j++] = '\\'; + i++; +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 13 ++#define PATCHLEVEL 14 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/115-upstream-bash42-015.patch b/utils/bash/patches/115-upstream-bash42-015.patch new file mode 100644 index 000000000..49c7a825d --- /dev/null +++ b/utils/bash/patches/115-upstream-bash42-015.patch @@ -0,0 +1,71 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-015 + +Bug-Reported-by: +Bug-Reference-ID: <728_1312188080_4E3666B0_728_118711_1_3B5D3E0F95CC5C478D6500CDCE8B691F7AAAA4AA3D@PUEXCB2B.nanterre.francetelecom.fr> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-08/msg00000.html + +Bug-Description: + +When in a context where arithmetic evaluation is not taking place, the +evaluator should not check for division by 0. + +Patch (apply with `patch -p0'): + +--- a/expr.c ++++ b/expr.c +@@ -476,19 +476,23 @@ expassign () + + if (special) + { ++ if ((op == DIV || op == MOD) && value == 0) ++ { ++ if (noeval == 0) ++ evalerror (_("division by 0")); ++ else ++ value = 1; ++ } ++ + switch (op) + { + case MUL: + lvalue *= value; + break; + case DIV: +- if (value == 0) +- evalerror (_("division by 0")); + lvalue /= value; + break; + case MOD: +- if (value == 0) +- evalerror (_("division by 0")); + lvalue %= value; + break; + case PLUS: +@@ -804,7 +808,12 @@ exp2 () + val2 = exppower (); + + if (((op == DIV) || (op == MOD)) && (val2 == 0)) +- evalerror (_("division by 0")); ++ { ++ if (noeval == 0) ++ evalerror (_("division by 0")); ++ else ++ val2 = 1; ++ } + + if (op == MUL) + val1 *= val2; +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 14 ++#define PATCHLEVEL 15 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/116-upstream-bash42-016.patch b/utils/bash/patches/116-upstream-bash42-016.patch new file mode 100644 index 000000000..0848cfc40 --- /dev/null +++ b/utils/bash/patches/116-upstream-bash42-016.patch @@ -0,0 +1,37 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-016 + +Bug-Reported-by: Martin von Gagern +Bug-Reference-ID: <4E43AD9E.8060501@gmx.net> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-08/msg00141.html + +Bug-Description: + +Bash should not check for mail while executing the `eval' builtin. + +Patch (apply with `patch -p0'): + +--- a/parse.y ++++ b/parse.y +@@ -2499,7 +2499,7 @@ yylex () + We do this only if it is time to do so. Notice that only here + is the mail alarm reset; nothing takes place in check_mail () + except the checking of mail. Please don't change this. */ +- if (prompt_is_ps1 && time_to_check_mail ()) ++ if (prompt_is_ps1 && parse_and_execute_level == 0 && time_to_check_mail ()) + { + check_mail (); + reset_mail_timer (); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 15 ++#define PATCHLEVEL 16 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/117-upstream-bash42-017.patch b/utils/bash/patches/117-upstream-bash42-017.patch new file mode 100644 index 000000000..90f71c6b5 --- /dev/null +++ b/utils/bash/patches/117-upstream-bash42-017.patch @@ -0,0 +1,42 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-017 + +Bug-Reported-by: Curtis Doty +Bug-Reference-ID: <20110621035324.A4F70849F59@mx1.iParadigms.net> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-06/msg00053.html + +Bug-Description: + +Using `read -a foo' where foo was an already-declared associative array +caused the shell to die with a segmentation fault. + +Patch (apply with `patch -p0'): + +--- a/builtins/read.def ++++ b/builtins/read.def +@@ -642,6 +642,12 @@ assign_vars: + xfree (input_string); + return EXECUTION_FAILURE; /* readonly or noassign */ + } ++ if (assoc_p (var)) ++ { ++ builtin_error (_("%s: cannot convert associative to indexed array"), arrayname); ++ xfree (input_string); ++ return EXECUTION_FAILURE; /* existing associative array */ ++ } + array_flush (array_cell (var)); + + alist = list_string (input_string, ifs_chars, 0); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 16 ++#define PATCHLEVEL 17 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/118-upstream-bash42-018.patch b/utils/bash/patches/118-upstream-bash42-018.patch new file mode 100644 index 000000000..82654c853 --- /dev/null +++ b/utils/bash/patches/118-upstream-bash42-018.patch @@ -0,0 +1,57 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-018 + +Bug-Reported-by: Thomas Cort +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-06/msg00110.html + +Bug-Description: + +Bash fails to compile unless JOB_CONTROL is defined. + +Patch (apply with `patch -p0'): + +--- a/execute_cmd.c ++++ b/execute_cmd.c +@@ -2196,6 +2196,7 @@ execute_pipeline (command, asynchronous, + if (ignore_return && cmd) + cmd->flags |= CMD_IGNORE_RETURN; + ++#if defined (JOB_CONTROL) + lastpipe_flag = 0; + begin_unwind_frame ("lastpipe-exec"); + lstdin = -1; +@@ -2219,15 +2220,19 @@ execute_pipeline (command, asynchronous, + lastpipe_jid = stop_pipeline (0, (COMMAND *)NULL); /* XXX */ + add_unwind_protect (lastpipe_cleanup, lastpipe_jid); + } +- cmd->flags |= CMD_LASTPIPE; ++ if (cmd) ++ cmd->flags |= CMD_LASTPIPE; + } + if (prev >= 0) + add_unwind_protect (close, prev); ++#endif + + exec_result = execute_command_internal (cmd, asynchronous, prev, pipe_out, fds_to_close); + ++#if defined (JOB_CONTROL) + if (lstdin > 0) + restore_stdin (lstdin); ++#endif + + if (prev >= 0) + close (prev); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 17 ++#define PATCHLEVEL 18 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/119-upstream-bash42-019.patch b/utils/bash/patches/119-upstream-bash42-019.patch new file mode 100644 index 000000000..215ae6713 --- /dev/null +++ b/utils/bash/patches/119-upstream-bash42-019.patch @@ -0,0 +1,42 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-019 + +Bug-Reported-by: Diego Augusto Molina +Bug-Reference-ID: +Bug-Reference-URL: lists.gnu.org/archive/html/bug-bash/2011-09/msg00047.html + +Bug-Description: + +Using `declare' with attributes and an invalid array variable name or +assignment reference resulted in a segmentation fault instead of a +declaration error. + +Patch (apply with `patch -p0'): + +--- a/builtins/declare.def ++++ b/builtins/declare.def +@@ -513,6 +513,11 @@ declare_internal (list, local_var) + *subscript_start = '['; /* ] */ + var = assign_array_element (name, value, 0); /* XXX - not aflags */ + *subscript_start = '\0'; ++ if (var == 0) /* some kind of assignment error */ ++ { ++ assign_error++; ++ NEXT_VARIABLE (); ++ } + } + else if (simple_array_assign) + { +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 18 ++#define PATCHLEVEL 19 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/120-upstream-bash42-020.patch b/utils/bash/patches/120-upstream-bash42-020.patch new file mode 100644 index 000000000..a91c9500b --- /dev/null +++ b/utils/bash/patches/120-upstream-bash42-020.patch @@ -0,0 +1,47 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-020 + +Bug-Reported-by: Vincent Sheffer +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-readline/2011-08/msg00000.html + +Bug-Description: + +The shared object helper script needs to be updated for Mac OS X 10.7 +(Lion, darwin11). + +Patch (apply with `patch -p0'): + +--- a/support/shobj-conf ++++ b/support/shobj-conf +@@ -157,7 +157,7 @@ freebsd[4-9]*|freebsdelf*|dragonfly*) + ;; + + # Darwin/MacOS X +-darwin[89]*|darwin10*) ++darwin[89]*|darwin1[012]*) + SHOBJ_STATUS=supported + SHLIB_STATUS=supported + +@@ -186,7 +186,7 @@ darwin*|macosx*) + SHLIB_LIBSUFF='dylib' + + case "${host_os}" in +- darwin[789]*|darwin10*) SHOBJ_LDFLAGS='' ++ darwin[789]*|darwin1[012]*) SHOBJ_LDFLAGS='' + SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' + ;; + *) SHOBJ_LDFLAGS='-dynamic' +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 19 ++#define PATCHLEVEL 20 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/121-upstream-bash42-021.patch b/utils/bash/patches/121-upstream-bash42-021.patch new file mode 100644 index 000000000..38c3ae49d --- /dev/null +++ b/utils/bash/patches/121-upstream-bash42-021.patch @@ -0,0 +1,48 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-021 + +Bug-Reported-by: Dan Douglas +Bug-Reference-ID: <4585554.nZWb4q7YoZ@smorgbox> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-12/msg00084.html + +Bug-Description: + +Using `read -N' to assign values to an array can result in NUL values being +assigned to some array elements. These values cause seg faults when referenced +later. + +Patch (apply with `patch -p0'): + +--- a/builtins/read.def ++++ b/builtins/read.def +@@ -737,7 +737,7 @@ assign_vars: + xfree (t1); + } + else +- var = bind_read_variable (varname, t); ++ var = bind_read_variable (varname, t ? t : ""); + } + else + { +@@ -798,7 +798,7 @@ assign_vars: + xfree (t); + } + else +- var = bind_read_variable (list->word->word, input_string); ++ var = bind_read_variable (list->word->word, input_string ? input_string : ""); + + if (var) + { +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 20 ++#define PATCHLEVEL 21 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/122-upstream-bash42-022.patch b/utils/bash/patches/122-upstream-bash42-022.patch new file mode 100644 index 000000000..30020ba20 --- /dev/null +++ b/utils/bash/patches/122-upstream-bash42-022.patch @@ -0,0 +1,46 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-022 + +Bug-Reported-by: Gregory Margo +Bug-Reference-ID: <20110727174529.GA3333@pacbell.net> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-07/msg00102.html + +Bug-Description: + +The return value from lseek is `off_t'. This can cause corrupted return +values when the file offset is greater than 2**31 - 1. + +Patch (apply with `patch -p0'): + +--- a/lib/sh/zread.c ++++ b/lib/sh/zread.c +@@ -160,14 +160,13 @@ void + zsyncfd (fd) + int fd; + { +- off_t off; +- int r; ++ off_t off, r; + + off = lused - lind; + r = 0; + if (off > 0) + r = lseek (fd, -off, SEEK_CUR); + +- if (r >= 0) ++ if (r != -1) + lused = lind = 0; + } +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 21 ++#define PATCHLEVEL 22 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/123-upstream-bash42-023.patch b/utils/bash/patches/123-upstream-bash42-023.patch new file mode 100644 index 000000000..6c6fdb3e5 --- /dev/null +++ b/utils/bash/patches/123-upstream-bash42-023.patch @@ -0,0 +1,53 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-023 + +Bug-Reported-by: Ewan Mellor +Bug-Reference-ID: <6005BE083BF501439A84DC3523BAC82DC4B964FD12@LONPMAILBOX01.citrite.net> +Bug-Reference-URL: + +Bug-Description: + +Under some circumstances, an exit trap triggered by a bad substitution +error when errexit is enabled will cause the shell to exit with an +incorrect exit status (0). + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -7274,6 +7274,7 @@ parameter_brace_expand (string, indexp, + default: + case '\0': + bad_substitution: ++ last_command_exit_value = EXECUTION_FAILURE; + report_error (_("%s: bad substitution"), string ? string : "??"); + FREE (value); + FREE (temp); +--- a/error.c ++++ b/error.c +@@ -200,7 +200,11 @@ report_error (format, va_alist) + + va_end (args); + if (exit_immediately_on_error) +- exit_shell (1); ++ { ++ if (last_command_exit_value == 0) ++ last_command_exit_value = 1; ++ exit_shell (last_command_exit_value); ++ } + } + + void +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 22 ++#define PATCHLEVEL 23 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/124-upstream-bash42-024.patch b/utils/bash/patches/124-upstream-bash42-024.patch new file mode 100644 index 000000000..2137c02fa --- /dev/null +++ b/utils/bash/patches/124-upstream-bash42-024.patch @@ -0,0 +1,40 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-024 + +Bug-Reported-by: Jim Avera +Bug-Reference-ID: <4F29E07A.80405@yahoo.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-02/msg00001.html + +Bug-Description: + +When `printf -v' is used to set an array element, the format string contains +`%b', and the corresponding argument is the empty string, the buffer used +to store the value to be assigned can be NULL, which results in NUL being +assigned to the array element. This causes a seg fault when it's used later. + +Patch (apply with `patch -p0'): + +--- a/builtins/printf.def ++++ b/builtins/printf.def +@@ -255,6 +255,8 @@ printf_builtin (list) + #endif + { + vflag = 1; ++ if (vbsize == 0) ++ vbuf = xmalloc (vbsize = 16); + vblen = 0; + if (vbuf) + vbuf[0] = 0; +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 23 ++#define PATCHLEVEL 24 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/125-upstream-bash42-025.patch b/utils/bash/patches/125-upstream-bash42-025.patch new file mode 100644 index 000000000..3983ff5b0 --- /dev/null +++ b/utils/bash/patches/125-upstream-bash42-025.patch @@ -0,0 +1,111 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-025 + +Bug-Reported-by: Bill Gradwohl +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/help-bash/2012-03/msg00078.html + +Bug-Description: + +When used in a shell function, `declare -g -a array=(compound assignment)' +creates a local variable instead of a global one. + +Patch (apply with `patch -p0'): + +--- a/command.h ++++ b/command.h +@@ -97,6 +97,7 @@ enum command_type { cm_for, cm_case, cm_ + #define W_HASCTLESC 0x200000 /* word contains literal CTLESC characters */ + #define W_ASSIGNASSOC 0x400000 /* word looks like associative array assignment */ + #define W_ARRAYIND 0x800000 /* word is an array index being expanded */ ++#define W_ASSNGLOBAL 0x1000000 /* word is a global assignment to declare (declare/typeset -g) */ + + /* Possible values for subshell_environment */ + #define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */ +--- a/execute_cmd.c ++++ b/execute_cmd.c +@@ -3584,13 +3584,13 @@ fix_assignment_words (words) + { + WORD_LIST *w; + struct builtin *b; +- int assoc; ++ int assoc, global; + + if (words == 0) + return; + + b = 0; +- assoc = 0; ++ assoc = global = 0; + + for (w = words; w; w = w->next) + if (w->word->flags & W_ASSIGNMENT) +@@ -3607,12 +3607,17 @@ fix_assignment_words (words) + #if defined (ARRAY_VARS) + if (assoc) + w->word->flags |= W_ASSIGNASSOC; ++ if (global) ++ w->word->flags |= W_ASSNGLOBAL; + #endif + } + #if defined (ARRAY_VARS) + /* Note that we saw an associative array option to a builtin that takes + assignment statements. This is a bit of a kludge. */ +- else if (w->word->word[0] == '-' && strchr (w->word->word, 'A')) ++ else if (w->word->word[0] == '-' && (strchr (w->word->word+1, 'A') || strchr (w->word->word+1, 'g'))) ++#else ++ else if (w->word->word[0] == '-' && strchr (w->word->word+1, 'g')) ++#endif + { + if (b == 0) + { +@@ -3622,10 +3627,11 @@ fix_assignment_words (words) + else if (b && (b->flags & ASSIGNMENT_BUILTIN)) + words->word->flags |= W_ASSNBLTIN; + } +- if (words->word->flags & W_ASSNBLTIN) ++ if ((words->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'A')) + assoc = 1; ++ if ((words->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'g')) ++ global = 1; + } +-#endif + } + + /* Return 1 if the file found by searching $PATH for PATHNAME, defaulting +--- a/subst.c ++++ b/subst.c +@@ -366,6 +366,11 @@ dump_word_flags (flags) + f &= ~W_ASSNBLTIN; + fprintf (stderr, "W_ASSNBLTIN%s", f ? "|" : ""); + } ++ if (f & W_ASSNGLOBAL) ++ { ++ f &= ~W_ASSNGLOBAL; ++ fprintf (stderr, "W_ASSNGLOBAL%s", f ? "|" : ""); ++ } + if (f & W_COMPASSIGN) + { + f &= ~W_COMPASSIGN; +@@ -2803,7 +2808,7 @@ do_assignment_internal (word, expand) + } + else if (assign_list) + { +- if (word->flags & W_ASSIGNARG) ++ if ((word->flags & W_ASSIGNARG) && (word->flags & W_ASSNGLOBAL) == 0) + aflags |= ASS_MKLOCAL; + if (word->flags & W_ASSIGNASSOC) + aflags |= ASS_MKASSOC; +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 24 ++#define PATCHLEVEL 25 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/126-upstream-bash42-026.patch b/utils/bash/patches/126-upstream-bash42-026.patch new file mode 100644 index 000000000..b0efc0c64 --- /dev/null +++ b/utils/bash/patches/126-upstream-bash42-026.patch @@ -0,0 +1,48 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-026 + +Bug-Reported-by: Greg Wooledge +Bug-Reference-ID: <20120425180443.GO22241@eeg.ccf.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00172.html + +Bug-Description: + +The `lastpipe' option does not behave correctly on machines where the +open file limit is less than 256. + +Patch (apply with `patch -p0'): + +--- a/execute_cmd.c ++++ b/execute_cmd.c +@@ -2209,7 +2209,7 @@ execute_pipeline (command, asynchronous, + #endif + asynchronous == 0 && pipe_out == NO_PIPE && prev > 0) + { +- lstdin = move_to_high_fd (0, 0, 255); ++ lstdin = move_to_high_fd (0, 1, -1); + if (lstdin > 0) + { + do_piping (prev, pipe_out); +@@ -2255,7 +2255,9 @@ execute_pipeline (command, asynchronous, + unfreeze_jobs_list (); + } + ++#if defined (JOB_CONTROL) + discard_unwind_frame ("lastpipe-exec"); ++#endif + + return (exec_result); + } +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 25 ++#define PATCHLEVEL 26 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/127-upstream-bash42-027.patch b/utils/bash/patches/127-upstream-bash42-027.patch new file mode 100644 index 000000000..525abe008 --- /dev/null +++ b/utils/bash/patches/127-upstream-bash42-027.patch @@ -0,0 +1,38 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-027 + +Bug-Reported-by: Mike Frysinger +Bug-Reference-ID: <201204211243.30163.vapier@gentoo.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00134.html + +Bug-Description: + +When the `extglob' shell option is enabled, pattern substitution does not +work correctly in the presence of multibyte characters. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -4166,7 +4166,7 @@ match_wpattern (wstring, indices, wstrle + simple = (wpat[0] != L'\\' && wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'['); + #if defined (EXTENDED_GLOB) + if (extended_glob) +- simple |= (wpat[1] != L'(' || (wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'+' && wpat[0] != L'!' && wpat[0] != L'@')); /*)*/ ++ simple &= (wpat[1] != L'(' || (wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'+' && wpat[0] != L'!' && wpat[0] != L'@')); /*)*/ + #endif + + /* If the pattern doesn't match anywhere in the string, go ahead and +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 26 ++#define PATCHLEVEL 27 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/128-upstream-bash42-028.patch b/utils/bash/patches/128-upstream-bash42-028.patch new file mode 100644 index 000000000..8b5b1b26c --- /dev/null +++ b/utils/bash/patches/128-upstream-bash42-028.patch @@ -0,0 +1,46 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-028 + +Bug-Reported-by: Mark Edgar +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-03/msg00109.html + +Bug-Description: + +When using a word expansion for which the right hand side is evaluated, +certain expansions of quoted null strings include spurious ^? characters. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -5809,6 +5809,16 @@ parameter_brace_expand_rhs (name, value, + is the only expansion that creates more than one word. */ + if (qdollaratp && ((hasdol && quoted) || l->next)) + *qdollaratp = 1; ++ /* If we have a quoted null result (QUOTED_NULL(temp)) and the word is ++ a quoted null (l->next == 0 && QUOTED_NULL(l->word->word)), the ++ flags indicate it (l->word->flags & W_HASQUOTEDNULL), and the ++ expansion is quoted (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ++ (which is more paranoia than anything else), we need to return the ++ quoted null string and set the flags to indicate it. */ ++ if (l->next == 0 && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && QUOTED_NULL(temp) && QUOTED_NULL(l->word->word) && (l->word->flags & W_HASQUOTEDNULL)) ++ { ++ w->flags |= W_HASQUOTEDNULL; ++ } + dispose_words (l); + } + else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && hasdol) +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 27 ++#define PATCHLEVEL 28 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/129-no_doc.patch b/utils/bash/patches/129-no_doc.patch new file mode 100644 index 000000000..442cd2291 --- /dev/null +++ b/utils/bash/patches/129-no_doc.patch @@ -0,0 +1,14 @@ +diff -urN bash-4.2/Makefile.in bash-4.2.new/Makefile.in +--- bash-4.2/Makefile.in 2010-12-01 01:22:42.000000000 +0100 ++++ bash-4.2.new/Makefile.in 2012-07-30 16:24:01.325057998 +0200 +@@ -724,10 +724,8 @@ + # $(MAKE) -f $(srcdir)/Makefile $(MFLAGS) srcdir=$(srcdir) + + doc documentation: force +- @(cd $(DOCDIR) ; $(MAKE) $(MFLAGS) ) + + info dvi ps: force +- @(cd $(DOCDIR) ; $(MAKE) $(MFLAGS) CFLAGS='$(CCFLAGS)' $@ ) + + force: + From 27b48028df44553049443694b311a2128cefc366 Mon Sep 17 00:00:00 2001 From: Marcel Denia Date: Thu, 25 Sep 2014 02:58:17 +0200 Subject: [PATCH 2/5] bash: Refresh patches Signed-off-by: Marcel Denia --- utils/bash/patches/101-upstream-bash42-001.patch | 2 +- utils/bash/patches/123-upstream-bash42-023.patch | 2 +- utils/bash/patches/{129-no_doc.patch => 900-no_doc.patch} | 7 +++---- 3 files changed, 5 insertions(+), 6 deletions(-) rename utils/bash/patches/{129-no_doc.patch => 900-no_doc.patch} (52%) diff --git a/utils/bash/patches/101-upstream-bash42-001.patch b/utils/bash/patches/101-upstream-bash42-001.patch index 8aca8156b..3ad78f677 100644 --- a/utils/bash/patches/101-upstream-bash42-001.patch +++ b/utils/bash/patches/101-upstream-bash42-001.patch @@ -34,7 +34,7 @@ Patch (apply with `patch -p0'): i = *sindex; while (c = string[i]) -@@ -7176,7 +7178,7 @@ parameter_brace_expand (string, indexp, +@@ -7176,7 +7178,7 @@ parameter_brace_expand (string, indexp, { /* Extract the contents of the ${ ... } expansion according to the Posix.2 rules. */ diff --git a/utils/bash/patches/123-upstream-bash42-023.patch b/utils/bash/patches/123-upstream-bash42-023.patch index 6c6fdb3e5..676d620f6 100644 --- a/utils/bash/patches/123-upstream-bash42-023.patch +++ b/utils/bash/patches/123-upstream-bash42-023.patch @@ -18,7 +18,7 @@ Patch (apply with `patch -p0'): --- a/subst.c +++ b/subst.c -@@ -7274,6 +7274,7 @@ parameter_brace_expand (string, indexp, +@@ -7274,6 +7274,7 @@ parameter_brace_expand (string, indexp, default: case '\0': bad_substitution: diff --git a/utils/bash/patches/129-no_doc.patch b/utils/bash/patches/900-no_doc.patch similarity index 52% rename from utils/bash/patches/129-no_doc.patch rename to utils/bash/patches/900-no_doc.patch index 442cd2291..5dfb367b4 100644 --- a/utils/bash/patches/129-no_doc.patch +++ b/utils/bash/patches/900-no_doc.patch @@ -1,7 +1,6 @@ -diff -urN bash-4.2/Makefile.in bash-4.2.new/Makefile.in ---- bash-4.2/Makefile.in 2010-12-01 01:22:42.000000000 +0100 -+++ bash-4.2.new/Makefile.in 2012-07-30 16:24:01.325057998 +0200 -@@ -724,10 +724,8 @@ +--- a/Makefile.in ++++ b/Makefile.in +@@ -724,10 +724,8 @@ reconfig: force # $(MAKE) -f $(srcdir)/Makefile $(MFLAGS) srcdir=$(srcdir) doc documentation: force From 96243ff2fcdb7d4ba7dce1f6f1f4707e6b7ff588 Mon Sep 17 00:00:00 2001 From: Marcel Denia Date: Thu, 25 Sep 2014 03:01:46 +0200 Subject: [PATCH 3/5] bash: Update to 4.2.48 Fixes CVE-2014-6271. Signed-off-by: Marcel Denia --- utils/bash/Makefile | 4 +- .../patches/129-upstream-bash42-029.patch | 461 ++++++++++++++++++ .../patches/130-upstream-bash42-030.patch | 147 ++++++ .../patches/131-upstream-bash42-031.patch | 62 +++ .../patches/132-upstream-bash42-032.patch | 62 +++ .../patches/133-upstream-bash42-033.patch | 48 ++ .../patches/134-upstream-bash42-034.patch | 39 ++ .../patches/135-upstream-bash42-035.patch | 56 +++ .../patches/136-upstream-bash42-036.patch | 69 +++ .../patches/137-upstream-bash42-037.patch | 91 ++++ .../patches/138-upstream-bash42-038.patch | 38 ++ .../patches/139-upstream-bash42-039.patch | 53 ++ .../patches/140-upstream-bash42-040.patch | 45 ++ .../patches/141-upstream-bash42-041.patch | 42 ++ .../patches/142-upstream-bash42-042.patch | 47 ++ .../patches/143-upstream-bash42-043.patch | 54 ++ .../patches/144-upstream-bash42-044.patch | 58 +++ .../patches/145-upstream-bash42-045.patch | 47 ++ .../patches/146-upstream-bash42-046.patch | 46 ++ .../patches/147-upstream-bash42-047.patch | 40 ++ .../patches/148-upstream-bash42-048.patch | 95 ++++ 21 files changed, 1602 insertions(+), 2 deletions(-) create mode 100644 utils/bash/patches/129-upstream-bash42-029.patch create mode 100644 utils/bash/patches/130-upstream-bash42-030.patch create mode 100644 utils/bash/patches/131-upstream-bash42-031.patch create mode 100644 utils/bash/patches/132-upstream-bash42-032.patch create mode 100644 utils/bash/patches/133-upstream-bash42-033.patch create mode 100644 utils/bash/patches/134-upstream-bash42-034.patch create mode 100644 utils/bash/patches/135-upstream-bash42-035.patch create mode 100644 utils/bash/patches/136-upstream-bash42-036.patch create mode 100644 utils/bash/patches/137-upstream-bash42-037.patch create mode 100644 utils/bash/patches/138-upstream-bash42-038.patch create mode 100644 utils/bash/patches/139-upstream-bash42-039.patch create mode 100644 utils/bash/patches/140-upstream-bash42-040.patch create mode 100644 utils/bash/patches/141-upstream-bash42-041.patch create mode 100644 utils/bash/patches/142-upstream-bash42-042.patch create mode 100644 utils/bash/patches/143-upstream-bash42-043.patch create mode 100644 utils/bash/patches/144-upstream-bash42-044.patch create mode 100644 utils/bash/patches/145-upstream-bash42-045.patch create mode 100644 utils/bash/patches/146-upstream-bash42-046.patch create mode 100644 utils/bash/patches/147-upstream-bash42-047.patch create mode 100644 utils/bash/patches/148-upstream-bash42-048.patch diff --git a/utils/bash/Makefile b/utils/bash/Makefile index bef9bccc9..86df4b81b 100644 --- a/utils/bash/Makefile +++ b/utils/bash/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2007-2012 OpenWrt.org +# Copyright (C) 2007-2014 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=bash PKG_VERSION:=4.2 -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GNU/bash diff --git a/utils/bash/patches/129-upstream-bash42-029.patch b/utils/bash/patches/129-upstream-bash42-029.patch new file mode 100644 index 000000000..a870c2274 --- /dev/null +++ b/utils/bash/patches/129-upstream-bash42-029.patch @@ -0,0 +1,461 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-029 + +Bug-Reported-by: "Michael Kalisz" +Bug-Reference-ID: <50241.78.69.11.112.1298585641.squirrel@kalisz.homelinux.net> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html + +Bug-Description: + +Bash-4.2 tries to leave completed directory names as the user typed them, +without expanding them to a full pathname. One effect of this is that +shell variables used in pathnames being completed (e.g., $HOME) are left +unchanged, but the `$' is quoted by readline because it is a special +character to the shell. + +This patch introduces two things: + +1. A new shell option, `direxpand', which, if set, attempts to emulate the + bash-4.1 behavior of expanding words to full pathnames during + completion; +2. A set of heuristics that reduce the number of times special characters + such as `$' are quoted when the directory name is not expanded. + +Patch (apply with `patch -p0'): + +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 28 ++#define PATCHLEVEL 29 + + #endif /* _PATCHLEVEL_H_ */ +--- a/bashline.c ++++ b/bashline.c +@@ -121,6 +121,9 @@ static int bash_directory_completion_hoo + static int filename_completion_ignore __P((char **)); + static int bash_push_line __P((void)); + ++static rl_icppfunc_t *save_directory_hook __P((void)); ++static void reset_directory_hook __P((rl_icppfunc_t *)); ++ + static void cleanup_expansion_error __P((void)); + static void maybe_make_readline_line __P((char *)); + static void set_up_new_line __P((char *)); +@@ -243,10 +246,17 @@ int force_fignore = 1; + /* Perform spelling correction on directory names during word completion */ + int dircomplete_spelling = 0; + ++/* Expand directory names during word/filename completion. */ ++int dircomplete_expand = 0; ++int dircomplete_expand_relpath = 0; ++ + static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:"; + static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:"; + /* )) */ + ++static const char *default_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~"; /*}*/ ++static char *custom_filename_quote_characters = 0; ++ + static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL; + + static int dot_in_path = 0; +@@ -501,7 +511,7 @@ initialize_readline () + + /* Tell the completer that we might want to follow symbolic links or + do other expansion on directory names. */ +- rl_directory_rewrite_hook = bash_directory_completion_hook; ++ set_directory_hook (); + + rl_filename_rewrite_hook = bash_filename_rewrite_hook; + +@@ -529,7 +539,7 @@ initialize_readline () + enable_hostname_completion (perform_hostname_completion); + + /* characters that need to be quoted when appearing in filenames. */ +- rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~"; /*}*/ ++ rl_filename_quote_characters = default_filename_quote_characters; + + rl_filename_quoting_function = bash_quote_filename; + rl_filename_dequoting_function = bash_dequote_filename; +@@ -564,8 +574,10 @@ bashline_reset () + tilde_initialize (); + rl_attempted_completion_function = attempt_shell_completion; + rl_completion_entry_function = NULL; +- rl_directory_rewrite_hook = bash_directory_completion_hook; + rl_ignore_some_completions_function = filename_completion_ignore; ++ rl_filename_quote_characters = default_filename_quote_characters; ++ ++ set_directory_hook (); + } + + /* Contains the line to push into readline. */ +@@ -1279,6 +1291,9 @@ attempt_shell_completion (text, start, e + matches = (char **)NULL; + rl_ignore_some_completions_function = filename_completion_ignore; + ++ rl_filename_quote_characters = default_filename_quote_characters; ++ set_directory_hook (); ++ + /* Determine if this could be a command word. It is if it appears at + the start of the line (ignoring preceding whitespace), or if it + appears after a character that separates commands. It cannot be a +@@ -1591,6 +1606,12 @@ command_word_completion_function (hint_t + } + else + { ++ if (dircomplete_expand && dot_or_dotdot (filename_hint)) ++ { ++ dircomplete_expand = 0; ++ set_directory_hook (); ++ dircomplete_expand = 1; ++ } + mapping_over = 4; + goto inner; + } +@@ -1791,6 +1812,9 @@ globword: + + inner: + val = rl_filename_completion_function (filename_hint, istate); ++ if (mapping_over == 4 && dircomplete_expand) ++ set_directory_hook (); ++ + istate = 1; + + if (val == 0) +@@ -2693,6 +2717,52 @@ bash_filename_rewrite_hook (fname, fnlen + return conv; + } + ++/* Functions to save and restore the appropriate directory hook */ ++/* This is not static so the shopt code can call it */ ++void ++set_directory_hook () ++{ ++ if (dircomplete_expand) ++ { ++ rl_directory_completion_hook = bash_directory_completion_hook; ++ rl_directory_rewrite_hook = (rl_icppfunc_t *)0; ++ } ++ else ++ { ++ rl_directory_rewrite_hook = bash_directory_completion_hook; ++ rl_directory_completion_hook = (rl_icppfunc_t *)0; ++ } ++} ++ ++static rl_icppfunc_t * ++save_directory_hook () ++{ ++ rl_icppfunc_t *ret; ++ ++ if (dircomplete_expand) ++ { ++ ret = rl_directory_completion_hook; ++ rl_directory_completion_hook = (rl_icppfunc_t *)NULL; ++ } ++ else ++ { ++ ret = rl_directory_rewrite_hook; ++ rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL; ++ } ++ ++ return ret; ++} ++ ++static void ++restore_directory_hook (hookf) ++ rl_icppfunc_t *hookf; ++{ ++ if (dircomplete_expand) ++ rl_directory_completion_hook = hookf; ++ else ++ rl_directory_rewrite_hook = hookf; ++} ++ + /* Handle symbolic link references and other directory name + expansions while hacking completion. This should return 1 if it modifies + the DIRNAME argument, 0 otherwise. It should make sure not to modify +@@ -2702,20 +2772,31 @@ bash_directory_completion_hook (dirname) + char **dirname; + { + char *local_dirname, *new_dirname, *t; +- int return_value, should_expand_dirname; ++ int return_value, should_expand_dirname, nextch, closer; + WORD_LIST *wl; + struct stat sb; + +- return_value = should_expand_dirname = 0; ++ return_value = should_expand_dirname = nextch = closer = 0; + local_dirname = *dirname; + +- if (mbschr (local_dirname, '$')) +- should_expand_dirname = 1; ++ if (t = mbschr (local_dirname, '$')) ++ { ++ should_expand_dirname = '$'; ++ nextch = t[1]; ++ /* Deliberately does not handle the deprecated $[...] arithmetic ++ expansion syntax */ ++ if (nextch == '(') ++ closer = ')'; ++ else if (nextch == '{') ++ closer = '}'; ++ else ++ nextch = 0; ++ } + else + { + t = mbschr (local_dirname, '`'); + if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0) +- should_expand_dirname = 1; ++ should_expand_dirname = '`'; + } + + #if defined (HAVE_LSTAT) +@@ -2739,6 +2820,23 @@ bash_directory_completion_hook (dirname) + free (new_dirname); + dispose_words (wl); + local_dirname = *dirname; ++ /* XXX - change rl_filename_quote_characters here based on ++ should_expand_dirname/nextch/closer. This is the only place ++ custom_filename_quote_characters is modified. */ ++ if (rl_filename_quote_characters && *rl_filename_quote_characters) ++ { ++ int i, j, c; ++ i = strlen (default_filename_quote_characters); ++ custom_filename_quote_characters = xrealloc (custom_filename_quote_characters, i+1); ++ for (i = j = 0; c = default_filename_quote_characters[i]; i++) ++ { ++ if (c == should_expand_dirname || c == nextch || c == closer) ++ continue; ++ custom_filename_quote_characters[j++] = c; ++ } ++ custom_filename_quote_characters[j] = '\0'; ++ rl_filename_quote_characters = custom_filename_quote_characters; ++ } + } + else + { +@@ -2758,11 +2856,31 @@ bash_directory_completion_hook (dirname) + local_dirname = *dirname = new_dirname; + } + ++ /* no_symbolic_links == 0 -> use (default) logical view of the file system. ++ local_dirname[0] == '.' && local_dirname[1] == '/' means files in the ++ current directory (./). ++ local_dirname[0] == '.' && local_dirname[1] == 0 means relative pathnames ++ in the current directory (e.g., lib/sh). ++ XXX - should we do spelling correction on these? */ ++ ++ /* This is test as it was in bash-4.2: skip relative pathnames in current ++ directory. Change test to ++ (local_dirname[0] != '.' || (local_dirname[1] && local_dirname[1] != '/')) ++ if we want to skip paths beginning with ./ also. */ + if (no_symbolic_links == 0 && (local_dirname[0] != '.' || local_dirname[1])) + { + char *temp1, *temp2; + int len1, len2; + ++ /* If we have a relative path ++ (local_dirname[0] != '/' && local_dirname[0] != '.') ++ that is canonical after appending it to the current directory, then ++ temp1 = temp2+'/' ++ That is, ++ strcmp (temp1, temp2) == 0 ++ after adding a slash to temp2 below. It should be safe to not ++ change those. ++ */ + t = get_working_directory ("symlink-hook"); + temp1 = make_absolute (local_dirname, t); + free (t); +@@ -2797,7 +2915,15 @@ bash_directory_completion_hook (dirname) + temp2[len2 + 1] = '\0'; + } + } +- return_value |= STREQ (local_dirname, temp2) == 0; ++ ++ /* dircomplete_expand_relpath == 0 means we want to leave relative ++ pathnames that are unchanged by canonicalization alone. ++ *local_dirname != '/' && *local_dirname != '.' == relative pathname ++ (consistent with general.c:absolute_pathname()) ++ temp1 == temp2 (after appending a slash to temp2) means the pathname ++ is not changed by canonicalization as described above. */ ++ if (dircomplete_expand_relpath || ((local_dirname[0] != '/' && local_dirname[0] != '.') && STREQ (temp1, temp2) == 0)) ++ return_value |= STREQ (local_dirname, temp2) == 0; + free (local_dirname); + *dirname = temp2; + free (temp1); +@@ -3002,12 +3128,13 @@ bash_complete_filename_internal (what_to + + orig_func = rl_completion_entry_function; + orig_attempt_func = rl_attempted_completion_function; +- orig_dir_func = rl_directory_rewrite_hook; + orig_ignore_func = rl_ignore_some_completions_function; + orig_rl_completer_word_break_characters = rl_completer_word_break_characters; ++ ++ orig_dir_func = save_directory_hook (); ++ + rl_completion_entry_function = rl_filename_completion_function; + rl_attempted_completion_function = (rl_completion_func_t *)NULL; +- rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL; + rl_ignore_some_completions_function = filename_completion_ignore; + rl_completer_word_break_characters = " \t\n\"\'"; + +@@ -3015,10 +3142,11 @@ bash_complete_filename_internal (what_to + + rl_completion_entry_function = orig_func; + rl_attempted_completion_function = orig_attempt_func; +- rl_directory_rewrite_hook = orig_dir_func; + rl_ignore_some_completions_function = orig_ignore_func; + rl_completer_word_break_characters = orig_rl_completer_word_break_characters; + ++ restore_directory_hook (orig_dir_func); ++ + return r; + } + +--- a/bashline.h ++++ b/bashline.h +@@ -33,10 +33,15 @@ extern void bashline_reset __P((void)); + extern void bashline_reinitialize __P((void)); + extern int bash_re_edit __P((char *)); + ++extern void bashline_set_event_hook __P((void)); ++extern void bashline_reset_event_hook __P((void)); ++ + extern int bind_keyseq_to_unix_command __P((char *)); + + extern char **bash_default_completion __P((const char *, int, int, int, int)); + ++void set_directory_hook __P((void)); ++ + /* Used by programmable completion code. */ + extern char *command_word_completion_function __P((const char *, int)); + extern char *bash_groupname_completion_function __P((const char *, int)); +--- a/builtins/shopt.def ++++ b/builtins/shopt.def +@@ -61,6 +61,10 @@ $END + #include "common.h" + #include "bashgetopt.h" + ++#if defined (READLINE) ++# include "../bashline.h" ++#endif ++ + #if defined (HISTORY) + # include "../bashhist.h" + #endif +@@ -94,7 +98,7 @@ extern int extended_glob; + extern int hist_verify, history_reediting, perform_hostname_completion; + extern int no_empty_command_completion; + extern int force_fignore; +-extern int dircomplete_spelling; ++extern int dircomplete_spelling, dircomplete_expand; + + extern int enable_hostname_completion __P((int)); + #endif +@@ -121,6 +125,10 @@ static int set_compatibility_level __P(( + static int set_restricted_shell __P((char *, int)); + #endif + ++#if defined (READLINE) ++static int shopt_set_complete_direxpand __P((char *, int)); ++#endif ++ + static int shopt_login_shell; + static int shopt_compat31; + static int shopt_compat32; +@@ -150,6 +158,7 @@ static struct { + { "compat40", &shopt_compat40, set_compatibility_level }, + { "compat41", &shopt_compat41, set_compatibility_level }, + #if defined (READLINE) ++ { "direxpand", &dircomplete_expand, shopt_set_complete_direxpand }, + { "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL }, + #endif + { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL }, +@@ -535,6 +544,17 @@ set_compatibility_level (option_name, mo + return 0; + } + ++#if defined (READLINE) ++static int ++shopt_set_complete_direxpand (option_name, mode) ++ char *option_name; ++ int mode; ++{ ++ set_directory_hook (); ++ return 0; ++} ++#endif ++ + #if defined (RESTRICTED_SHELL) + /* Don't allow the value of restricted_shell to be modified. */ + +--- a/doc/bash.1 ++++ b/doc/bash.1 +@@ -8948,6 +8948,16 @@ parameter expansion as a special charact + quoted. This is the behavior of posix mode through version 4.1. + The default bash behavior remains as in previous versions. + .TP 8 ++.B direxpand ++If set, ++.B bash ++replaces directory names with the results of word expansion when performing ++filename completion. This changes the contents of the readline editing ++buffer. ++If not set, ++.B bash ++attempts to preserve what the user typed. ++.TP 8 + .B dirspell + If set, + .B bash +--- a/doc/bashref.texi ++++ b/doc/bashref.texi +@@ -4535,6 +4535,13 @@ parameter expansion as a special charact + quoted. This is the behavior of @sc{posix} mode through version 4.1. + The default Bash behavior remains as in previous versions. + ++@item direxpand ++If set, Bash ++replaces directory names with the results of word expansion when performing ++filename completion. This changes the contents of the readline editing ++buffer. ++If not set, Bash attempts to preserve what the user typed. ++ + @item dirspell + If set, Bash + attempts spelling correction on directory names during word completion +--- a/tests/shopt.right ++++ b/tests/shopt.right +@@ -12,6 +12,7 @@ shopt -u compat31 + shopt -u compat32 + shopt -u compat40 + shopt -u compat41 ++shopt -u direxpand + shopt -u dirspell + shopt -u dotglob + shopt -u execfail +@@ -68,6 +69,7 @@ shopt -u compat31 + shopt -u compat32 + shopt -u compat40 + shopt -u compat41 ++shopt -u direxpand + shopt -u dirspell + shopt -u dotglob + shopt -u execfail +@@ -101,6 +103,7 @@ compat31 off + compat32 off + compat40 off + compat41 off ++direxpand off + dirspell off + dotglob off + execfail off diff --git a/utils/bash/patches/130-upstream-bash42-030.patch b/utils/bash/patches/130-upstream-bash42-030.patch new file mode 100644 index 000000000..aa7faee0f --- /dev/null +++ b/utils/bash/patches/130-upstream-bash42-030.patch @@ -0,0 +1,147 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-030 + +Bug-Reported-by: Roman Rakus +Bug-Reference-ID: <4D7DD91E.7040808@redhat.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-03/msg00126.html + +Bug-Description: + +When attempting to glob strings in a multibyte locale, and those strings +contain invalid multibyte characters that cause mbsnrtowcs to return 0, +the globbing code loops infinitely. + +Patch (apply with `patch -p0'): + +--- a/lib/glob/xmbsrtowcs.c ++++ b/lib/glob/xmbsrtowcs.c +@@ -35,6 +35,8 @@ + + #if HANDLE_MULTIBYTE + ++#define WSBUF_INC 32 ++ + #ifndef FREE + # define FREE(x) do { if (x) free (x); } while (0) + #endif +@@ -148,7 +150,7 @@ xdupmbstowcs2 (destp, src) + size_t wsbuf_size; /* Size of WSBUF */ + size_t wcnum; /* Number of wide characters in WSBUF */ + mbstate_t state; /* Conversion State */ +- size_t wcslength; /* Number of wide characters produced by the conversion. */ ++ size_t n, wcslength; /* Number of wide characters produced by the conversion. */ + const char *end_or_backslash; + size_t nms; /* Number of multibyte characters to convert at one time. */ + mbstate_t tmp_state; +@@ -171,7 +173,18 @@ xdupmbstowcs2 (destp, src) + /* Compute the number of produced wide-characters. */ + tmp_p = p; + tmp_state = state; +- wcslength = mbsnrtowcs(NULL, &tmp_p, nms, 0, &tmp_state); ++ ++ if (nms == 0 && *p == '\\') /* special initial case */ ++ nms = wcslength = 1; ++ else ++ wcslength = mbsnrtowcs (NULL, &tmp_p, nms, 0, &tmp_state); ++ ++ if (wcslength == 0) ++ { ++ tmp_p = p; /* will need below */ ++ tmp_state = state; ++ wcslength = 1; /* take a single byte */ ++ } + + /* Conversion failed. */ + if (wcslength == (size_t)-1) +@@ -186,7 +199,8 @@ xdupmbstowcs2 (destp, src) + { + wchar_t *wstmp; + +- wsbuf_size = wcnum+wcslength+1; /* 1 for the L'\0' or the potential L'\\' */ ++ while (wsbuf_size < wcnum+wcslength+1) /* 1 for the L'\0' or the potential L'\\' */ ++ wsbuf_size += WSBUF_INC; + + wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t)); + if (wstmp == NULL) +@@ -199,10 +213,18 @@ xdupmbstowcs2 (destp, src) + } + + /* Perform the conversion. This is assumed to return 'wcslength'. +- * It may set 'p' to NULL. */ +- mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state); ++ It may set 'p' to NULL. */ ++ n = mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state); + +- wcnum += wcslength; ++ /* Compensate for taking single byte on wcs conversion failure above. */ ++ if (wcslength == 1 && (n == 0 || n == (size_t)-1)) ++ { ++ state = tmp_state; ++ p = tmp_p; ++ wsbuf[wcnum++] = *p++; ++ } ++ else ++ wcnum += wcslength; + + if (mbsinit (&state) && (p != NULL) && (*p == '\\')) + { +@@ -230,8 +252,6 @@ xdupmbstowcs2 (destp, src) + If conversion is failed, the return value is (size_t)-1 and the values + of DESTP and INDICESP are NULL. */ + +-#define WSBUF_INC 32 +- + size_t + xdupmbstowcs (destp, indicesp, src) + wchar_t **destp; /* Store the pointer to the wide character string */ +--- a/lib/glob/glob.c ++++ b/lib/glob/glob.c +@@ -200,8 +200,11 @@ mbskipname (pat, dname, flags) + wchar_t *pat_wc, *dn_wc; + size_t pat_n, dn_n; + ++ pat_wc = dn_wc = (wchar_t *)NULL; ++ + pat_n = xdupmbstowcs (&pat_wc, NULL, pat); +- dn_n = xdupmbstowcs (&dn_wc, NULL, dname); ++ if (pat_n != (size_t)-1) ++ dn_n = xdupmbstowcs (&dn_wc, NULL, dname); + + ret = 0; + if (pat_n != (size_t)-1 && dn_n !=(size_t)-1) +@@ -221,6 +224,8 @@ mbskipname (pat, dname, flags) + (pat_wc[0] != L'\\' || pat_wc[1] != L'.')) + ret = 1; + } ++ else ++ ret = skipname (pat, dname, flags); + + FREE (pat_wc); + FREE (dn_wc); +@@ -266,8 +271,11 @@ wdequote_pathname (pathname) + /* Convert the strings into wide characters. */ + n = xdupmbstowcs (&wpathname, NULL, pathname); + if (n == (size_t) -1) +- /* Something wrong. */ +- return; ++ { ++ /* Something wrong. Fall back to single-byte */ ++ udequote_pathname (pathname); ++ return; ++ } + orig_wpathname = wpathname; + + for (i = j = 0; wpathname && wpathname[i]; ) +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 29 ++#define PATCHLEVEL 30 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/131-upstream-bash42-031.patch b/utils/bash/patches/131-upstream-bash42-031.patch new file mode 100644 index 000000000..2eeb9e372 --- /dev/null +++ b/utils/bash/patches/131-upstream-bash42-031.patch @@ -0,0 +1,62 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-031 + +Bug-Reported-by: Max Horn +Bug-Reference-ID: <20CC5C60-07C3-4E41-9817-741E48D407C5@quendi.de> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2012-06/msg00005.html + +Bug-Description: + +A change between bash-4.1 and bash-4.2 to prevent the readline input hook +from being called too frequently had the side effect of causing delays +when reading pasted input on systems such as Mac OS X. This patch fixes +those delays while retaining the bash-4.2 behavior. + +Patch (apply with `patch -p0'): + +--- a/lib/readline/input.c ++++ b/lib/readline/input.c +@@ -409,7 +409,7 @@ rl_clear_pending_input () + int + rl_read_key () + { +- int c; ++ int c, r; + + rl_key_sequence_length++; + +@@ -429,14 +429,18 @@ rl_read_key () + { + while (rl_event_hook) + { +- if (rl_gather_tyi () < 0) /* XXX - EIO */ ++ if (rl_get_char (&c) != 0) ++ break; ++ ++ if ((r = rl_gather_tyi ()) < 0) /* XXX - EIO */ + { + rl_done = 1; + return ('\n'); + } ++ else if (r == 1) /* read something */ ++ continue; ++ + RL_CHECK_SIGNALS (); +- if (rl_get_char (&c) != 0) +- break; + if (rl_done) /* XXX - experimental */ + return ('\n'); + (*rl_event_hook) (); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 30 ++#define PATCHLEVEL 31 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/132-upstream-bash42-032.patch b/utils/bash/patches/132-upstream-bash42-032.patch new file mode 100644 index 000000000..602513ae6 --- /dev/null +++ b/utils/bash/patches/132-upstream-bash42-032.patch @@ -0,0 +1,62 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-032 + +Bug-Reported-by: Ruediger Kuhlmann +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-05/msg00010.html + +Bug-Description: + +Bash-4.2 has problems with DEL characters in the expanded value of variables +used in the same quoted string as variables that expand to nothing. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -8151,6 +8151,14 @@ add_string: + temp = tword->word; + dispose_word_desc (tword); + ++ /* Kill quoted nulls; we will add them back at the end of ++ expand_word_internal if nothing else in the string */ ++ if (had_quoted_null && temp && QUOTED_NULL (temp)) ++ { ++ FREE (temp); ++ temp = (char *)NULL; ++ } ++ + goto add_string; + break; + +@@ -8555,7 +8563,7 @@ finished_with_string: + tword->flags |= W_NOEXPAND; /* XXX */ + if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) + tword->flags |= W_QUOTED; +- if (had_quoted_null) ++ if (had_quoted_null && QUOTED_NULL (istring)) + tword->flags |= W_HASQUOTEDNULL; + list = make_word_list (tword, (WORD_LIST *)NULL); + } +@@ -8586,7 +8594,7 @@ finished_with_string: + tword->flags |= W_NOGLOB; + if (word->flags & W_NOEXPAND) + tword->flags |= W_NOEXPAND; +- if (had_quoted_null) ++ if (had_quoted_null && QUOTED_NULL (istring)) + tword->flags |= W_HASQUOTEDNULL; /* XXX */ + list = make_word_list (tword, (WORD_LIST *)NULL); + } +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 31 ++#define PATCHLEVEL 32 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/133-upstream-bash42-033.patch b/utils/bash/patches/133-upstream-bash42-033.patch new file mode 100644 index 000000000..761e2ff52 --- /dev/null +++ b/utils/bash/patches/133-upstream-bash42-033.patch @@ -0,0 +1,48 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-033 + +Bug-Reported-by: David Leverton +Bug-Reference-ID: <4FCCE737.1060603@googlemail.com> +Bug-Reference-URL: + +Bug-Description: + +Bash uses a static buffer when expanding the /dev/fd prefix for the test +and conditional commands, among other uses, when it should use a dynamic +buffer to avoid buffer overflow. + +Patch (apply with `patch -p0'): + +--- a/lib/sh/eaccess.c ++++ b/lib/sh/eaccess.c +@@ -82,6 +82,8 @@ sh_stat (path, finfo) + const char *path; + struct stat *finfo; + { ++ static char *pbuf = 0; ++ + if (*path == '\0') + { + errno = ENOENT; +@@ -106,7 +108,7 @@ sh_stat (path, finfo) + trailing slash. Make sure /dev/fd/xx really uses DEV_FD_PREFIX/xx. + On most systems, with the notable exception of linux, this is + effectively a no-op. */ +- char pbuf[32]; ++ pbuf = xrealloc (pbuf, sizeof (DEV_FD_PREFIX) + strlen (path + 8)); + strcpy (pbuf, DEV_FD_PREFIX); + strcat (pbuf, path + 8); + return (stat (pbuf, finfo)); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 32 ++#define PATCHLEVEL 33 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/134-upstream-bash42-034.patch b/utils/bash/patches/134-upstream-bash42-034.patch new file mode 100644 index 000000000..5546798a2 --- /dev/null +++ b/utils/bash/patches/134-upstream-bash42-034.patch @@ -0,0 +1,39 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-034 + +Bug-Reported-by: "Davide Brini" +Bug-Reference-ID: <20120604164154.69781EC04B@imaps.oficinas.atrapalo.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-06/msg00030.html + +Bug-Description: + +In bash-4.2, the history code would inappropriately add a semicolon to +multi-line compound array assignments when adding them to the history. + +Patch (apply with `patch -p0'): + +--- a/parse.y ++++ b/parse.y +@@ -4900,6 +4900,9 @@ history_delimiting_chars (line) + return (current_command_line_count == 2 ? "\n" : ""); + } + ++ if (parser_state & PST_COMPASSIGN) ++ return (" "); ++ + /* First, handle some special cases. */ + /*(*/ + /* If we just read `()', assume it's a function definition, and don't +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 33 ++#define PATCHLEVEL 34 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/135-upstream-bash42-035.patch b/utils/bash/patches/135-upstream-bash42-035.patch new file mode 100644 index 000000000..9f9735fda --- /dev/null +++ b/utils/bash/patches/135-upstream-bash42-035.patch @@ -0,0 +1,56 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-035 + +Bug-Reported-by: Dan Douglas +Bug-Reference-ID: <2766482.Ksm3GrSoYi@smorgbox> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-06/msg00071.html + +Bug-Description: + +When given a number of lines to read, `mapfile -n lines' reads one too many. + +Patch (apply with `patch -p0'): + +--- a/builtins/mapfile.def ++++ b/builtins/mapfile.def +@@ -195,13 +195,9 @@ mapfile (fd, line_count_goal, origin, ns + /* Reset the buffer for bash own stream */ + interrupt_immediately++; + for (array_index = origin, line_count = 1; +- zgetline (fd, &line, &line_length, unbuffered_read) != -1; +- array_index++, line_count++) ++ zgetline (fd, &line, &line_length, unbuffered_read) != -1; ++ array_index++) + { +- /* Have we exceeded # of lines to store? */ +- if (line_count_goal != 0 && line_count > line_count_goal) +- break; +- + /* Remove trailing newlines? */ + if (flags & MAPF_CHOP) + do_chop (line); +@@ -217,6 +213,11 @@ mapfile (fd, line_count_goal, origin, ns + } + + bind_array_element (entry, array_index, line, 0); ++ ++ /* Have we exceeded # of lines to store? */ ++ line_count++; ++ if (line_count_goal != 0 && line_count > line_count_goal) ++ break; + } + + xfree (line); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 34 ++#define PATCHLEVEL 35 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/136-upstream-bash42-036.patch b/utils/bash/patches/136-upstream-bash42-036.patch new file mode 100644 index 000000000..f31c12067 --- /dev/null +++ b/utils/bash/patches/136-upstream-bash42-036.patch @@ -0,0 +1,69 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-036 + +Bug-Reported-by: gregrwm +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-05/msg00108.html + +Bug-Description: + +Bash-4.2 produces incorrect word splitting results when expanding +double-quoted $@ in the same string as and adjacent to other variable +expansions. The $@ should be split, the other expansions should not. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -7922,7 +7922,7 @@ expand_word_internal (word, quoted, isex + + /* State flags */ + int had_quoted_null; +- int has_dollar_at; ++ int has_dollar_at, temp_has_dollar_at; + int tflag; + int pflags; /* flags passed to param_expand */ + +@@ -8127,13 +8127,14 @@ add_string: + if (expanded_something) + *expanded_something = 1; + +- has_dollar_at = 0; ++ temp_has_dollar_at = 0; + pflags = (word->flags & W_NOCOMSUB) ? PF_NOCOMSUB : 0; + if (word->flags & W_NOSPLIT2) + pflags |= PF_NOSPLIT2; + tword = param_expand (string, &sindex, quoted, expanded_something, +- &has_dollar_at, "ed_dollar_at, ++ &temp_has_dollar_at, "ed_dollar_at, + &had_quoted_null, pflags); ++ has_dollar_at += temp_has_dollar_at; + + if (tword == &expand_wdesc_error || tword == &expand_wdesc_fatal) + { +@@ -8274,9 +8275,10 @@ add_twochars: + + temp = (char *)NULL; + +- has_dollar_at = 0; ++ temp_has_dollar_at = 0; /* XXX */ + /* Need to get W_HASQUOTEDNULL flag through this function. */ +- list = expand_word_internal (tword, Q_DOUBLE_QUOTES, 0, &has_dollar_at, (int *)NULL); ++ list = expand_word_internal (tword, Q_DOUBLE_QUOTES, 0, &temp_has_dollar_at, (int *)NULL); ++ has_dollar_at += temp_has_dollar_at; + + if (list == &expand_word_error || list == &expand_word_fatal) + { +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 35 ++#define PATCHLEVEL 36 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/137-upstream-bash42-037.patch b/utils/bash/patches/137-upstream-bash42-037.patch new file mode 100644 index 000000000..35628ba04 --- /dev/null +++ b/utils/bash/patches/137-upstream-bash42-037.patch @@ -0,0 +1,91 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-037 + +Bug-Reported-by: Jakub Filak +Bug-Reference-ID: +Bug-Reference-URL: https://bugzilla.redhat.com/show_bug.cgi?id=813289 + +Bug-Description: + +Attempting to redo (using `.') the vi editing mode `cc', `dd', or `yy' +commands leads to an infinite loop. + +Patch (apply with `patch -p0'): + +--- a/lib/readline/vi_mode.c ++++ b/lib/readline/vi_mode.c +@@ -1234,11 +1234,19 @@ rl_vi_delete_to (count, key) + _rl_vimvcxt->motion = '$'; + r = rl_domove_motion_callback (_rl_vimvcxt); + } +- else if (vi_redoing) ++ else if (vi_redoing && _rl_vi_last_motion != 'd') /* `dd' is special */ + { + _rl_vimvcxt->motion = _rl_vi_last_motion; + r = rl_domove_motion_callback (_rl_vimvcxt); + } ++ else if (vi_redoing) /* handle redoing `dd' here */ ++ { ++ _rl_vimvcxt->motion = _rl_vi_last_motion; ++ rl_mark = rl_end; ++ rl_beg_of_line (1, key); ++ RL_UNSETSTATE (RL_STATE_VIMOTION); ++ r = vidomove_dispatch (_rl_vimvcxt); ++ } + #if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { +@@ -1316,11 +1324,19 @@ rl_vi_change_to (count, key) + _rl_vimvcxt->motion = '$'; + r = rl_domove_motion_callback (_rl_vimvcxt); + } +- else if (vi_redoing) ++ else if (vi_redoing && _rl_vi_last_motion != 'c') /* `cc' is special */ + { + _rl_vimvcxt->motion = _rl_vi_last_motion; + r = rl_domove_motion_callback (_rl_vimvcxt); + } ++ else if (vi_redoing) /* handle redoing `cc' here */ ++ { ++ _rl_vimvcxt->motion = _rl_vi_last_motion; ++ rl_mark = rl_end; ++ rl_beg_of_line (1, key); ++ RL_UNSETSTATE (RL_STATE_VIMOTION); ++ r = vidomove_dispatch (_rl_vimvcxt); ++ } + #if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { +@@ -1377,6 +1393,19 @@ rl_vi_yank_to (count, key) + _rl_vimvcxt->motion = '$'; + r = rl_domove_motion_callback (_rl_vimvcxt); + } ++ else if (vi_redoing && _rl_vi_last_motion != 'y') /* `yy' is special */ ++ { ++ _rl_vimvcxt->motion = _rl_vi_last_motion; ++ r = rl_domove_motion_callback (_rl_vimvcxt); ++ } ++ else if (vi_redoing) /* handle redoing `yy' here */ ++ { ++ _rl_vimvcxt->motion = _rl_vi_last_motion; ++ rl_mark = rl_end; ++ rl_beg_of_line (1, key); ++ RL_UNSETSTATE (RL_STATE_VIMOTION); ++ r = vidomove_dispatch (_rl_vimvcxt); ++ } + #if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) + { +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 36 ++#define PATCHLEVEL 37 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/138-upstream-bash42-038.patch b/utils/bash/patches/138-upstream-bash42-038.patch new file mode 100644 index 000000000..eb07a3797 --- /dev/null +++ b/utils/bash/patches/138-upstream-bash42-038.patch @@ -0,0 +1,38 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-038 + +Bug-Reported-by: armandsl@gmail.com +Bug-Reference-ID: <20120822112810.8D14920040@windmill.latviatours.lv> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-08/msg00049.html + +Bug-Description: + +If a backslash-newline (which is removed) with no other input is given as +input to `read', the shell tries to dereference a null pointer and seg faults. + +Patch (apply with `patch -p0'): + +--- a/builtins/read.def ++++ b/builtins/read.def +@@ -791,7 +791,7 @@ assign_vars: + } + #endif + +- if (saw_escape) ++ if (saw_escape && input_string && *input_string) + { + t = dequote_string (input_string); + var = bind_read_variable (list->word->word, t); +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 37 ++#define PATCHLEVEL 38 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/139-upstream-bash42-039.patch b/utils/bash/patches/139-upstream-bash42-039.patch new file mode 100644 index 000000000..3b150be5d --- /dev/null +++ b/utils/bash/patches/139-upstream-bash42-039.patch @@ -0,0 +1,53 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-039 + +Bug-Reported-by: Dan Douglas +Bug-Reference-ID: <1498458.MpVlmOXDB7@smorgbox> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-09/msg00008.html + +Bug-Description: + +Under certain circumstances, bash attempts to expand variables in arithmetic +expressions even when evaluation is being suppressed. + +Patch (apply with `patch -p0'): + +--- a/expr.c ++++ b/expr.c +@@ -1009,6 +1009,12 @@ expr_streval (tok, e, lvalue) + arrayind_t ind; + #endif + ++/*itrace("expr_streval: %s: noeval = %d", tok, noeval);*/ ++ /* If we are suppressing evaluation, just short-circuit here instead of ++ going through the rest of the evaluator. */ ++ if (noeval) ++ return (0); ++ + /* [[[[[ */ + #if defined (ARRAY_VARS) + v = (e == ']') ? array_variable_part (tok, (char **)0, (int *)0) : find_variable (tok); +@@ -1182,6 +1188,10 @@ readtok () + #endif /* ARRAY_VARS */ + + *cp = '\0'; ++ /* XXX - watch out for pointer aliasing issues here */ ++ if (curlval.tokstr && curlval.tokstr == tokstr) ++ init_lvalue (&curlval); ++ + FREE (tokstr); + tokstr = savestring (tp); + *cp = c; +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 38 ++#define PATCHLEVEL 39 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/140-upstream-bash42-040.patch b/utils/bash/patches/140-upstream-bash42-040.patch new file mode 100644 index 000000000..181ce234a --- /dev/null +++ b/utils/bash/patches/140-upstream-bash42-040.patch @@ -0,0 +1,45 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-040 + +Bug-Reported-by: Andrey Zaitsev +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00144.html + +Bug-Description: + +Output redirection applied to builtin commands missed I/O errors if +they happened when the file descriptor was closed, rather than on write +(e.g., like with an out-of-space error on a remote NFS file system). + +Patch (apply with `patch -p0'): + +--- a/redir.c ++++ b/redir.c +@@ -1091,10 +1091,12 @@ do_redirection_internal (redirect, flags + + #if defined (BUFFERED_INPUT) + check_bash_input (redirector); +- close_buffered_fd (redirector); ++ r = close_buffered_fd (redirector); + #else /* !BUFFERED_INPUT */ +- close (redirector); ++ r = close (redirector); + #endif /* !BUFFERED_INPUT */ ++ if (r < 0 && (flags & RX_INTERNAL) && (errno == EIO || errno == ENOSPC)) ++ REDIRECTION_ERROR (r, errno, -1); + } + break; + +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 39 ++#define PATCHLEVEL 40 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/141-upstream-bash42-041.patch b/utils/bash/patches/141-upstream-bash42-041.patch new file mode 100644 index 000000000..acebdddf0 --- /dev/null +++ b/utils/bash/patches/141-upstream-bash42-041.patch @@ -0,0 +1,42 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-041 + +Bug-Reported-by: Andrey Borzenkov +Bug-Reference-ID: <20121202205200.2134478e@opensuse.site> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-12/msg00008.html + +Bug-Description: + +Process substitution incorrectly inherited a flag that inhibited using the +(local) temporary environment for variable lookups if it was providing +the filename to a redirection. The intent the flag is to enforce the +Posix command expansion ordering rules. + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -5124,6 +5124,10 @@ process_substitute (string, open_for_rea + dev_fd_list[parent_pipe_fd] = 0; + #endif /* HAVE_DEV_FD */ + ++ /* subshells shouldn't have this flag, which controls using the temporary ++ environment for variable lookups. */ ++ expanding_redir = 0; ++ + result = parse_and_execute (string, "process substitution", (SEVAL_NONINT|SEVAL_NOHIST)); + + #if !defined (HAVE_DEV_FD) +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 40 ++#define PATCHLEVEL 41 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/142-upstream-bash42-042.patch b/utils/bash/patches/142-upstream-bash42-042.patch new file mode 100644 index 000000000..013a41a5c --- /dev/null +++ b/utils/bash/patches/142-upstream-bash42-042.patch @@ -0,0 +1,47 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-042 + +Bug-Reported-by: Adam Pippin +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2012-11/msg00087.html + +Bug-Description: + +Compilation failed after specifying the `--enable-minimal-config' option to +configure (more specifically, specifying `--disable-alias'). + +Patch (apply with `patch -p0'): + +--- a/parse.y ++++ b/parse.y +@@ -2393,6 +2393,7 @@ pop_alias: + is the last character). If it's not the last character, we need + to consume the quoted newline and move to the next character in + the expansion. */ ++#if defined (ALIAS) + if (expanding_alias () && shell_input_line[shell_input_line_index+1] == '\0') + { + uc = 0; +@@ -2403,7 +2404,8 @@ pop_alias: + shell_input_line_index++; /* skip newline */ + goto next_alias_char; /* and get next character */ + } +- else ++ else ++#endif + goto restart_read; + } + +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 41 ++#define PATCHLEVEL 42 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/143-upstream-bash42-043.patch b/utils/bash/patches/143-upstream-bash42-043.patch new file mode 100644 index 000000000..4561a5677 --- /dev/null +++ b/utils/bash/patches/143-upstream-bash42-043.patch @@ -0,0 +1,54 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-043 + +Bug-Reported-by: konsolebox +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2013-01/msg00138.html + +Bug-Description: + +When SIGCHLD is trapped, and a SIGCHLD trap handler runs when a pending +`read -t' invocation times out and generates SIGALRM, bash can crash with +a segmentation fault. + +Patch (apply with `patch -p0'): + +--- a/builtins/read.def ++++ b/builtins/read.def +@@ -385,10 +385,20 @@ read_builtin (list) + { + /* Tricky. The top of the unwind-protect stack is the free of + input_string. We want to run all the rest and use input_string, +- so we have to remove it from the stack. */ +- remove_unwind_protect (); +- run_unwind_frame ("read_builtin"); ++ so we have to save input_string temporarily, run the unwind- ++ protects, then restore input_string so we can use it later. */ ++ + input_string[i] = '\0'; /* make sure it's terminated */ ++ if (i == 0) ++ { ++ t = (char *)xmalloc (1); ++ t[0] = 0; ++ } ++ else ++ t = savestring (input_string); ++ ++ run_unwind_frame ("read_builtin"); ++ input_string = t; + retval = 128+SIGALRM; + goto assign_vars; + } +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 42 ++#define PATCHLEVEL 43 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/144-upstream-bash42-044.patch b/utils/bash/patches/144-upstream-bash42-044.patch new file mode 100644 index 000000000..1284e2492 --- /dev/null +++ b/utils/bash/patches/144-upstream-bash42-044.patch @@ -0,0 +1,58 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-044 + +Bug-Reported-by: "Dashing" +Bug-Reference-ID: <20130211175049.D90786F446@smtp.hushmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2013-02/msg00030.html + +Bug-Description: + +When converting a multibyte string to a wide character string as part of +pattern matching, bash does not handle the end of the string correctly, +causing the search for the NUL to go beyond the end of the string and +reference random memory. Depending on the contents of that memory, bash +can produce errors or crash. + +Patch (apply with `patch -p0'): + +--- a/lib/glob/xmbsrtowcs.c ++++ b/lib/glob/xmbsrtowcs.c +@@ -216,12 +216,24 @@ xdupmbstowcs2 (destp, src) + It may set 'p' to NULL. */ + n = mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state); + ++ if (n == 0 && p == 0) ++ { ++ wsbuf[wcnum] = L'\0'; ++ break; ++ } ++ + /* Compensate for taking single byte on wcs conversion failure above. */ + if (wcslength == 1 && (n == 0 || n == (size_t)-1)) + { + state = tmp_state; + p = tmp_p; +- wsbuf[wcnum++] = *p++; ++ wsbuf[wcnum] = *p; ++ if (*p == 0) ++ break; ++ else ++ { ++ wcnum++; p++; ++ } + } + else + wcnum += wcslength; +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 43 ++#define PATCHLEVEL 44 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/145-upstream-bash42-045.patch b/utils/bash/patches/145-upstream-bash42-045.patch new file mode 100644 index 000000000..674514850 --- /dev/null +++ b/utils/bash/patches/145-upstream-bash42-045.patch @@ -0,0 +1,47 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-045 + +Bug-Reported-by: Stephane Chazelas +Bug-Reference-ID: <20130218195539.GA9620@chaz.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2013-02/msg00080.html + +Bug-Description: + +The <&n- and >&n- redirections, which move one file descriptor to another, +leave the file descriptor closed when applied to builtins or compound +commands. + +Patch (apply with `patch -p0'): + +--- a/redir.c ++++ b/redir.c +@@ -1007,6 +1007,16 @@ do_redirection_internal (redirect, flags + close (redirector); + REDIRECTION_ERROR (r, errno, -1); + } ++ if ((flags & RX_UNDOABLE) && (ri == r_move_input || ri == r_move_output)) ++ { ++ /* r_move_input and r_move_output add an additional close() ++ that needs to be undone */ ++ if (fcntl (redirector, F_GETFD, 0) != -1) ++ { ++ r = add_undo_redirect (redir_fd, r_close_this, -1); ++ REDIRECTION_ERROR (r, errno, -1); ++ } ++ } + #if defined (BUFFERED_INPUT) + check_bash_input (redirector); + #endif +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 44 ++#define PATCHLEVEL 45 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/146-upstream-bash42-046.patch b/utils/bash/patches/146-upstream-bash42-046.patch new file mode 100644 index 000000000..2cf100008 --- /dev/null +++ b/utils/bash/patches/146-upstream-bash42-046.patch @@ -0,0 +1,46 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-046 + +Bug-Reported-by: "Theodoros V. Kalamatianos" +Bug-Reference-ID: <20140112011131.GE17667@infinity.metashade.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-01/msg00044.html + +Bug-Description: + +Bash-4.2 patch 32 introduced a problem with "$@" and arrays expanding empty +positional parameters or array elements when using substring expansion, +pattern substitution, or case modfication. The empty parameters or array +elements are removed instead of expanding to empty strings (""). + +Patch (apply with `patch -p0'): + +--- a/subst.c ++++ b/subst.c +@@ -7242,7 +7242,13 @@ parameter_brace_expand (string, indexp, + + ret = alloc_word_desc (); + ret->word = temp1; +- if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) ++ /* We test quoted_dollar_atp because we want variants with double-quoted ++ "$@" to take a different code path. In fact, we make sure at the end ++ of expand_word_internal that we're only looking at these flags if ++ quoted_dollar_at == 0. */ ++ if (temp1 && ++ (quoted_dollar_atp == 0 || *quoted_dollar_atp == 0) && ++ QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) + ret->flags |= W_QUOTED|W_HASQUOTEDNULL; + return ret; + } +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 45 ++#define PATCHLEVEL 46 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/147-upstream-bash42-047.patch b/utils/bash/patches/147-upstream-bash42-047.patch new file mode 100644 index 000000000..5624f5e4a --- /dev/null +++ b/utils/bash/patches/147-upstream-bash42-047.patch @@ -0,0 +1,40 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-047 + +Bug-Reported-by: Matthew Riley +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2013-03/msg00047.html + +Bug-Description: + +The function that shortens pathnames for $PS1 according to the value of +$PROMPT_DIRTRIM uses memcpy on potentially-overlapping regions of memory, +when it should use memmove. The result is garbled pathnames in prompt +strings. + +Patch (apply with `patch -p0'): + +--- a/general.c ++++ b/general.c +@@ -766,7 +766,7 @@ trim_pathname (name, maxlen) + *nbeg++ = '.'; + + nlen = nend - ntail; +- memcpy (nbeg, ntail, nlen); ++ memmove (nbeg, ntail, nlen); + nbeg[nlen] = '\0'; + + return name; +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 46 ++#define PATCHLEVEL 47 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/148-upstream-bash42-048.patch b/utils/bash/patches/148-upstream-bash42-048.patch new file mode 100644 index 000000000..4a468fb0b --- /dev/null +++ b/utils/bash/patches/148-upstream-bash42-048.patch @@ -0,0 +1,95 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-048 + +Bug-Reported-by: Stephane Chazelas +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +Under certain circumstances, bash will execute user code while processing the +environment for exported function definitions. + +Patch (apply with `patch -p0'): + +--- a/builtins/common.h ++++ b/builtins/common.h +@@ -35,6 +35,8 @@ + #define SEVAL_NOLONGJMP 0x040 + + /* Flags for describe_command, shared between type.def and command.def */ ++#define SEVAL_FUNCDEF 0x080 /* only allow function definitions */ ++#define SEVAL_ONECMD 0x100 /* only allow a single command */ + #define CDESC_ALL 0x001 /* type -a */ + #define CDESC_SHORTDESC 0x002 /* command -V */ + #define CDESC_REUSABLE 0x004 /* command -v */ +--- a/builtins/evalstring.c ++++ b/builtins/evalstring.c +@@ -261,6 +261,14 @@ parse_and_execute (string, from_file, fl + { + struct fd_bitmap *bitmap; + ++ if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def) ++ { ++ internal_warning ("%s: ignoring function definition attempt", from_file); ++ should_jump_to_top_level = 0; ++ last_result = last_command_exit_value = EX_BADUSAGE; ++ break; ++ } ++ + bitmap = new_fd_bitmap (FD_BITMAP_SIZE); + begin_unwind_frame ("pe_dispose"); + add_unwind_protect (dispose_fd_bitmap, bitmap); +@@ -321,6 +329,9 @@ parse_and_execute (string, from_file, fl + dispose_command (command); + dispose_fd_bitmap (bitmap); + discard_unwind_frame ("pe_dispose"); ++ ++ if (flags & SEVAL_ONECMD) ++ break; + } + } + else +--- a/variables.c ++++ b/variables.c +@@ -347,12 +347,10 @@ initialize_shell_variables (env, privmod + temp_string[char_index] = ' '; + strcpy (temp_string + char_index + 1, string); + +- parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST); +- +- /* Ancient backwards compatibility. Old versions of bash exported +- functions like name()=() {...} */ +- if (name[char_index - 1] == ')' && name[char_index - 2] == '(') +- name[char_index - 2] = '\0'; ++ /* Don't import function names that are invalid identifiers from the ++ environment. */ ++ if (legal_identifier (name)) ++ parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD); + + if (temp_var = find_function (name)) + { +@@ -361,10 +359,6 @@ initialize_shell_variables (env, privmod + } + else + report_error (_("error importing function definition for `%s'"), name); +- +- /* ( */ +- if (name[char_index - 1] == ')' && name[char_index - 2] == '\0') +- name[char_index - 2] = '('; /* ) */ + } + #if defined (ARRAY_VARS) + # if 0 +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 47 ++#define PATCHLEVEL 48 + + #endif /* _PATCHLEVEL_H_ */ From b32f0657de694feafe4457dc3aa43bac205fb139 Mon Sep 17 00:00:00 2001 From: Marcel Denia Date: Fri, 26 Sep 2014 00:44:03 +0200 Subject: [PATCH 4/5] bash: Add myself as maintainer, add licensing information Signed-off-by: Marcel Denia --- utils/bash/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utils/bash/Makefile b/utils/bash/Makefile index 86df4b81b..bd4315ddc 100644 --- a/utils/bash/Makefile +++ b/utils/bash/Makefile @@ -15,6 +15,11 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GNU/bash PKG_MD5SUM:=3fb927c7c33022f1c327f14a81c0d4b0 +PKG_LICENSE:=GPL-3.0+ +PKG_LICENSE_FILES:=COPYING +PKG_MAINTAINER:=Marcel Denia + + include $(INCLUDE_DIR)/package.mk define Package/bash From 42b154bf8c13de8e766980add2f164bb92e0df1b Mon Sep 17 00:00:00 2001 From: Marcel Denia Date: Fri, 26 Sep 2014 16:45:46 +0200 Subject: [PATCH 5/5] bash: Update to 4.2.49 Fixes CVE-2014-7169 and CVE-2014-7186. Signed-off-by: Marcel Denia --- .../patches/149-upstream-pre-bash42-049.patch | 54 +++++++ .../bash/patches/200-redhat-parser-oob.patch | 83 ++++++++++ .../patches/201-redhat-variable-affix.patch | 146 ++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 utils/bash/patches/149-upstream-pre-bash42-049.patch create mode 100644 utils/bash/patches/200-redhat-parser-oob.patch create mode 100644 utils/bash/patches/201-redhat-variable-affix.patch diff --git a/utils/bash/patches/149-upstream-pre-bash42-049.patch b/utils/bash/patches/149-upstream-pre-bash42-049.patch new file mode 100644 index 000000000..6c6dba020 --- /dev/null +++ b/utils/bash/patches/149-upstream-pre-bash42-049.patch @@ -0,0 +1,54 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-049 + +Bug-Reported-by: Tavis Ormandy +Bug-Reference-ID: +Bug-Reference-URL: http://twitter.com/taviso/statuses/514887394294652929 + +Bug-Description: + +Under certain circumstances, bash can incorrectly save a lookahead character and +return it on a subsequent call, even when reading a new line. + +Patch (apply with `patch -p0'): + +--- a/parse.y ++++ b/parse.y +@@ -2850,6 +2850,8 @@ reset_parser () + FREE (word_desc_to_read); + word_desc_to_read = (WORD_DESC *)NULL; + ++ eol_ungetc_lookahead = 0; ++ + current_token = '\n'; /* XXX */ + last_read_token = '\n'; + token_to_read = '\n'; +--- a/y.tab.c ++++ b/y.tab.c +@@ -5160,6 +5160,8 @@ reset_parser () + FREE (word_desc_to_read); + word_desc_to_read = (WORD_DESC *)NULL; + ++ eol_ungetc_lookahead = 0; ++ + current_token = '\n'; /* XXX */ + last_read_token = '\n'; + token_to_read = '\n'; +@@ -8321,4 +8323,3 @@ set_line_mbstate () + } + } + #endif /* HANDLE_MULTIBYTE */ +- +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 48 ++#define PATCHLEVEL 49 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/utils/bash/patches/200-redhat-parser-oob.patch b/utils/bash/patches/200-redhat-parser-oob.patch new file mode 100644 index 000000000..c6f3fa0ba --- /dev/null +++ b/utils/bash/patches/200-redhat-parser-oob.patch @@ -0,0 +1,83 @@ +--- a/parse.y ++++ b/parse.y +@@ -264,9 +264,21 @@ int parser_state; + + /* Variables to manage the task of reading here documents, because we need to + defer the reading until after a complete command has been collected. */ +-static REDIRECT *redir_stack[10]; ++static REDIRECT **redir_stack; + int need_here_doc; + ++/* Pushes REDIR onto redir_stack, resizing it as needed. */ ++static void ++push_redir_stack (REDIRECT *redir) ++{ ++ /* Guard against oveflow. */ ++ if (need_here_doc + 1 > INT_MAX / sizeof (*redir_stack)) ++ abort (); ++ redir_stack = xrealloc (redir_stack, ++ (need_here_doc + 1) * sizeof (*redir_stack)); ++ redir_stack[need_here_doc++] = redir; ++} ++ + /* Where shell input comes from. History expansion is performed on each + line when the shell is interactive. */ + static char *shell_input_line = (char *)NULL; +@@ -519,42 +531,42 @@ redirection: '>' WORD + source.dest = 0; + redir.filename = $2; + $$ = make_redirection (source, r_reading_until, redir, 0); +- redir_stack[need_here_doc++] = $$; ++ push_redir_stack ($$); + } + | NUMBER LESS_LESS WORD + { + source.dest = $1; + redir.filename = $3; + $$ = make_redirection (source, r_reading_until, redir, 0); +- redir_stack[need_here_doc++] = $$; ++ push_redir_stack ($$); + } + | REDIR_WORD LESS_LESS WORD + { + source.filename = $1; + redir.filename = $3; + $$ = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN); +- redir_stack[need_here_doc++] = $$; ++ push_redir_stack ($$); + } + | LESS_LESS_MINUS WORD + { + source.dest = 0; + redir.filename = $2; + $$ = make_redirection (source, r_deblank_reading_until, redir, 0); +- redir_stack[need_here_doc++] = $$; ++ push_redir_stack ($$); + } + | NUMBER LESS_LESS_MINUS WORD + { + source.dest = $1; + redir.filename = $3; + $$ = make_redirection (source, r_deblank_reading_until, redir, 0); +- redir_stack[need_here_doc++] = $$; ++ push_redir_stack ($$); + } + | REDIR_WORD LESS_LESS_MINUS WORD + { + source.filename = $1; + redir.filename = $3; + $$ = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN); +- redir_stack[need_here_doc++] = $$; ++ push_redir_stack ($$); + } + | LESS_LESS_LESS WORD + { +@@ -4759,7 +4771,7 @@ got_token: + case CASE: + case SELECT: + case FOR: +- if (word_top < MAX_CASE_NEST) ++ if (word_top + 1 < MAX_CASE_NEST) + word_top++; + word_lineno[word_top] = line_number; + break; diff --git a/utils/bash/patches/201-redhat-variable-affix.patch b/utils/bash/patches/201-redhat-variable-affix.patch new file mode 100644 index 000000000..67c8241d4 --- /dev/null +++ b/utils/bash/patches/201-redhat-variable-affix.patch @@ -0,0 +1,146 @@ +--- a/variables.c ++++ b/variables.c +@@ -268,7 +268,7 @@ static void push_temp_var __P((PTR_T)); + static void propagate_temp_var __P((PTR_T)); + static void dispose_temporary_env __P((sh_free_func_t *)); + +-static inline char *mk_env_string __P((const char *, const char *)); ++static inline char *mk_env_string __P((const char *, const char *, int)); + static char **make_env_array_from_var_list __P((SHELL_VAR **)); + static char **make_var_export_array __P((VAR_CONTEXT *)); + static char **make_func_export_array __P((void)); +@@ -301,6 +301,14 @@ create_variable_tables () + #endif + } + ++/* Prefix and suffix for environment variable names which contain ++ shell functions. */ ++#define FUNCDEF_PREFIX "BASH_FUNC_" ++#define FUNCDEF_PREFIX_LEN (strlen (FUNCDEF_PREFIX)) ++#define FUNCDEF_SUFFIX "()" ++#define FUNCDEF_SUFFIX_LEN (strlen (FUNCDEF_SUFFIX)) ++ ++ + /* Initialize the shell variables from the current environment. + If PRIVMODE is nonzero, don't import functions from ENV or + parse $SHELLOPTS. */ +@@ -338,27 +346,39 @@ initialize_shell_variables (env, privmod + + /* If exported function, define it now. Don't import functions from + the environment in privileged mode. */ +- if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4)) +- { +- string_length = strlen (string); +- temp_string = (char *)xmalloc (3 + string_length + char_index); ++ if (privmode == 0 && read_but_dont_execute == 0 ++ && STREQN (FUNCDEF_PREFIX, name, FUNCDEF_PREFIX_LEN) ++ && STREQ (name + char_index - FUNCDEF_SUFFIX_LEN, FUNCDEF_SUFFIX) ++ && STREQN ("() {", string, 4)) ++ { ++ size_t name_length ++ = char_index - (FUNCDEF_PREFIX_LEN + FUNCDEF_SUFFIX_LEN); ++ char *temp_name = name + FUNCDEF_PREFIX_LEN; ++ /* Temporarily remove the suffix. */ ++ temp_name[name_length] = '\0'; + +- strcpy (temp_string, name); +- temp_string[char_index] = ' '; +- strcpy (temp_string + char_index + 1, string); ++ string_length = strlen (string); ++ temp_string = (char *)xmalloc (name_length + 1 + string_length + 1); ++ memcpy (temp_string, temp_name, name_length); ++ temp_string[name_length] = ' '; ++ memcpy (temp_string + name_length + 1, string, string_length + 1); + + /* Don't import function names that are invalid identifiers from the + environment. */ +- if (legal_identifier (name)) +- parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD); ++ if (legal_identifier (temp_name)) ++ parse_and_execute (temp_string, temp_name, ++ SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD); + +- if (temp_var = find_function (name)) ++ if (temp_var = find_function (temp_name)) + { + VSETATTR (temp_var, (att_exported|att_imported)); + array_needs_making = 1; + } + else + report_error (_("error importing function definition for `%s'"), name); ++ ++ /* Restore the original suffix. */ ++ temp_name[name_length] = FUNCDEF_SUFFIX[0]; + } + #if defined (ARRAY_VARS) + # if 0 +@@ -2537,7 +2557,7 @@ assign_in_env (word, flags) + var->context = variable_context; /* XXX */ + + INVALIDATE_EXPORTSTR (var); +- var->exportstr = mk_env_string (name, value); ++ var->exportstr = mk_env_string (name, value, 0); + + array_needs_making = 1; + +@@ -3388,22 +3408,43 @@ merge_temporary_env () + /* */ + /* **************************************************************** */ + ++/* Returns the string NAME=VALUE if !FUNCTIONP or if VALUE == NULL (in ++ which case it is treated as empty). Otherwise, decorate NAME with ++ FUNCDEF_PREFIX and FUNCDEF_SUFFIX, and return a string of the form ++ FUNCDEF_PREFIX NAME FUNCDEF_SUFFIX = VALUE (without spaces). */ + static inline char * +-mk_env_string (name, value) ++mk_env_string (name, value, functionp) + const char *name, *value; ++ int functionp; + { +- int name_len, value_len; +- char *p; ++ size_t name_len, value_len; ++ char *p, *q; + + name_len = strlen (name); + value_len = STRLEN (value); +- p = (char *)xmalloc (2 + name_len + value_len); +- strcpy (p, name); +- p[name_len] = '='; ++ if (functionp && value != NULL) ++ { ++ p = (char *)xmalloc (FUNCDEF_PREFIX_LEN + name_len + FUNCDEF_SUFFIX_LEN ++ + 1 + value_len + 1); ++ q = p; ++ memcpy (q, FUNCDEF_PREFIX, FUNCDEF_PREFIX_LEN); ++ q += FUNCDEF_PREFIX_LEN; ++ memcpy (q, name, name_len); ++ q += name_len; ++ memcpy (q, FUNCDEF_SUFFIX, FUNCDEF_SUFFIX_LEN); ++ q += FUNCDEF_SUFFIX_LEN; ++ } ++ else ++ { ++ p = (char *)xmalloc (name_len + 1 + value_len + 1); ++ memcpy (p, name, name_len); ++ q = p + name_len; ++ } ++ q[0] = '='; + if (value && *value) +- strcpy (p + name_len + 1, value); ++ memcpy (q + 1, value, value_len + 1); + else +- p[name_len + 1] = '\0'; ++ q[1] = '\0'; + return (p); + } + +@@ -3489,7 +3530,7 @@ make_env_array_from_var_list (vars) + /* Gee, I'd like to get away with not using savestring() if we're + using the cached exportstr... */ + list[list_index] = USE_EXPORTSTR ? savestring (value) +- : mk_env_string (var->name, value); ++ : mk_env_string (var->name, value, function_p (var)); + + if (USE_EXPORTSTR == 0) + SAVE_EXPORTSTR (var, list[list_index]);