diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-08 11:48:42 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-08 11:48:42 +0400 |
commit | 597d7d4d9df6e688e766f1da1c7de92b191fbde9 (patch) | |
tree | e758dd00a56a9039deba2abab755033466bd0cbf /debian/patches | |
download | bash-debian/4.3-11.tar.gz |
Debian bash 4.3-11debian/4.3-11debian
Diffstat (limited to 'debian/patches')
61 files changed, 5921 insertions, 0 deletions
diff --git a/debian/patches/bash-aliases-repeat.diff b/debian/patches/bash-aliases-repeat.diff new file mode 100644 index 0000000..e805473 --- /dev/null +++ b/debian/patches/bash-aliases-repeat.diff @@ -0,0 +1,28 @@ +# DP: Fix bug in Bash_aliases example. + +--- a/examples/startup-files/Bash_aliases ++++ b/examples/startup-files/Bash_aliases +@@ -41,20 +41,20 @@ + { + local count="$1" i; + shift; +- for i in $(seq 1 "$count"); ++ for i in $(_seq 1 "$count"); + do + eval "$@"; + done + } + + # Subfunction needed by `repeat'. +-seq () ++_seq () + { + local lower upper output; + lower=$1 upper=$2; + + if [ $lower -ge $upper ]; then return; fi +- while [ $lower -le $upper ]; ++ while [ $lower -lt $upper ]; + do + echo -n "$lower " + lower=$(($lower + 1)) diff --git a/debian/patches/bash-default-editor.diff b/debian/patches/bash-default-editor.diff new file mode 100644 index 0000000..020fd80 --- /dev/null +++ b/debian/patches/bash-default-editor.diff @@ -0,0 +1,35 @@ +# DP: Use `command -v editor`, as an editor, if available. + +Index: b/bashline.c +=================================================================== +--- a/bashline.c ++++ b/bashline.c +@@ -926,8 +926,8 @@ + command being entered (if no explicit argument is given), otherwise on + a command from the history file. */ + +-#define VI_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-vi}}\"" +-#define EMACS_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-emacs}}\"" ++#define VI_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-$(command -v editor || echo vi)}}\"" ++#define EMACS_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-$(command -v editor || echo emacs)}}\"" + #define POSIX_VI_EDIT_COMMAND "fc -e vi" + + static int +Index: b/builtins/fc.def +=================================================================== +--- a/builtins/fc.def ++++ b/builtins/fc.def +@@ -159,11 +159,11 @@ + #endif + + /* String to execute on a file that we want to edit. */ +-#define FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-vi}}" ++#define FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-$(command -v editor || echo vi)}}" + #if defined (STRICT_POSIX) + # define POSIX_FC_EDIT_COMMAND "${FCEDIT:-ed}" + #else +-# define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-ed}}" ++# define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-$(command -v editor || echo ed)}}" + #endif + + int diff --git a/debian/patches/bash-minimal.dpatch b/debian/patches/bash-minimal.dpatch new file mode 100644 index 0000000..c6b0039 --- /dev/null +++ b/debian/patches/bash-minimal.dpatch @@ -0,0 +1,62 @@ +#! /bin/sh -e + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p1 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p1 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: Build fixes for minimal bash + +--- bash/parse.y~ 2009-11-02 23:34:15.000000000 +0100 ++++ bash/parse.y 2009-12-30 17:08:12.341085169 +0100 +@@ -2772,12 +2772,14 @@ + dstack.delimiter_depth = 0; /* No delimiters found so far. */ + open_brace_count = 0; + ++#if defined (EXTENDED_GLOB) + /* Reset to global value of extended glob */ + if (parser_state & PST_EXTPAT) + { + /*itrace("reset_parser: parser_state includes PST_EXTPAT");*/ + extended_glob = global_extglob; + } ++#endif + + parser_state = 0; + +--- bash/execute_cmd.c~ 2009-11-29 03:29:34.000000000 +0100 ++++ bash/execute_cmd.c 2009-12-30 17:13:36.041085541 +0100 +@@ -4196,7 +4196,9 @@ + if (variable_context == 0 || this_shell_function == 0) + { + make_funcname_visible (0); ++#if defined (PROCESS_SUBSTITUTION) + unlink_fifo_list (); ++#endif + } + + return (result); +--- bash/lib/glob/glob.c~ 2009-11-15 00:39:30.000000000 +0100 ++++ bash/lib/glob/glob.c 2009-12-30 17:34:56.802336552 +0100 +@@ -640,7 +640,11 @@ + continue; + } + ++#ifdef MACOS + convfn = fnx_fromfs (dp->d_name, D_NAMLEN (dp)); ++#else ++ convfn = dp->d_name; ++#endif + if (strmatch (pat, convfn, mflags) != FNM_NOMATCH) + { + if (nalloca < ALLOCA_MAX) diff --git a/debian/patches/bash-subst-param-length.diff b/debian/patches/bash-subst-param-length.diff new file mode 100644 index 0000000..1ba51b6 --- /dev/null +++ b/debian/patches/bash-subst-param-length.diff @@ -0,0 +1,13 @@ +Index: b/subst.c +=================================================================== +--- a/subst.c ++++ b/subst.c +@@ -7160,7 +7160,7 @@ + (sindex == t_index - 1 && string[sindex] == '!' && VALID_INDIR_PARAM (string[t_index]))) + { + t_index++; +- temp1 = string_extract (string, &t_index, "#%:-=?+/}", 0); ++ temp1 = string_extract (string, &t_index, "#%:-=?+/}", SX_VARNAME); + name = (char *)xrealloc (name, 3 + (strlen (temp1))); + *name = string[sindex]; + if (string[sindex] == '!') diff --git a/debian/patches/bash43-001.diff b/debian/patches/bash43-001.diff new file mode 100644 index 0000000..d4de04a --- /dev/null +++ b/debian/patches/bash43-001.diff @@ -0,0 +1,52 @@ +# DP: bash43-001 upstream patch + +Bash-Release: 4.3 +Patch-ID: bash43-001 + +Bug-Reported-by: NBaH <nbah@sfr.fr> +Bug-Reference-ID: <ler0b5$iu9$1@speranza.aioe.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00092.html + +Bug-Description: + +A missing check for a valid option prevented `test -R' from working. There +is another problem that causes bash to look up the wrong variable name when +processing the argument to `test -R'. + +Patch (apply with `patch -p0'): + +Index: b/test.c +=================================================================== +--- a/test.c ++++ b/test.c +@@ -646,8 +646,8 @@ + return (v && invisible_p (v) == 0 && var_isset (v) ? TRUE : FALSE); + + case 'R': +- v = find_variable (arg); +- return (v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v) ? TRUE : FALSE); ++ v = find_variable_noref (arg); ++ return ((v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v)) ? TRUE : FALSE); + } + + /* We can't actually get here, but this shuts up gcc. */ +@@ -723,6 +723,7 @@ + case 'o': case 'p': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'z': + case 'G': case 'L': case 'O': case 'S': case 'N': ++ case 'R': + return (1); + } + +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-002.diff b/debian/patches/bash43-002.diff new file mode 100644 index 0000000..093dd6d --- /dev/null +++ b/debian/patches/bash43-002.diff @@ -0,0 +1,52 @@ +# DP: bash43-002 upstream patch + +Bash-Release: 4.3 +Patch-ID: bash43-002 + +Bug-Reported-by: Moe Tunes <moetunes42@gmail.com> +Bug-Reference-ID: <53103F49.3070100@gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00086.html + +Bug-Description: + +A change to save state while running the DEBUG trap caused pipelines to hang +on systems which need process group synchronization while building pipelines. + +Patch (apply with `patch -p0'): + +Index: b/trap.c +=================================================================== +--- a/trap.c ++++ b/trap.c +@@ -920,7 +920,8 @@ + subst_assign_varlist = 0; + + #if defined (JOB_CONTROL) +- save_pipeline (1); /* XXX only provides one save level */ ++ if (sig != DEBUG_TRAP) /* run_debug_trap does this */ ++ save_pipeline (1); /* XXX only provides one save level */ + #endif + + /* If we're in a function, make sure return longjmps come here, too. */ +@@ -940,7 +941,8 @@ + trap_exit_value = last_command_exit_value; + + #if defined (JOB_CONTROL) +- restore_pipeline (1); ++ if (sig != DEBUG_TRAP) /* run_debug_trap does this */ ++ restore_pipeline (1); + #endif + + subst_assign_varlist = save_subst_varlist; +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-003.diff b/debian/patches/bash43-003.diff new file mode 100644 index 0000000..8b9de8d --- /dev/null +++ b/debian/patches/bash43-003.diff @@ -0,0 +1,42 @@ +# DP: bash43-003 upstream patch + +Bash-Release: 4.3 +Patch-ID: bash43-003 + +Bug-Reported-by: Anatol Pomozov <anatol.pomozov@gmail.com> +Bug-Reference-ID: <CAOMFOmXy3mT2So5GQ5F-smCVArQuAeBwZ2QKzgCtMeXJoDeYOQ@mail.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00010.html + +Bug-Description: + +When in callback mode, some readline commands can cause readline to seg +fault by passing invalid contexts to callback functions. + +Patch (apply with `patch -p0'): + +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/lib/readline/readline.c +=================================================================== +--- a/lib/readline/readline.c ++++ b/lib/readline/readline.c +@@ -744,7 +744,8 @@ + r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); + + RL_CHECK_SIGNALS (); +- if (r == 0) /* success! */ ++ /* We only treat values < 0 specially to simulate recursion. */ ++ if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */ + { + _rl_keyseq_chain_dispose (); + RL_UNSETSTATE (RL_STATE_MULTIKEY); diff --git a/debian/patches/bash43-004.diff b/debian/patches/bash43-004.diff new file mode 100644 index 0000000..f971e7a --- /dev/null +++ b/debian/patches/bash43-004.diff @@ -0,0 +1,41 @@ +# DP: bash43-004 upstream patch + +Bash-Release: 4.3 +Patch-ID: bash43-004 + +Bug-Reported-by: Daan van Rossum <daan@flash.uchicago.edu> +Bug-Reference-ID: <20140307072523.GA14250@flash.uchicago.edu> +Bug-Reference-URL: + +Bug-Description: + +The `.' command in vi mode cannot undo multi-key commands beginning with +`c', `d', and `y' (command plus motion specifier). + +Patch (apply with `patch -p0'): + +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/lib/readline/readline.c +=================================================================== +--- a/lib/readline/readline.c ++++ b/lib/readline/readline.c +@@ -965,7 +965,7 @@ + #if defined (VI_MODE) + if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && + key != ANYOTHERKEY && +- rl_key_sequence_length == 1 && /* XXX */ ++ _rl_dispatching_keymap == vi_movement_keymap && + _rl_vi_textmod_command (key)) + _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); + #endif diff --git a/debian/patches/bash43-005.diff b/debian/patches/bash43-005.diff new file mode 100644 index 0000000..c44060a --- /dev/null +++ b/debian/patches/bash43-005.diff @@ -0,0 +1,55 @@ +# DP: bash43-005 upstream patch + +Bash-Release: 4.3 +Patch-ID: bash43-005 + +Bug-Reported-by: David Sines <dave.gma@googlemail.com> +Bug-Reference-ID: <CAO3BAa_CK_Rgkhdfzs+NJ4KFYdB9qW3pvXQK0xLCi6GMmDU8bw@mail.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00037.html + +Bug-Description: + +When in Posix mode, bash did not correctly interpret the ANSI-C-style +$'...' quoting mechanism when performing pattern substitution word +expansions within double quotes. + +Patch (apply with `patch -p0'): + +Index: b/parse.y +=================================================================== +--- a/parse.y ++++ b/parse.y +@@ -3398,7 +3398,7 @@ + within a double-quoted ${...} construct "an even number of + unescaped double-quotes or single-quotes, if any, shall occur." */ + /* This was changed in Austin Group Interp 221 */ +- if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') ++ if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') + continue; + + /* Could also check open == '`' if we want to parse grouping constructs +Index: b/y.tab.c +=================================================================== +--- a/y.tab.c ++++ b/y.tab.c +@@ -5710,7 +5710,7 @@ + within a double-quoted ${...} construct "an even number of + unescaped double-quotes or single-quotes, if any, shall occur." */ + /* This was changed in Austin Group Interp 221 */ +- if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') ++ if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') + continue; + + /* Could also check open == '`' if we want to parse grouping constructs +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-006.diff b/debian/patches/bash43-006.diff new file mode 100644 index 0000000..f52ccdc --- /dev/null +++ b/debian/patches/bash43-006.diff @@ -0,0 +1,42 @@ +# DP: bash43-006 upstream patch + +Bash-Release: 4.3 +Patch-ID: bash43-006 + +Bug-Reported-by: Eduardo A . Bustamante Lopez <dualbus@gmail.com> +Bug-Reference-ID: <20140228170013.GA16015@dualbus.me> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00091.html + +Bug-Description: + +A shell that started with job control active but was not interactive left +the terminal in the wrong process group when exiting, causing its parent +shell to get a stop signal when it attempted to read from the terminal. + +Patch (apply with `patch -p0'): + +Index: b/jobs.c +=================================================================== +--- a/jobs.c ++++ b/jobs.c +@@ -4374,7 +4374,7 @@ + void + end_job_control () + { +- if (interactive_shell) /* XXX - should it be interactive? */ ++ if (interactive_shell || job_control) /* XXX - should it be just job_control? */ + { + terminate_stopped_jobs (); + +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-007.diff b/debian/patches/bash43-007.diff new file mode 100644 index 0000000..70b420b --- /dev/null +++ b/debian/patches/bash43-007.diff @@ -0,0 +1,48 @@ +# DP: bash43-007 upstream patch + +Bash-Release: 4.3 +Patch-ID: bash43-007 + +Bug-Reported-by: geir.hauge@gmail.com +Bug-Reference-ID: <20140318093650.B181C1C5B0B@gina.itea.ntnu.no> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00095.html + +Bug-Description: + +Using compound assignments for associative arrays like + +assoc=( [x]= [y]=bar ) + +left the value corresponding to the key `x' NULL. This caused subsequent +lookups to interpret it as unset. + +Patch (apply with `patch -p0'): + +Index: b/arrayfunc.c +=================================================================== +--- a/arrayfunc.c ++++ b/arrayfunc.c +@@ -597,6 +597,11 @@ + if (assoc_p (var)) + { + val = expand_assignment_string_to_string (val, 0); ++ if (val == 0) ++ { ++ val = (char *)xmalloc (1); ++ val[0] = '\0'; /* like do_assignment_internal */ ++ } + free_val = 1; + } + +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-008.diff b/debian/patches/bash43-008.diff new file mode 100644 index 0000000..d902c27 --- /dev/null +++ b/debian/patches/bash43-008.diff @@ -0,0 +1,153 @@ +# DP: bash43-008 upstream patch + +Bash-Release: 4.3 +Patch-ID: bash43-008 + +Bug-Reported-by: Stephane Chazelas <stephane.chazelas@gmail.com> +Bug-Reference-ID: <20140318135901.GB22158@chaz.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00098.html + +Bug-Description: + +Some extended glob patterns incorrectly matched filenames with a leading +dot, regardless of the setting of the `dotglob' option. + +Patch (apply with `patch -p0'): + +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/lib/glob/glob.c +=================================================================== +--- a/lib/glob/glob.c ++++ b/lib/glob/glob.c +@@ -179,42 +179,50 @@ + char *pat, *dname; + int flags; + { +- char *pp, *pe, *t; +- int n, r; ++ char *pp, *pe, *t, *se; ++ int n, r, negate; + ++ negate = *pat == '!'; + pp = pat + 2; +- pe = pp + strlen (pp) - 1; /*(*/ +- if (*pe != ')') +- return 0; +- if ((t = strchr (pp, '|')) == 0) /* easy case first */ ++ se = pp + strlen (pp) - 1; /* end of string */ ++ pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */ ++ /* we should check for invalid extglob pattern here */ ++ /* if pe != se we have more of the pattern at the end of the extglob ++ pattern. Check the easy case first ( */ ++ if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0) + { + *pe = '\0'; ++#if defined (HANDLE_MULTIBYTE) ++ r = mbskipname (pp, dname, flags); ++#else + r = skipname (pp, dname, flags); /*(*/ ++#endif + *pe = ')'; + return r; + } ++ ++ /* check every subpattern */ + while (t = glob_patscan (pp, pe, '|')) + { + n = t[-1]; + t[-1] = '\0'; ++#if defined (HANDLE_MULTIBYTE) ++ r = mbskipname (pp, dname, flags); ++#else + r = skipname (pp, dname, flags); ++#endif + t[-1] = n; + if (r == 0) /* if any pattern says not skip, we don't skip */ + return r; + pp = t; + } /*(*/ + +- if (pp == pe) /* glob_patscan might find end of pattern */ ++ /* glob_patscan might find end of pattern */ ++ if (pp == se) + return r; + +- *pe = '\0'; +-# if defined (HANDLE_MULTIBYTE) +- r = mbskipname (pp, dname, flags); /*(*/ +-# else +- r = skipname (pp, dname, flags); /*(*/ +-# endif +- *pe = ')'; +- return r; ++ /* but if it doesn't then we didn't match a leading dot */ ++ return 0; + } + #endif + +@@ -277,20 +285,23 @@ + int flags; + { + #if EXTENDED_GLOB +- wchar_t *pp, *pe, *t, n; +- int r; ++ wchar_t *pp, *pe, *t, n, *se; ++ int r, negate; + ++ negate = *pat == L'!'; + pp = pat + 2; +- pe = pp + wcslen (pp) - 1; /*(*/ +- if (*pe != L')') +- return 0; +- if ((t = wcschr (pp, L'|')) == 0) ++ se = pp + wcslen (pp) - 1; /*(*/ ++ pe = glob_patscan_wc (pp, se, 0); ++ ++ if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0) + { + *pe = L'\0'; + r = wchkname (pp, dname); /*(*/ + *pe = L')'; + return r; + } ++ ++ /* check every subpattern */ + while (t = glob_patscan_wc (pp, pe, '|')) + { + n = t[-1]; +@@ -305,10 +316,8 @@ + if (pp == pe) /* glob_patscan_wc might find end of pattern */ + return r; + +- *pe = L'\0'; +- r = wchkname (pp, dname); /*(*/ +- *pe = L')'; +- return r; ++ /* but if it doesn't then we didn't match a leading dot */ ++ return 0; + #else + return (wchkname (pat, dname)); + #endif +Index: b/lib/glob/gmisc.c +=================================================================== +--- a/lib/glob/gmisc.c ++++ b/lib/glob/gmisc.c +@@ -210,6 +210,7 @@ + case '+': + case '!': + case '@': ++ case '?': + return (pat[1] == LPAREN); + default: + return 0; diff --git a/debian/patches/bash43-009.diff b/debian/patches/bash43-009.diff new file mode 100644 index 0000000..00477c0 --- /dev/null +++ b/debian/patches/bash43-009.diff @@ -0,0 +1,55 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-009 + +Bug-Reported-by: Matthias Klose <doko@debian.org> +Bug-Reference-ID: <53346FC8.6090005@debian.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00171.html + +Bug-Description: + +There is a problem with unsigned sign extension when attempting to reallocate +the input line when it is fewer than 3 characters long and there has been a +history expansion. The sign extension causes the shell to not reallocate the +line, which results in a segmentation fault when it writes past the end. + +Index: b/parse.y +=================================================================== +--- a/parse.y ++++ b/parse.y +@@ -2424,7 +2424,7 @@ + not already end in an EOF character. */ + if (shell_input_line_terminator != EOF) + { +- if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3) ++ if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size)) + shell_input_line = (char *)xrealloc (shell_input_line, + 1 + (shell_input_line_size += 2)); + +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/y.tab.c +=================================================================== +--- a/y.tab.c ++++ b/y.tab.c +@@ -4736,7 +4736,7 @@ + not already end in an EOF character. */ + if (shell_input_line_terminator != EOF) + { +- if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3) ++ if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size)) + shell_input_line = (char *)xrealloc (shell_input_line, + 1 + (shell_input_line_size += 2)); + diff --git a/debian/patches/bash43-010.diff b/debian/patches/bash43-010.diff new file mode 100644 index 0000000..67a5bbf --- /dev/null +++ b/debian/patches/bash43-010.diff @@ -0,0 +1,153 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-010 + +Bug-Reported-by: Albert Shih <Albert.Shih@obspm.fr> +Bug-Reference-ID: Wed, 5 Mar 2014 23:01:40 +0100 +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00028.html + +Bug-Description: + +Patch (apply with `patch -p0'): + +This patch changes the behavior of programmable completion to compensate +for two assumptions made by the bash-completion package. Bash-4.3 changed +to dequote the argument to programmable completion only under certain +circumstances, to make the behavior of compgen more consistent when run +from the command line -- closer to the behavior when run by a shell function +run as part of programmable completion. Bash-completion can pass quoted +arguments to compgen when the original word to be completed was not quoted, +expecting programmable completion to dequote the word before attempting +completion. + +This patch fixes two cases: + +1. An empty string that bash-completion passes to compgen as a quoted null + string (''). + +2. An unquoted word that bash-completion quotes using single quotes or + backslashes before passing it to compgen. + +In these cases, since readline did not detect a quote character in the original +word to be completed, bash-4.3 + +Index: b/externs.h +=================================================================== +--- a/externs.h ++++ b/externs.h +@@ -324,6 +324,7 @@ + extern char *sh_backslash_quote __P((char *, const char *, int)); + extern char *sh_backslash_quote_for_double_quotes __P((char *)); + extern int sh_contains_shell_metas __P((char *)); ++extern int sh_contains_quotes __P((char *)); + + /* declarations for functions defined in lib/sh/spell.c */ + extern int spname __P((char *, char *)); +Index: b/lib/sh/shquote.c +=================================================================== +--- a/lib/sh/shquote.c ++++ b/lib/sh/shquote.c +@@ -311,3 +311,17 @@ + + return (0); + } ++ ++int ++sh_contains_quotes (string) ++ char *string; ++{ ++ char *s; ++ ++ for (s = string; s && *s; s++) ++ { ++ if (*s == '\'' || *s == '"' || *s == '\\') ++ return 1; ++ } ++ return 0; ++} +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/pcomplete.c +=================================================================== +--- a/pcomplete.c ++++ b/pcomplete.c +@@ -183,6 +183,7 @@ + + COMPSPEC *pcomp_curcs; + const char *pcomp_curcmd; ++const char *pcomp_curtxt; + + #ifdef DEBUG + /* Debugging code */ +@@ -753,6 +754,32 @@ + quoted strings. */ + dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); + } ++ /* Intended to solve a mismatched assumption by bash-completion. If ++ the text to be completed is empty, but bash-completion turns it into ++ a quoted string ('') assuming that this code will dequote it before ++ calling readline, do the dequoting. */ ++ else if (iscompgen && iscompleting && ++ pcomp_curtxt && *pcomp_curtxt == 0 && ++ text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 && ++ rl_filename_dequoting_function) ++ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); ++ /* Another mismatched assumption by bash-completion. If compgen is being ++ run as part of bash-completion, and the argument to compgen is not ++ the same as the word originally passed to the programmable completion ++ code, dequote the argument if it has quote characters. It's an ++ attempt to detect when bash-completion is quoting its filename ++ argument before calling compgen. */ ++ /* We could check whether gen_shell_function_matches is in the call ++ stack by checking whether the gen-shell-function-matches tag is in ++ the unwind-protect stack, but there's no function to do that yet. ++ We could simply check whether we're executing in a function by ++ checking variable_context, and may end up doing that. */ ++ else if (iscompgen && iscompleting && rl_filename_dequoting_function && ++ pcomp_curtxt && text && ++ STREQ (pcomp_curtxt, text) == 0 && ++ variable_context && ++ sh_contains_quotes (text)) /* guess */ ++ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); + else + dfn = savestring (text); + } +@@ -1522,7 +1549,7 @@ + COMPSPEC **lastcs; + { + COMPSPEC *cs, *oldcs; +- const char *oldcmd; ++ const char *oldcmd, *oldtxt; + STRINGLIST *ret; + + cs = progcomp_search (ocmd); +@@ -1545,14 +1572,17 @@ + + oldcs = pcomp_curcs; + oldcmd = pcomp_curcmd; ++ oldtxt = pcomp_curtxt; + + pcomp_curcs = cs; + pcomp_curcmd = cmd; ++ pcomp_curtxt = word; + + ret = gen_compspec_completions (cs, cmd, word, start, end, foundp); + + pcomp_curcs = oldcs; + pcomp_curcmd = oldcmd; ++ pcomp_curtxt = oldtxt; + + /* We need to conditionally handle setting *retryp here */ + if (retryp) diff --git a/debian/patches/bash43-011.diff b/debian/patches/bash43-011.diff new file mode 100644 index 0000000..cc61449 --- /dev/null +++ b/debian/patches/bash43-011.diff @@ -0,0 +1,42 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-011 + +Bug-Reported-by: Egmont Koblinger <egmont@gmail.com> +Bug-Reference-ID: <CAGWcZk+bU5Jo1M+tutGvL-250UBE9DXjpeJVofYJSFcqFEVfMg@mail.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00153.html + +Bug-Description: + +The signal handling changes to bash and readline (to avoid running any code +in a signal handler context) cause the cursor to be placed on the wrong +line of a multi-line command after a ^C interrupts editing. + +Index: b/lib/readline/display.c +=================================================================== +--- a/lib/readline/display.c ++++ b/lib/readline/display.c +@@ -2677,7 +2677,8 @@ + { + if (_rl_echoing_p) + { +- _rl_move_vert (_rl_vis_botlin); ++ if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */ ++ _rl_move_vert (_rl_vis_botlin); + _rl_vis_botlin = 0; + fflush (rl_outstream); + rl_restart_output (1, 0); +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-012.diff b/debian/patches/bash43-012.diff new file mode 100644 index 0000000..caaaf45 --- /dev/null +++ b/debian/patches/bash43-012.diff @@ -0,0 +1,44 @@ +# DP: bash43-012 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-012 + +Bug-Reported-by: Eduardo A. Bustamante López<dualbus@gmail.com> +Bug-Reference-ID: <5346B54C.4070205@case.edu> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00051.html + +Bug-Description: + +When a SIGCHLD trap runs a command containing a shell builtin while +a script is running `wait' to wait for all running children to complete, +the SIGCHLD trap will not be run once for each child that terminates. + +Patch (apply with `patch -p0'): + +Index: b/jobs.c +=================================================================== +--- a/jobs.c ++++ b/jobs.c +@@ -3597,6 +3597,7 @@ run_sigchld_trap (nchild) + unwind_protect_int (jobs_list_frozen); + unwind_protect_pointer (the_pipeline); + unwind_protect_pointer (subst_assign_varlist); ++ unwind_protect_pointer (this_shell_builtin); + + /* We have to add the commands this way because they will be run + in reverse order of adding. We don't want maybe_set_sigchld_trap () +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-013.diff b/debian/patches/bash43-013.diff new file mode 100644 index 0000000..2d31e2e --- /dev/null +++ b/debian/patches/bash43-013.diff @@ -0,0 +1,58 @@ +# DP: bash43-013 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-013 + +Bug-Reported-by: <Trond.Endrestol@ximalas.info> +Bug-Reference-ID: <alpine.BSF.2.03.1404192114310.1973@enterprise.ximalas.info> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00069.html + +Bug-Description: + +Using reverse-i-search when horizontal scrolling is enabled does not redisplay +the entire line containing the successful search results. + +Patch (apply with `patch -p0'): +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/lib/readline/display.c +=================================================================== +--- a/lib/readline/display.c ++++ b/lib/readline/display.c +@@ -1637,7 +1637,7 @@ update_line (old, new, current_line, oma + /* If we are changing the number of invisible characters in a line, and + the spot of first difference is before the end of the invisible chars, + lendiff needs to be adjusted. */ +- if (current_line == 0 && !_rl_horizontal_scroll_mode && ++ if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */ + current_invis_chars != visible_wrap_offset) + { + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +@@ -1825,8 +1825,13 @@ update_line (old, new, current_line, oma + else + _rl_last_c_pos += bytes_to_insert; + ++ /* XXX - we only want to do this if we are at the end of the line ++ so we move there with _rl_move_cursor_relative */ + if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new))) +- goto clear_rest_of_line; ++ { ++ _rl_move_cursor_relative (ne-new, new); ++ goto clear_rest_of_line; ++ } + } + } + /* Otherwise, print over the existing material. */ diff --git a/debian/patches/bash43-014.diff b/debian/patches/bash43-014.diff new file mode 100644 index 0000000..05b3e04 --- /dev/null +++ b/debian/patches/bash43-014.diff @@ -0,0 +1,101 @@ +# DP: bash43-014 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-014 + +Bug-Reported-by: Greg Wooledge <wooledg@eeg.ccf.org> +Bug-Reference-ID: <20140418202123.GB7660@eeg.ccf.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/help-bash/2014-04/msg00004.html + +Bug-Description: + +Under certain circumstances, $@ is expanded incorrectly in contexts where +word splitting is not performed. + +Patch (apply with `patch -p0'): +Index: b/subst.c +=================================================================== +--- a/subst.c ++++ b/subst.c +@@ -3248,8 +3248,10 @@ cond_expand_word (w, special) + if (w->word == 0 || w->word[0] == '\0') + return ((char *)NULL); + ++ expand_no_split_dollar_star = 1; + w->flags |= W_NOSPLIT2; + l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0); ++ expand_no_split_dollar_star = 0; + if (l) + { + if (special == 0) /* LHS */ +@@ -7847,6 +7849,10 @@ param_expand (string, sindex, quoted, ex + We also want to make sure that splitting is done no matter what -- + according to POSIX.2, this expands to a list of the positional + parameters no matter what IFS is set to. */ ++ /* XXX - what to do when in a context where word splitting is not ++ performed? Even when IFS is not the default, posix seems to imply ++ that we behave like unquoted $* ? Maybe we should use PF_NOSPLIT2 ++ here. */ + temp = string_list_dollar_at (list, (pflags & PF_ASSIGNRHS) ? (quoted|Q_DOUBLE_QUOTES) : quoted); + + tflag |= W_DOLLARAT; +@@ -8816,6 +8822,7 @@ finished_with_string: + else + { + char *ifs_chars; ++ char *tstring; + + ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL; + +@@ -8830,11 +8837,36 @@ finished_with_string: + regardless of what else has happened to IFS since the expansion. */ + if (split_on_spaces) + list = list_string (istring, " ", 1); /* XXX quoted == 1? */ ++ /* If we have $@ (has_dollar_at != 0) and we are in a context where we ++ don't want to split the result (W_NOSPLIT2), and we are not quoted, ++ we have already separated the arguments with the first character of ++ $IFS. In this case, we want to return a list with a single word ++ with the separator possibly replaced with a space (it's what other ++ shells seem to do). ++ quoted_dollar_at is internal to this function and is set if we are ++ passed an argument that is unquoted (quoted == 0) but we encounter a ++ double-quoted $@ while expanding it. */ ++ else if (has_dollar_at && quoted_dollar_at == 0 && ifs_chars && quoted == 0 && (word->flags & W_NOSPLIT2)) ++ { ++ /* Only split and rejoin if we have to */ ++ if (*ifs_chars && *ifs_chars != ' ') ++ { ++ list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1); ++ tstring = string_list (list); ++ } ++ else ++ tstring = istring; ++ tword = make_bare_word (tstring); ++ if (tstring != istring) ++ free (tstring); ++ goto set_word_flags; ++ } + else if (has_dollar_at && ifs_chars) + list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1); + else + { + tword = make_bare_word (istring); ++set_word_flags: + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED)) + tword->flags |= W_QUOTED; + if (word->flags & W_ASSIGNMENT) +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-015.diff b/debian/patches/bash43-015.diff new file mode 100644 index 0000000..3995eb8 --- /dev/null +++ b/debian/patches/bash43-015.diff @@ -0,0 +1,54 @@ +# DP: bash43-015 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-015 + +Bug-Reported-by: Clark Wang <dearvoid@gmail.com> +Bug-Reference-ID: <CADv8-og2TOSoabXeNVXVGaXN3tEMHnYVq1rwOLe5meaRPSGRig@mail.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00095.html + +Bug-Description: + +When completing directory names, the directory name is dequoted twice. +This causes problems for directories with single and double quotes in +their names. + +Patch (apply with `patch -p0'): +Index: b/bashline.c +=================================================================== +--- a/bashline.c ++++ b/bashline.c +@@ -4167,9 +4167,16 @@ bash_directory_completion_matches (text) + int qc; + + qc = rl_dispatching ? rl_completion_quote_character : 0; +- dfn = bash_dequote_filename ((char *)text, qc); ++ /* If rl_completion_found_quote != 0, rl_completion_matches will call the ++ filename dequoting function, causing the directory name to be dequoted ++ twice. */ ++ if (rl_dispatching && rl_completion_found_quote == 0) ++ dfn = bash_dequote_filename ((char *)text, qc); ++ else ++ dfn = (char *)text; + m1 = rl_completion_matches (dfn, rl_filename_completion_function); +- free (dfn); ++ if (dfn != text) ++ free (dfn); + + if (m1 == 0 || m1[0] == 0) + return m1; +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-016.diff b/debian/patches/bash43-016.diff new file mode 100644 index 0000000..bcb7610 --- /dev/null +++ b/debian/patches/bash43-016.diff @@ -0,0 +1,129 @@ +# DP: bash43-016 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-016 + +Bug-Reported-by: Pierre Gaston <pierre.gaston@gmail.com> +Bug-Reference-ID: <CAPSX3sTCD61k1VQLJ5r-LWzEt+e7Xc-fxXmwn2u8EA5gJJej8Q@mail.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00100.html + +Bug-Description: + +An extended glob pattern containing a slash (`/') causes the globbing code +to misinterpret it as a directory separator. + +Patch (apply with `patch -p0'): +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/lib/glob/glob.c +=================================================================== +--- a/lib/glob/glob.c ++++ b/lib/glob/glob.c +@@ -123,6 +123,8 @@ static char **glob_dir_to_array __P((cha + extern char *glob_patscan __P((char *, char *, int)); + extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int)); + ++extern char *glob_dirscan __P((char *, int)); ++ + /* Compile `glob_loop.c' for single-byte characters. */ + #define CHAR unsigned char + #define INT int +@@ -187,6 +189,9 @@ extglob_skipname (pat, dname, flags) + se = pp + strlen (pp) - 1; /* end of string */ + pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */ + /* we should check for invalid extglob pattern here */ ++ if (pe == 0) ++ return 0; ++ + /* if pe != se we have more of the pattern at the end of the extglob + pattern. Check the easy case first ( */ + if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0) +@@ -1015,7 +1020,7 @@ glob_filename (pathname, flags) + { + char **result; + unsigned int result_size; +- char *directory_name, *filename, *dname; ++ char *directory_name, *filename, *dname, *fn; + unsigned int directory_len; + int free_dirname; /* flag */ + int dflags; +@@ -1031,6 +1036,18 @@ glob_filename (pathname, flags) + + /* Find the filename. */ + filename = strrchr (pathname, '/'); ++#if defined (EXTENDED_GLOB) ++ if (filename && extended_glob) ++ { ++ fn = glob_dirscan (pathname, '/'); ++#if DEBUG_MATCHING ++ if (fn != filename) ++ fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename); ++#endif ++ filename = fn; ++ } ++#endif ++ + if (filename == NULL) + { + filename = pathname; +Index: b/lib/glob/gmisc.c +=================================================================== +--- a/lib/glob/gmisc.c ++++ b/lib/glob/gmisc.c +@@ -42,6 +42,8 @@ + #define WLPAREN L'(' + #define WRPAREN L')' + ++extern char *glob_patscan __P((char *, char *, int)); ++ + /* Return 1 of the first character of WSTRING could match the first + character of pattern WPAT. Wide character version. */ + int +@@ -375,3 +377,34 @@ bad_bracket: + + return matlen; + } ++ ++/* Skip characters in PAT and return the final occurrence of DIRSEP. This ++ is only called when extended_glob is set, so we have to skip over extglob ++ patterns x(...) */ ++char * ++glob_dirscan (pat, dirsep) ++ char *pat; ++ int dirsep; ++{ ++ char *p, *d, *pe, *se; ++ ++ d = pe = se = 0; ++ for (p = pat; p && *p; p++) ++ { ++ if (extglob_pattern_p (p)) ++ { ++ if (se == 0) ++ se = p + strlen (p) - 1; ++ pe = glob_patscan (p + 2, se, 0); ++ if (pe == 0) ++ continue; ++ else if (*pe == 0) ++ break; ++ p = pe - 1; /* will do increment above */ ++ continue; ++ } ++ if (*p == dirsep) ++ d = p; ++ } ++ return d; ++} diff --git a/debian/patches/bash43-017.diff b/debian/patches/bash43-017.diff new file mode 100644 index 0000000..7b17f9e --- /dev/null +++ b/debian/patches/bash43-017.diff @@ -0,0 +1,47 @@ +# DP: bash43-017 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-017 + +Bug-Reported-by: Dan Douglas <ormaaj@gmail.com> +Bug-Reference-ID: <7781746.RhfoTROLxF@smorgbox> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00026.html + +Bug-Description: + +The code that creates local variables should not clear the `invisible' +attribute when returning an existing local variable. Let the code that +actually assigns a value clear it. + +Patch (apply with `patch -p0'): +Index: b/variables.c +=================================================================== +--- a/variables.c ++++ b/variables.c +@@ -2197,10 +2197,7 @@ make_local_variable (name) + /* local foo; local foo; is a no-op. */ + old_var = find_variable (name); + if (old_var && local_p (old_var) && old_var->context == variable_context) +- { +- VUNSETATTR (old_var, att_invisible); /* XXX */ +- return (old_var); +- } ++ return (old_var); + + was_tmpvar = old_var && tempvar_p (old_var); + /* If we're making a local variable in a shell function, the temporary env +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-018.diff b/debian/patches/bash43-018.diff new file mode 100644 index 0000000..b570f94 --- /dev/null +++ b/debian/patches/bash43-018.diff @@ -0,0 +1,44 @@ +# DP: bash43-018 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-018 + +Bug-Reported-by: Geir Hauge <geir.hauge@gmail.com> +Bug-Reference-ID: <CAO-BiTLOvfPXDypg61jcBausADrxUKJejakV2WTWP26cW0=rgA@mail.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00040.html + +Bug-Description: + +When assigning an array variable using the compound assignment syntax, +but using `declare' with the rhs of the compound assignment quoted, the +shell did not mark the variable as visible after successfully performing +the assignment. + +Patch (apply with `patch -p0'): +Index: b/arrayfunc.c +=================================================================== +--- a/arrayfunc.c ++++ b/arrayfunc.c +@@ -179,6 +179,7 @@ bind_array_var_internal (entry, ind, key + array_insert (array_cell (entry), ind, newval); + FREE (newval); + ++ VUNSETATTR (entry, att_invisible); /* no longer invisible */ + return (entry); + } + +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-019.diff b/debian/patches/bash43-019.diff new file mode 100644 index 0000000..333a174 --- /dev/null +++ b/debian/patches/bash43-019.diff @@ -0,0 +1,83 @@ +# DP: bash43-019 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-019 + +Bug-Reported-by: John Lenton +Bug-Reference-ID: +Bug-Reference-URL: https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1317476 + +Bug-Description: + +The -t timeout option to `read' does not work when the -e option is used. + +Patch (apply with `patch -p0'): + +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/builtins/read.def +=================================================================== +--- a/builtins/read.def ++++ b/builtins/read.def +@@ -442,7 +442,10 @@ read_builtin (list) + add_unwind_protect (reset_alarm, (char *)NULL); + #if defined (READLINE) + if (edit) +- add_unwind_protect (reset_attempted_completion_function, (char *)NULL); ++ { ++ add_unwind_protect (reset_attempted_completion_function, (char *)NULL); ++ add_unwind_protect (bashline_reset_event_hook, (char *)NULL); ++ } + #endif + falarm (tmsec, tmusec); + } +@@ -1021,6 +1024,7 @@ edit_line (p, itext) + + old_attempted_completion_function = rl_attempted_completion_function; + rl_attempted_completion_function = (rl_completion_func_t *)NULL; ++ bashline_set_event_hook (); + if (itext) + { + old_startup_hook = rl_startup_hook; +@@ -1032,6 +1036,7 @@ edit_line (p, itext) + + rl_attempted_completion_function = old_attempted_completion_function; + old_attempted_completion_function = (rl_completion_func_t *)NULL; ++ bashline_reset_event_hook (); + + if (ret == 0) + return ret; +Index: b/lib/readline/input.c +=================================================================== +--- a/lib/readline/input.c ++++ b/lib/readline/input.c +@@ -534,8 +534,16 @@ rl_getc (stream) + return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); + else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM) + return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); ++ /* keyboard-generated signals of interest */ + else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT) + RL_CHECK_SIGNALS (); ++ /* non-keyboard-generated signals of interest */ ++ else if (_rl_caught_signal == SIGALRM ++#if defined (SIGVTALRM) ++ || _rl_caught_signal == SIGVTALRM ++#endif ++ ) ++ RL_CHECK_SIGNALS (); + + if (rl_signal_event_hook) + (*rl_signal_event_hook) (); diff --git a/debian/patches/bash43-020.diff b/debian/patches/bash43-020.diff new file mode 100644 index 0000000..4a298ea --- /dev/null +++ b/debian/patches/bash43-020.diff @@ -0,0 +1,103 @@ +# DP: bash43-020 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-020 + +Bug-Reported-by: Jared Yanovich <slovichon@gmail.com> +Bug-Reference-ID: <20140417073654.GB26875@nightderanger.psc.edu> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00065.html + +Bug-Description: + +When PS2 contains a command substitution, here-documents entered in an +interactive shell can sometimes cause a segmentation fault. + +Patch (apply with `patch -p0'): + +Index: b/shell.h +=================================================================== +--- a/shell.h ++++ b/shell.h +@@ -168,7 +168,8 @@ typedef struct _sh_parser_state_t { + /* flags state affecting the parser */ + int expand_aliases; + int echo_input_at_read; +- ++ int need_here_doc; ++ + } sh_parser_state_t; + + typedef struct _sh_input_line_state_t { +Index: b/parse.y +=================================================================== +--- a/parse.y ++++ b/parse.y +@@ -2642,7 +2642,7 @@ gather_here_documents () + int r; + + r = 0; +- while (need_here_doc) ++ while (need_here_doc > 0) + { + parser_state |= PST_HEREDOC; + make_here_document (redir_stack[r++], line_number); +@@ -6075,6 +6075,7 @@ save_parser_state (ps) + + ps->expand_aliases = expand_aliases; + ps->echo_input_at_read = echo_input_at_read; ++ ps->need_here_doc = need_here_doc; + + ps->token = token; + ps->token_buffer_size = token_buffer_size; +@@ -6123,6 +6124,7 @@ restore_parser_state (ps) + + expand_aliases = ps->expand_aliases; + echo_input_at_read = ps->echo_input_at_read; ++ need_here_doc = ps->need_here_doc; + + FREE (token); + token = ps->token; +Index: b/y.tab.c +=================================================================== +--- a/y.tab.c ++++ b/y.tab.c +@@ -4954,7 +4954,7 @@ gather_here_documents () + int r; + + r = 0; +- while (need_here_doc) ++ while (need_here_doc > 0) + { + parser_state |= PST_HEREDOC; + make_here_document (redir_stack[r++], line_number); +@@ -8387,6 +8387,7 @@ save_parser_state (ps) + + ps->expand_aliases = expand_aliases; + ps->echo_input_at_read = echo_input_at_read; ++ ps->need_here_doc = need_here_doc; + + ps->token = token; + ps->token_buffer_size = token_buffer_size; +@@ -8435,6 +8436,7 @@ restore_parser_state (ps) + + expand_aliases = ps->expand_aliases; + echo_input_at_read = ps->echo_input_at_read; ++ need_here_doc = ps->need_here_doc; + + FREE (token); + token = ps->token; +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-021.diff b/debian/patches/bash43-021.diff new file mode 100644 index 0000000..8677b05 --- /dev/null +++ b/debian/patches/bash43-021.diff @@ -0,0 +1,52 @@ +# DP: bash43-021 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-021 + +Bug-Reported-by: Jared Yanovich <slovichon@gmail.com> +Bug-Reference-ID: <20140625225019.GJ17044@nightderanger.psc.edu> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00070.html + +Bug-Description: + +When the readline `revert-all-at-newline' option is set, pressing newline +when the current line is one retrieved from history results in a double free +and a segmentation fault. + +Patch (apply with `patch -p0'): + +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/lib/readline/misc.c +=================================================================== +--- a/lib/readline/misc.c ++++ b/lib/readline/misc.c +@@ -461,6 +461,7 @@ _rl_revert_all_lines () + saved_undo_list = 0; + /* Set up rl_line_buffer and other variables from history entry */ + rl_replace_from_history (entry, 0); /* entry->line is now current */ ++ entry->data = 0; /* entry->data is now current undo list */ + /* Undo all changes to this history entry */ + while (rl_undo_list) + rl_do_undo (); +@@ -468,7 +469,6 @@ _rl_revert_all_lines () + the timestamp. */ + FREE (entry->line); + entry->line = savestring (rl_line_buffer); +- entry->data = 0; + } + entry = previous_history (); + } diff --git a/debian/patches/bash43-022.diff b/debian/patches/bash43-022.diff new file mode 100644 index 0000000..f796c39 --- /dev/null +++ b/debian/patches/bash43-022.diff @@ -0,0 +1,53 @@ +# DP: bash43-022 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-022 + +Bug-Reported-by: scorp.dev.null@gmail.com +Bug-Reference-ID: <E1WxXw8-0007iE-Bi@pcm14> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00061.html + +Bug-Description: + +Using nested pipelines within loops with the `lastpipe' option set can result +in a segmentation fault. + +Patch (apply with `patch -p0'): + +Index: b/execute_cmd.c +=================================================================== +--- a/execute_cmd.c ++++ b/execute_cmd.c +@@ -2409,7 +2409,16 @@ execute_pipeline (command, asynchronous, + #endif + lstdin = wait_for (lastpid); + #if defined (JOB_CONTROL) +- exec_result = job_exit_status (lastpipe_jid); ++ /* If wait_for removes the job from the jobs table, use result of last ++ command as pipeline's exit status as usual. The jobs list can get ++ frozen and unfrozen at inconvenient times if there are multiple pipelines ++ running simultaneously. */ ++ if (INVALID_JOB (lastpipe_jid) == 0) ++ exec_result = job_exit_status (lastpipe_jid); ++ else if (pipefail_opt) ++ exec_result = exec_result | lstdin; /* XXX */ ++ /* otherwise we use exec_result */ ++ + #endif + unfreeze_jobs_list (); + } +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-023.diff b/debian/patches/bash43-023.diff new file mode 100644 index 0000000..20a9999 --- /dev/null +++ b/debian/patches/bash43-023.diff @@ -0,0 +1,86 @@ +# DP: bash43-023 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-023 + +Bug-Reported-by: Tim Friske <me@timfriske.com> +Bug-Reference-ID: <CAM1RzOcOR9zzC2i+aeES6LtbHNHoOV+0pZEYPrqxv_QAii-RXA@mail.gmail.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00056.html + +Bug-Description: + +Bash does not correctly parse process substitution constructs that contain +unbalanced parentheses as part of the contained command. + +Patch (apply with `patch -p0'): + +Index: b/subst.h +=================================================================== +--- a/subst.h ++++ b/subst.h +@@ -82,7 +82,7 @@ extern char *extract_arithmetic_subst __ + /* Extract the <( or >( construct in STRING, and return a new string. + Start extracting at (SINDEX) as if we had just seen "<(". + Make (SINDEX) get the position just after the matching ")". */ +-extern char *extract_process_subst __P((char *, char *, int *)); ++extern char *extract_process_subst __P((char *, char *, int *, int)); + #endif /* PROCESS_SUBSTITUTION */ + + /* Extract the name of the variable to bind to from the assignment string. */ +Index: b/subst.c +=================================================================== +--- a/subst.c ++++ b/subst.c +@@ -1192,12 +1192,18 @@ extract_arithmetic_subst (string, sindex + Start extracting at (SINDEX) as if we had just seen "<(". + Make (SINDEX) get the position of the matching ")". */ /*))*/ + char * +-extract_process_subst (string, starter, sindex) ++extract_process_subst (string, starter, sindex, xflags) + char *string; + char *starter; + int *sindex; ++ int xflags; + { ++#if 0 + return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND)); ++#else ++ xflags |= (no_longjmp_on_fatal_error ? SX_NOLONGJMP : 0); ++ return (xparse_dolparen (string, string+*sindex, sindex, xflags)); ++#endif + } + #endif /* PROCESS_SUBSTITUTION */ + +@@ -1785,7 +1791,7 @@ skip_to_delim (string, start, delims, fl + si = i + 2; + if (string[si] == '\0') + CQ_RETURN(si); +- temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si); ++ temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si, 0); + free (temp); /* no SX_ALLOC here */ + i = si; + if (string[i] == '\0') +@@ -8249,7 +8255,7 @@ add_string: + else + t_index = sindex + 1; /* skip past both '<' and LPAREN */ + +- temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index); /*))*/ ++ temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index, 0); /*))*/ + sindex = t_index; + + /* If the process substitution specification is `<()', we want to +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-024.diff b/debian/patches/bash43-024.diff new file mode 100644 index 0000000..7e5ad00 --- /dev/null +++ b/debian/patches/bash43-024.diff @@ -0,0 +1,51 @@ +# DP: bash43-024 upstream patch + + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-024 + +Bug-Reported-by: Corentin Peuvrel <cpeuvrel@pom-monitoring.com> +Bug-Reference-ID: <53CE9E5D.6050203@pom-monitoring.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-07/msg00021.html + +Bug-Description: + +Indirect variable references do not work correctly if the reference +variable expands to an array reference using a subscript other than 0 +(e.g., foo='bar[1]' ; echo ${!foo}). + +Patch (apply with `patch -p0'): + +Index: b/subst.c +=================================================================== +--- a/subst.c ++++ b/subst.c +@@ -7374,7 +7374,13 @@ parameter_brace_expand (string, indexp, + } + + if (want_indir) +- tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at); ++ { ++ tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at); ++ /* Turn off the W_ARRAYIND flag because there is no way for this function ++ to return the index we're supposed to be using. */ ++ if (tdesc && tdesc->flags) ++ tdesc->flags &= ~W_ARRAYIND; ++ } + else + tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS)), &ind); + +Index: b/patchlevel.h +=================================================================== +--- 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/debian/patches/bash43-025.diff b/debian/patches/bash43-025.diff new file mode 100644 index 0000000..6a6ff7b --- /dev/null +++ b/debian/patches/bash43-025.diff @@ -0,0 +1,119 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-025 + +Bug-Reported-by: Stephane Chazelas <stephane.chazelas@gmail.com> +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +Under certain circumstances, bash will execute user code while processing the +environment for exported function definitions. + + +Index: bash-4.3/builtins/common.h +=================================================================== +--- bash-4.3.orig/builtins/common.h 2013-07-08 22:54:47.000000000 +0200 ++++ bash-4.3/builtins/common.h 2014-09-24 20:37:05.016459862 +0200 +@@ -33,6 +33,8 @@ + #define SEVAL_RESETLINE 0x010 + #define SEVAL_PARSEONLY 0x020 + #define SEVAL_NOLONGJMP 0x040 ++#define SEVAL_FUNCDEF 0x080 /* only allow function definitions */ ++#define SEVAL_ONECMD 0x100 /* only allow a single command */ + + /* Flags for describe_command, shared between type.def and command.def */ + #define CDESC_ALL 0x001 /* type -a */ +Index: bash-4.3/builtins/evalstring.c +=================================================================== +--- bash-4.3.orig/builtins/evalstring.c 2014-02-11 15:42:10.000000000 +0100 ++++ bash-4.3/builtins/evalstring.c 2014-09-24 20:37:05.016459862 +0200 +@@ -308,6 +308,14 @@ + { + 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); +@@ -368,6 +376,9 @@ + dispose_command (command); + dispose_fd_bitmap (bitmap); + discard_unwind_frame ("pe_dispose"); ++ ++ if (flags & SEVAL_ONECMD) ++ break; + } + } + else +Index: bash-4.3/patchlevel.h +=================================================================== +--- bash-4.3.orig/patchlevel.h 2014-09-24 20:28:46.000000000 +0200 ++++ bash-4.3/patchlevel.h 2014-09-24 20:37:05.020459944 +0200 +@@ -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_ */ +Index: bash-4.3/subst.c +=================================================================== +--- bash-4.3.orig/subst.c 2014-09-24 20:28:46.000000000 +0200 ++++ bash-4.3/subst.c 2014-09-24 20:37:05.020459944 +0200 +@@ -8047,7 +8047,9 @@ + + goto return0; + } +- else if (var = find_variable_last_nameref (temp1)) ++ else if (var && (invisible_p (var) || var_isset (var) == 0)) ++ temp = (char *)NULL; ++ else if ((var = find_variable_last_nameref (temp1)) && var_isset (var) && invisible_p (var) == 0) + { + temp = nameref_cell (var); + #if defined (ARRAY_VARS) +Index: bash-4.3/variables.c +=================================================================== +--- bash-4.3.orig/variables.c 2014-09-24 20:28:46.000000000 +0200 ++++ bash-4.3/variables.c 2014-09-24 20:37:05.016459862 +0200 +@@ -358,13 +358,11 @@ + temp_string[char_index] = ' '; + strcpy (temp_string + char_index + 1, string); + +- if (posixly_correct == 0 || legal_identifier (name)) +- 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, though we still allow them to be defined as shell ++ variables. */ ++ if (legal_identifier (name)) ++ parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD); + + if (temp_var = find_function (name)) + { +@@ -381,10 +379,6 @@ + last_command_exit_value = 1; + 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 ARRAY_EXPORT diff --git a/debian/patches/bash43-026.diff b/debian/patches/bash43-026.diff new file mode 100644 index 0000000..e073e32 --- /dev/null +++ b/debian/patches/bash43-026.diff @@ -0,0 +1,58 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-026 + +Bug-Reported-by: Tavis Ormandy <taviso@cmpxchg8b.com> +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. + +Index: b/parse.y +=================================================================== +--- a/parse.y ++++ b/parse.y +@@ -2953,6 +2953,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'; +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/y.tab.c +=================================================================== +--- a/y.tab.c ++++ b/y.tab.c +@@ -5265,6 +5265,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'; +@@ -8539,4 +8541,3 @@ set_line_mbstate () + } + } + #endif /* HANDLE_MULTIBYTE */ +- diff --git a/debian/patches/bash43-027.diff b/debian/patches/bash43-027.diff new file mode 100644 index 0000000..a346a23 --- /dev/null +++ b/debian/patches/bash43-027.diff @@ -0,0 +1,178 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-027 + +Bug-Reported-by: Florian Weimer <fweimer@redhat.com> +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +This patch changes the encoding bash uses for exported functions to avoid +clashes with shell variables and to avoid depending only on an environment +variable's contents to determine whether or not to interpret it as a shell +function. + +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/variables.c +=================================================================== +--- a/variables.c ++++ b/variables.c +@@ -83,6 +83,11 @@ + + #define ifsname(s) ((s)[0] == 'I' && (s)[1] == 'F' && (s)[2] == 'S' && (s)[3] == '\0') + ++#define BASHFUNC_PREFIX "BASH_FUNC_" ++#define BASHFUNC_PREFLEN 10 /* == strlen(BASHFUNC_PREFIX */ ++#define BASHFUNC_SUFFIX "%%" ++#define BASHFUNC_SUFFLEN 2 /* == strlen(BASHFUNC_SUFFIX) */ ++ + extern char **environ; + + /* Variables used here and defined in other files. */ +@@ -279,7 +284,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)); +@@ -349,22 +354,33 @@ 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)) ++ if (privmode == 0 && read_but_dont_execute == 0 && ++ STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) && ++ STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) && ++ STREQN ("() {", string, 4)) + { ++ size_t namelen; ++ char *tname; /* desired imported function name */ ++ ++ namelen = char_index - BASHFUNC_PREFLEN - BASHFUNC_SUFFLEN; ++ ++ tname = name + BASHFUNC_PREFLEN; /* start of func name */ ++ tname[namelen] = '\0'; /* now tname == func name */ ++ + string_length = strlen (string); +- temp_string = (char *)xmalloc (3 + string_length + char_index); ++ temp_string = (char *)xmalloc (namelen + string_length + 2); + +- strcpy (temp_string, name); +- temp_string[char_index] = ' '; +- strcpy (temp_string + char_index + 1, string); ++ memcpy (temp_string, tname, namelen); ++ temp_string[namelen] = ' '; ++ memcpy (temp_string + namelen + 1, string, string_length + 1); + + /* Don't import function names that are invalid identifiers from the + environment, though we still allow them to be defined as shell + variables. */ +- if (legal_identifier (name)) +- parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD); ++ if (absolute_program (tname) == 0 && (posixly_correct == 0 || legal_identifier (tname))) ++ parse_and_execute (temp_string, tname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD); + +- if (temp_var = find_function (name)) ++ if (temp_var = find_function (tname)) + { + VSETATTR (temp_var, (att_exported|att_imported)); + array_needs_making = 1; +@@ -377,8 +393,11 @@ initialize_shell_variables (env, privmod + array_needs_making = 1; + } + last_command_exit_value = 1; +- report_error (_("error importing function definition for `%s'"), name); ++ report_error (_("error importing function definition for `%s'"), tname); + } ++ ++ /* Restore original suffix */ ++ tname[namelen] = BASHFUNC_SUFFIX[0]; + } + #if defined (ARRAY_VARS) + # if ARRAY_EXPORT +@@ -2954,7 +2973,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; + +@@ -3852,21 +3871,42 @@ merge_temporary_env () + /* **************************************************************** */ + + static inline char * +-mk_env_string (name, value) ++mk_env_string (name, value, isfunc) + const char *name, *value; ++ int isfunc; + { +- 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 we are exporting a shell function, construct the encoded function ++ name. */ ++ if (isfunc && value) ++ { ++ p = (char *)xmalloc (BASHFUNC_PREFLEN + name_len + BASHFUNC_SUFFLEN + value_len + 2); ++ q = p; ++ memcpy (q, BASHFUNC_PREFIX, BASHFUNC_PREFLEN); ++ q += BASHFUNC_PREFLEN; ++ memcpy (q, name, name_len); ++ q += name_len; ++ memcpy (q, BASHFUNC_SUFFIX, BASHFUNC_SUFFLEN); ++ q += BASHFUNC_SUFFLEN; ++ } ++ else ++ { ++ p = (char *)xmalloc (2 + name_len + value_len); ++ 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); + } + +@@ -3952,7 +3992,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]); diff --git a/debian/patches/bash43-028.diff b/debian/patches/bash43-028.diff new file mode 100644 index 0000000..976d091 --- /dev/null +++ b/debian/patches/bash43-028.diff @@ -0,0 +1,1530 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-028 + +Bug-Reported-by: Florian Weimer <fweimer@redhat.com> +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +There are two local buffer overflows in parse.y that can cause the shell +to dump core when given many here-documents attached to a single command +or many nested loops. + +Index: b/parse.y +=================================================================== +--- a/parse.y ++++ b/parse.y +@@ -168,6 +168,9 @@ static char *read_a_line __P((int)); + + static int reserved_word_acceptable __P((int)); + static int yylex __P((void)); ++ ++static void push_heredoc __P((REDIRECT *)); ++static char *mk_alexpansion __P((char *)); + static int alias_expand_token __P((char *)); + static int time_command_acceptable __P((void)); + static int special_case_tokens __P((char *)); +@@ -265,7 +268,9 @@ 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]; ++#define HEREDOC_MAX 16 ++ ++static REDIRECT *redir_stack[HEREDOC_MAX]; + int need_here_doc; + + /* Where shell input comes from. History expansion is performed on each +@@ -307,7 +312,7 @@ static int global_extglob; + or `for WORD' begins. This is a nested command maximum, since the array + index is decremented after a case, select, or for command is parsed. */ + #define MAX_CASE_NEST 128 +-static int word_lineno[MAX_CASE_NEST]; ++static int word_lineno[MAX_CASE_NEST+1]; + static int word_top = -1; + + /* If non-zero, it is the token that we want read_token to return +@@ -520,42 +525,42 @@ redirection: '>' WORD + source.dest = 0; + redir.filename = $2; + $$ = make_redirection (source, r_reading_until, redir, 0); +- redir_stack[need_here_doc++] = $$; ++ push_heredoc ($$); + } + | NUMBER LESS_LESS WORD + { + source.dest = $1; + redir.filename = $3; + $$ = make_redirection (source, r_reading_until, redir, 0); +- redir_stack[need_here_doc++] = $$; ++ push_heredoc ($$); + } + | 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_heredoc ($$); + } + | 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_heredoc ($$); + } + | 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_heredoc ($$); + } + | 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_heredoc ($$); + } + | LESS_LESS_LESS WORD + { +@@ -2636,6 +2641,21 @@ yylex () + which allow ESAC to be the next one read. */ + static int esacs_needed_count; + ++static void ++push_heredoc (r) ++ REDIRECT *r; ++{ ++ if (need_here_doc >= HEREDOC_MAX) ++ { ++ last_command_exit_value = EX_BADUSAGE; ++ need_here_doc = 0; ++ report_syntax_error (_("maximum here-document count exceeded")); ++ reset_parser (); ++ exit_shell (last_command_exit_value); ++ } ++ redir_stack[need_here_doc++] = r; ++} ++ + void + gather_here_documents () + { +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/y.tab.c +=================================================================== +--- a/y.tab.c ++++ b/y.tab.c +@@ -168,7 +168,7 @@ + + + /* Copy the first part of user declarations. */ +-#line 21 "/usr/homes/chet/src/bash/src/parse.y" ++#line 21 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + + #include "config.h" + +@@ -319,6 +319,9 @@ static char *read_a_line __P((int)); + + static int reserved_word_acceptable __P((int)); + static int yylex __P((void)); ++ ++static void push_heredoc __P((REDIRECT *)); ++static char *mk_alexpansion __P((char *)); + static int alias_expand_token __P((char *)); + static int time_command_acceptable __P((void)); + static int special_case_tokens __P((char *)); +@@ -416,7 +419,9 @@ 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]; ++#define HEREDOC_MAX 16 ++ ++static REDIRECT *redir_stack[HEREDOC_MAX]; + int need_here_doc; + + /* Where shell input comes from. History expansion is performed on each +@@ -458,7 +463,7 @@ static int global_extglob; + or `for WORD' begins. This is a nested command maximum, since the array + index is decremented after a case, select, or for command is parsed. */ + #define MAX_CASE_NEST 128 +-static int word_lineno[MAX_CASE_NEST]; ++static int word_lineno[MAX_CASE_NEST+1]; + static int word_top = -1; + + /* If non-zero, it is the token that we want read_token to return +@@ -492,7 +497,7 @@ static REDIRECTEE redir; + + #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + typedef union YYSTYPE +-#line 324 "/usr/homes/chet/src/bash/src/parse.y" ++#line 329 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + WORD_DESC *word; /* the word that we read. */ + int number; /* the number that we read. */ +@@ -503,7 +508,7 @@ typedef union YYSTYPE + PATTERN_LIST *pattern; + } + /* Line 193 of yacc.c. */ +-#line 507 "y.tab.c" ++#line 512 "y.tab.c" + YYSTYPE; + # define yystype YYSTYPE /* obsolescent; will be withdrawn */ + # define YYSTYPE_IS_DECLARED 1 +@@ -516,7 +521,7 @@ typedef union YYSTYPE + + + /* Line 216 of yacc.c. */ +-#line 520 "y.tab.c" ++#line 525 "y.tab.c" + + #ifdef short + # undef short +@@ -886,23 +891,23 @@ static const yytype_int8 yyrhs[] = + /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ + static const yytype_uint16 yyrline[] = + { +- 0, 377, 377, 388, 397, 412, 422, 424, 428, 434, +- 440, 446, 452, 458, 464, 470, 476, 482, 488, 494, +- 500, 506, 512, 518, 525, 532, 539, 546, 553, 560, +- 566, 572, 578, 584, 590, 596, 602, 608, 614, 620, +- 626, 632, 638, 644, 650, 656, 662, 668, 674, 680, +- 686, 692, 700, 702, 704, 708, 712, 723, 725, 729, +- 731, 733, 749, 751, 755, 757, 759, 761, 763, 765, +- 767, 769, 771, 773, 775, 779, 784, 789, 794, 799, +- 804, 809, 814, 821, 826, 831, 836, 843, 848, 853, +- 858, 863, 868, 875, 880, 885, 892, 895, 898, 902, +- 904, 935, 942, 947, 964, 969, 986, 993, 995, 997, +- 1002, 1006, 1010, 1014, 1016, 1018, 1022, 1023, 1027, 1029, +- 1031, 1033, 1037, 1039, 1041, 1043, 1045, 1047, 1051, 1053, +- 1062, 1070, 1071, 1077, 1078, 1085, 1089, 1091, 1093, 1100, +- 1102, 1104, 1108, 1109, 1112, 1114, 1116, 1120, 1121, 1130, +- 1143, 1159, 1174, 1176, 1178, 1185, 1188, 1192, 1194, 1200, +- 1206, 1223, 1243, 1245, 1268, 1272, 1274, 1276 ++ 0, 382, 382, 393, 402, 417, 427, 429, 433, 439, ++ 445, 451, 457, 463, 469, 475, 481, 487, 493, 499, ++ 505, 511, 517, 523, 530, 537, 544, 551, 558, 565, ++ 571, 577, 583, 589, 595, 601, 607, 613, 619, 625, ++ 631, 637, 643, 649, 655, 661, 667, 673, 679, 685, ++ 691, 697, 705, 707, 709, 713, 717, 728, 730, 734, ++ 736, 738, 754, 756, 760, 762, 764, 766, 768, 770, ++ 772, 774, 776, 778, 780, 784, 789, 794, 799, 804, ++ 809, 814, 819, 826, 831, 836, 841, 848, 853, 858, ++ 863, 868, 873, 880, 885, 890, 897, 900, 903, 907, ++ 909, 940, 947, 952, 969, 974, 991, 998, 1000, 1002, ++ 1007, 1011, 1015, 1019, 1021, 1023, 1027, 1028, 1032, 1034, ++ 1036, 1038, 1042, 1044, 1046, 1048, 1050, 1052, 1056, 1058, ++ 1067, 1075, 1076, 1082, 1083, 1090, 1094, 1096, 1098, 1105, ++ 1107, 1109, 1113, 1114, 1117, 1119, 1121, 1125, 1126, 1135, ++ 1148, 1164, 1179, 1181, 1183, 1190, 1193, 1197, 1199, 1205, ++ 1211, 1228, 1248, 1250, 1273, 1277, 1279, 1281 + }; + #endif + +@@ -2093,7 +2098,7 @@ yyreduce: + switch (yyn) + { + case 2: +-#line 378 "/usr/homes/chet/src/bash/src/parse.y" ++#line 383 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + /* Case of regular command. Discard the error + safety net,and return the command just parsed. */ +@@ -2107,7 +2112,7 @@ yyreduce: + break; + + case 3: +-#line 389 "/usr/homes/chet/src/bash/src/parse.y" ++#line 394 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + /* Case of regular command, but not a very + interesting one. Return a NULL command. */ +@@ -2119,7 +2124,7 @@ yyreduce: + break; + + case 4: +-#line 398 "/usr/homes/chet/src/bash/src/parse.y" ++#line 403 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + /* Error during parsing. Return NULL command. */ + global_command = (COMMAND *)NULL; +@@ -2137,7 +2142,7 @@ yyreduce: + break; + + case 5: +-#line 413 "/usr/homes/chet/src/bash/src/parse.y" ++#line 418 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + /* Case of EOF seen by itself. Do ignoreeof or + not. */ +@@ -2148,17 +2153,17 @@ yyreduce: + break; + + case 6: +-#line 423 "/usr/homes/chet/src/bash/src/parse.y" ++#line 428 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); } + break; + + case 7: +-#line 425 "/usr/homes/chet/src/bash/src/parse.y" ++#line 430 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); } + break; + + case 8: +-#line 429 "/usr/homes/chet/src/bash/src/parse.y" ++#line 434 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2167,7 +2172,7 @@ yyreduce: + break; + + case 9: +-#line 435 "/usr/homes/chet/src/bash/src/parse.y" ++#line 440 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2176,7 +2181,7 @@ yyreduce: + break; + + case 10: +-#line 441 "/usr/homes/chet/src/bash/src/parse.y" ++#line 446 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2185,7 +2190,7 @@ yyreduce: + break; + + case 11: +-#line 447 "/usr/homes/chet/src/bash/src/parse.y" ++#line 452 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2194,7 +2199,7 @@ yyreduce: + break; + + case 12: +-#line 453 "/usr/homes/chet/src/bash/src/parse.y" ++#line 458 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2203,7 +2208,7 @@ yyreduce: + break; + + case 13: +-#line 459 "/usr/homes/chet/src/bash/src/parse.y" ++#line 464 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2212,7 +2217,7 @@ yyreduce: + break; + + case 14: +-#line 465 "/usr/homes/chet/src/bash/src/parse.y" ++#line 470 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2221,7 +2226,7 @@ yyreduce: + break; + + case 15: +-#line 471 "/usr/homes/chet/src/bash/src/parse.y" ++#line 476 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2230,7 +2235,7 @@ yyreduce: + break; + + case 16: +-#line 477 "/usr/homes/chet/src/bash/src/parse.y" ++#line 482 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2239,7 +2244,7 @@ yyreduce: + break; + + case 17: +-#line 483 "/usr/homes/chet/src/bash/src/parse.y" ++#line 488 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2248,7 +2253,7 @@ yyreduce: + break; + + case 18: +-#line 489 "/usr/homes/chet/src/bash/src/parse.y" ++#line 494 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2257,7 +2262,7 @@ yyreduce: + break; + + case 19: +-#line 495 "/usr/homes/chet/src/bash/src/parse.y" ++#line 500 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2266,7 +2271,7 @@ yyreduce: + break; + + case 20: +-#line 501 "/usr/homes/chet/src/bash/src/parse.y" ++#line 506 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2275,7 +2280,7 @@ yyreduce: + break; + + case 21: +-#line 507 "/usr/homes/chet/src/bash/src/parse.y" ++#line 512 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2284,7 +2289,7 @@ yyreduce: + break; + + case 22: +-#line 513 "/usr/homes/chet/src/bash/src/parse.y" ++#line 518 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2293,67 +2298,67 @@ yyreduce: + break; + + case 23: +-#line 519 "/usr/homes/chet/src/bash/src/parse.y" ++#line 524 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0); +- redir_stack[need_here_doc++] = (yyval.redirect); ++ push_heredoc ((yyval.redirect)); + } + break; + + case 24: +-#line 526 "/usr/homes/chet/src/bash/src/parse.y" ++#line 531 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0); +- redir_stack[need_here_doc++] = (yyval.redirect); ++ push_heredoc ((yyval.redirect)); + } + break; + + case 25: +-#line 533 "/usr/homes/chet/src/bash/src/parse.y" ++#line 538 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN); +- redir_stack[need_here_doc++] = (yyval.redirect); ++ push_heredoc ((yyval.redirect)); + } + break; + + case 26: +-#line 540 "/usr/homes/chet/src/bash/src/parse.y" ++#line 545 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0); +- redir_stack[need_here_doc++] = (yyval.redirect); ++ push_heredoc ((yyval.redirect)); + } + break; + + case 27: +-#line 547 "/usr/homes/chet/src/bash/src/parse.y" ++#line 552 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0); +- redir_stack[need_here_doc++] = (yyval.redirect); ++ push_heredoc ((yyval.redirect)); + } + break; + + case 28: +-#line 554 "/usr/homes/chet/src/bash/src/parse.y" ++#line 559 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN); +- redir_stack[need_here_doc++] = (yyval.redirect); ++ push_heredoc ((yyval.redirect)); + } + break; + + case 29: +-#line 561 "/usr/homes/chet/src/bash/src/parse.y" ++#line 566 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2362,7 +2367,7 @@ yyreduce: + break; + + case 30: +-#line 567 "/usr/homes/chet/src/bash/src/parse.y" ++#line 572 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2371,7 +2376,7 @@ yyreduce: + break; + + case 31: +-#line 573 "/usr/homes/chet/src/bash/src/parse.y" ++#line 578 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2380,7 +2385,7 @@ yyreduce: + break; + + case 32: +-#line 579 "/usr/homes/chet/src/bash/src/parse.y" ++#line 584 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 0; + redir.dest = (yyvsp[(2) - (2)].number); +@@ -2389,7 +2394,7 @@ yyreduce: + break; + + case 33: +-#line 585 "/usr/homes/chet/src/bash/src/parse.y" ++#line 590 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = (yyvsp[(3) - (3)].number); +@@ -2398,7 +2403,7 @@ yyreduce: + break; + + case 34: +-#line 591 "/usr/homes/chet/src/bash/src/parse.y" ++#line 596 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = (yyvsp[(3) - (3)].number); +@@ -2407,7 +2412,7 @@ yyreduce: + break; + + case 35: +-#line 597 "/usr/homes/chet/src/bash/src/parse.y" ++#line 602 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 1; + redir.dest = (yyvsp[(2) - (2)].number); +@@ -2416,7 +2421,7 @@ yyreduce: + break; + + case 36: +-#line 603 "/usr/homes/chet/src/bash/src/parse.y" ++#line 608 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = (yyvsp[(3) - (3)].number); +@@ -2425,7 +2430,7 @@ yyreduce: + break; + + case 37: +-#line 609 "/usr/homes/chet/src/bash/src/parse.y" ++#line 614 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = (yyvsp[(3) - (3)].number); +@@ -2434,7 +2439,7 @@ yyreduce: + break; + + case 38: +-#line 615 "/usr/homes/chet/src/bash/src/parse.y" ++#line 620 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2443,7 +2448,7 @@ yyreduce: + break; + + case 39: +-#line 621 "/usr/homes/chet/src/bash/src/parse.y" ++#line 626 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2452,7 +2457,7 @@ yyreduce: + break; + + case 40: +-#line 627 "/usr/homes/chet/src/bash/src/parse.y" ++#line 632 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2461,7 +2466,7 @@ yyreduce: + break; + + case 41: +-#line 633 "/usr/homes/chet/src/bash/src/parse.y" ++#line 638 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2470,7 +2475,7 @@ yyreduce: + break; + + case 42: +-#line 639 "/usr/homes/chet/src/bash/src/parse.y" ++#line 644 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2479,7 +2484,7 @@ yyreduce: + break; + + case 43: +-#line 645 "/usr/homes/chet/src/bash/src/parse.y" ++#line 650 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2488,7 +2493,7 @@ yyreduce: + break; + + case 44: +-#line 651 "/usr/homes/chet/src/bash/src/parse.y" ++#line 656 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 1; + redir.dest = 0; +@@ -2497,7 +2502,7 @@ yyreduce: + break; + + case 45: +-#line 657 "/usr/homes/chet/src/bash/src/parse.y" ++#line 662 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = 0; +@@ -2506,7 +2511,7 @@ yyreduce: + break; + + case 46: +-#line 663 "/usr/homes/chet/src/bash/src/parse.y" ++#line 668 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = 0; +@@ -2515,7 +2520,7 @@ yyreduce: + break; + + case 47: +-#line 669 "/usr/homes/chet/src/bash/src/parse.y" ++#line 674 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 0; + redir.dest = 0; +@@ -2524,7 +2529,7 @@ yyreduce: + break; + + case 48: +-#line 675 "/usr/homes/chet/src/bash/src/parse.y" ++#line 680 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = 0; +@@ -2533,7 +2538,7 @@ yyreduce: + break; + + case 49: +-#line 681 "/usr/homes/chet/src/bash/src/parse.y" ++#line 686 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = 0; +@@ -2542,7 +2547,7 @@ yyreduce: + break; + + case 50: +-#line 687 "/usr/homes/chet/src/bash/src/parse.y" ++#line 692 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2551,7 +2556,7 @@ yyreduce: + break; + + case 51: +-#line 693 "/usr/homes/chet/src/bash/src/parse.y" ++#line 698 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2560,29 +2565,29 @@ yyreduce: + break; + + case 52: +-#line 701 "/usr/homes/chet/src/bash/src/parse.y" ++#line 706 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; } + break; + + case 53: +-#line 703 "/usr/homes/chet/src/bash/src/parse.y" ++#line 708 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; } + break; + + case 54: +-#line 705 "/usr/homes/chet/src/bash/src/parse.y" ++#line 710 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; } + break; + + case 55: +-#line 709 "/usr/homes/chet/src/bash/src/parse.y" ++#line 714 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.redirect) = (yyvsp[(1) - (1)].redirect); + } + break; + + case 56: +-#line 713 "/usr/homes/chet/src/bash/src/parse.y" ++#line 718 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + register REDIRECT *t; + +@@ -2594,27 +2599,27 @@ yyreduce: + break; + + case 57: +-#line 724 "/usr/homes/chet/src/bash/src/parse.y" ++#line 729 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); } + break; + + case 58: +-#line 726 "/usr/homes/chet/src/bash/src/parse.y" ++#line 731 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); } + break; + + case 59: +-#line 730 "/usr/homes/chet/src/bash/src/parse.y" ++#line 735 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); } + break; + + case 60: +-#line 732 "/usr/homes/chet/src/bash/src/parse.y" ++#line 737 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 61: +-#line 734 "/usr/homes/chet/src/bash/src/parse.y" ++#line 739 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + COMMAND *tc; + +@@ -2633,72 +2638,72 @@ yyreduce: + break; + + case 62: +-#line 750 "/usr/homes/chet/src/bash/src/parse.y" ++#line 755 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 63: +-#line 752 "/usr/homes/chet/src/bash/src/parse.y" ++#line 757 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 64: +-#line 756 "/usr/homes/chet/src/bash/src/parse.y" ++#line 761 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 65: +-#line 758 "/usr/homes/chet/src/bash/src/parse.y" ++#line 763 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 66: +-#line 760 "/usr/homes/chet/src/bash/src/parse.y" ++#line 765 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); } + break; + + case 67: +-#line 762 "/usr/homes/chet/src/bash/src/parse.y" ++#line 767 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); } + break; + + case 68: +-#line 764 "/usr/homes/chet/src/bash/src/parse.y" ++#line 769 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 69: +-#line 766 "/usr/homes/chet/src/bash/src/parse.y" ++#line 771 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 70: +-#line 768 "/usr/homes/chet/src/bash/src/parse.y" ++#line 773 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 71: +-#line 770 "/usr/homes/chet/src/bash/src/parse.y" ++#line 775 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 72: +-#line 772 "/usr/homes/chet/src/bash/src/parse.y" ++#line 777 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 73: +-#line 774 "/usr/homes/chet/src/bash/src/parse.y" ++#line 779 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 74: +-#line 776 "/usr/homes/chet/src/bash/src/parse.y" ++#line 781 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 75: +-#line 780 "/usr/homes/chet/src/bash/src/parse.y" ++#line 785 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2706,7 +2711,7 @@ yyreduce: + break; + + case 76: +-#line 785 "/usr/homes/chet/src/bash/src/parse.y" ++#line 790 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2714,7 +2719,7 @@ yyreduce: + break; + + case 77: +-#line 790 "/usr/homes/chet/src/bash/src/parse.y" ++#line 795 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2722,7 +2727,7 @@ yyreduce: + break; + + case 78: +-#line 795 "/usr/homes/chet/src/bash/src/parse.y" ++#line 800 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2730,7 +2735,7 @@ yyreduce: + break; + + case 79: +-#line 800 "/usr/homes/chet/src/bash/src/parse.y" ++#line 805 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2738,7 +2743,7 @@ yyreduce: + break; + + case 80: +-#line 805 "/usr/homes/chet/src/bash/src/parse.y" ++#line 810 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2746,7 +2751,7 @@ yyreduce: + break; + + case 81: +-#line 810 "/usr/homes/chet/src/bash/src/parse.y" ++#line 815 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2754,7 +2759,7 @@ yyreduce: + break; + + case 82: +-#line 815 "/usr/homes/chet/src/bash/src/parse.y" ++#line 820 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2762,7 +2767,7 @@ yyreduce: + break; + + case 83: +-#line 822 "/usr/homes/chet/src/bash/src/parse.y" ++#line 827 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno); + if (word_top > 0) word_top--; +@@ -2770,7 +2775,7 @@ yyreduce: + break; + + case 84: +-#line 827 "/usr/homes/chet/src/bash/src/parse.y" ++#line 832 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno); + if (word_top > 0) word_top--; +@@ -2778,7 +2783,7 @@ yyreduce: + break; + + case 85: +-#line 832 "/usr/homes/chet/src/bash/src/parse.y" ++#line 837 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno); + if (word_top > 0) word_top--; +@@ -2786,7 +2791,7 @@ yyreduce: + break; + + case 86: +-#line 837 "/usr/homes/chet/src/bash/src/parse.y" ++#line 842 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno); + if (word_top > 0) word_top--; +@@ -2794,7 +2799,7 @@ yyreduce: + break; + + case 87: +-#line 844 "/usr/homes/chet/src/bash/src/parse.y" ++#line 849 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2802,7 +2807,7 @@ yyreduce: + break; + + case 88: +-#line 849 "/usr/homes/chet/src/bash/src/parse.y" ++#line 854 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2810,7 +2815,7 @@ yyreduce: + break; + + case 89: +-#line 854 "/usr/homes/chet/src/bash/src/parse.y" ++#line 859 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2818,7 +2823,7 @@ yyreduce: + break; + + case 90: +-#line 859 "/usr/homes/chet/src/bash/src/parse.y" ++#line 864 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2826,7 +2831,7 @@ yyreduce: + break; + + case 91: +-#line 864 "/usr/homes/chet/src/bash/src/parse.y" ++#line 869 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2834,7 +2839,7 @@ yyreduce: + break; + + case 92: +-#line 869 "/usr/homes/chet/src/bash/src/parse.y" ++#line 874 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2842,7 +2847,7 @@ yyreduce: + break; + + case 93: +-#line 876 "/usr/homes/chet/src/bash/src/parse.y" ++#line 881 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2850,7 +2855,7 @@ yyreduce: + break; + + case 94: +-#line 881 "/usr/homes/chet/src/bash/src/parse.y" ++#line 886 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2858,7 +2863,7 @@ yyreduce: + break; + + case 95: +-#line 886 "/usr/homes/chet/src/bash/src/parse.y" ++#line 891 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2866,27 +2871,27 @@ yyreduce: + break; + + case 96: +-#line 893 "/usr/homes/chet/src/bash/src/parse.y" ++#line 898 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); } + break; + + case 97: +-#line 896 "/usr/homes/chet/src/bash/src/parse.y" ++#line 901 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); } + break; + + case 98: +-#line 899 "/usr/homes/chet/src/bash/src/parse.y" ++#line 904 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); } + break; + + case 99: +-#line 903 "/usr/homes/chet/src/bash/src/parse.y" ++#line 908 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 100: +-#line 905 "/usr/homes/chet/src/bash/src/parse.y" ++#line 910 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + COMMAND *tc; + +@@ -2918,7 +2923,7 @@ yyreduce: + break; + + case 101: +-#line 936 "/usr/homes/chet/src/bash/src/parse.y" ++#line 941 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL; +@@ -2926,7 +2931,7 @@ yyreduce: + break; + + case 102: +-#line 943 "/usr/homes/chet/src/bash/src/parse.y" ++#line 948 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; +@@ -2934,7 +2939,7 @@ yyreduce: + break; + + case 103: +-#line 948 "/usr/homes/chet/src/bash/src/parse.y" ++#line 953 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + COMMAND *tc; + +@@ -2954,7 +2959,7 @@ yyreduce: + break; + + case 104: +-#line 965 "/usr/homes/chet/src/bash/src/parse.y" ++#line 970 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; +@@ -2962,7 +2967,7 @@ yyreduce: + break; + + case 105: +-#line 970 "/usr/homes/chet/src/bash/src/parse.y" ++#line 975 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + COMMAND *tc; + +@@ -2982,7 +2987,7 @@ yyreduce: + break; + + case 106: +-#line 987 "/usr/homes/chet/src/bash/src/parse.y" ++#line 992 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command))); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; +@@ -2990,117 +2995,117 @@ yyreduce: + break; + + case 107: +-#line 994 "/usr/homes/chet/src/bash/src/parse.y" ++#line 999 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); } + break; + + case 108: +-#line 996 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1001 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); } + break; + + case 109: +-#line 998 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1003 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); } + break; + + case 110: +-#line 1003 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1008 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); } + break; + + case 111: +-#line 1007 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1012 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); } + break; + + case 112: +-#line 1011 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1016 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(2) - (3)].command); } + break; + + case 113: +-#line 1015 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1020 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); } + break; + + case 114: +-#line 1017 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1022 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); } + break; + + case 115: +-#line 1019 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1024 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); } + break; + + case 117: +-#line 1024 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1029 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); } + break; + + case 118: +-#line 1028 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1033 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); } + break; + + case 119: +-#line 1030 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1035 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); } + break; + + case 120: +-#line 1032 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1037 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); } + break; + + case 121: +-#line 1034 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1039 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); } + break; + + case 122: +-#line 1038 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1043 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } + break; + + case 123: +-#line 1040 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1045 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } + break; + + case 124: +-#line 1042 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1047 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } + break; + + case 125: +-#line 1044 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1049 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } + break; + + case 126: +-#line 1046 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1051 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } + break; + + case 127: +-#line 1048 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1053 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } + break; + + case 128: +-#line 1052 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1057 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); } + break; + + case 129: +-#line 1054 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1059 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); } + break; + + case 130: +-#line 1063 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1068 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = (yyvsp[(2) - (2)].command); + if (need_here_doc) +@@ -3109,14 +3114,14 @@ yyreduce: + break; + + case 132: +-#line 1072 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1077 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = (yyvsp[(2) - (2)].command); + } + break; + + case 134: +-#line 1079 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1084 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + if ((yyvsp[(1) - (3)].command)->type == cm_connection) + (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&'); +@@ -3126,17 +3131,17 @@ yyreduce: + break; + + case 136: +-#line 1090 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1095 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); } + break; + + case 137: +-#line 1092 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1097 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); } + break; + + case 138: +-#line 1094 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1099 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + if ((yyvsp[(1) - (4)].command)->type == cm_connection) + (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&'); +@@ -3146,37 +3151,37 @@ yyreduce: + break; + + case 139: +-#line 1101 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1106 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); } + break; + + case 140: +-#line 1103 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1108 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); } + break; + + case 141: +-#line 1105 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1110 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 144: +-#line 1113 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1118 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.number) = '\n'; } + break; + + case 145: +-#line 1115 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1120 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.number) = ';'; } + break; + + case 146: +-#line 1117 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1122 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.number) = yacc_EOF; } + break; + + case 149: +-#line 1131 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1136 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = (yyvsp[(1) - (1)].command); + if (need_here_doc) +@@ -3192,7 +3197,7 @@ yyreduce: + break; + + case 150: +-#line 1144 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1149 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + if ((yyvsp[(1) - (2)].command)->type == cm_connection) + (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&'); +@@ -3211,7 +3216,7 @@ yyreduce: + break; + + case 151: +-#line 1160 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1165 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + (yyval.command) = (yyvsp[(1) - (2)].command); + if (need_here_doc) +@@ -3227,17 +3232,17 @@ yyreduce: + break; + + case 152: +-#line 1175 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1180 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); } + break; + + case 153: +-#line 1177 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1182 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); } + break; + + case 154: +-#line 1179 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1184 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + if ((yyvsp[(1) - (3)].command)->type == cm_connection) + (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&'); +@@ -3247,22 +3252,22 @@ yyreduce: + break; + + case 155: +-#line 1186 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1191 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); } + break; + + case 156: +-#line 1189 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1194 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 157: +-#line 1193 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1198 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 158: +-#line 1195 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1200 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + if ((yyvsp[(2) - (2)].command)) + (yyvsp[(2) - (2)].command)->flags ^= CMD_INVERT_RETURN; /* toggle */ +@@ -3271,7 +3276,7 @@ yyreduce: + break; + + case 159: +-#line 1201 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1206 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + if ((yyvsp[(2) - (2)].command)) + (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number); +@@ -3280,7 +3285,7 @@ yyreduce: + break; + + case 160: +-#line 1207 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1212 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + ELEMENT x; + +@@ -3300,7 +3305,7 @@ yyreduce: + break; + + case 161: +-#line 1224 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1229 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + ELEMENT x; + +@@ -3321,12 +3326,12 @@ yyreduce: + break; + + case 162: +-#line 1244 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1249 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); } + break; + + case 163: +-#line 1246 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1251 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { + /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */ + COMMAND *tc; +@@ -3352,28 +3357,28 @@ yyreduce: + break; + + case 164: +-#line 1269 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1274 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 165: +-#line 1273 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1278 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE; } + break; + + case 166: +-#line 1275 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1280 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } + break; + + case 167: +-#line 1277 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1282 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } + break; + + + /* Line 1267 of yacc.c. */ +-#line 3377 "y.tab.c" ++#line 3382 "y.tab.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); +@@ -3587,7 +3592,7 @@ yyreturn: + } + + +-#line 1279 "/usr/homes/chet/src/bash/src/parse.y" ++#line 1284 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" + + + /* Initial size to allocate for tokens, and the +@@ -4948,6 +4953,21 @@ yylex () + which allow ESAC to be the next one read. */ + static int esacs_needed_count; + ++static void ++push_heredoc (r) ++ REDIRECT *r; ++{ ++ if (need_here_doc >= HEREDOC_MAX) ++ { ++ last_command_exit_value = EX_BADUSAGE; ++ need_here_doc = 0; ++ report_syntax_error (_("maximum here-document count exceeded")); ++ reset_parser (); ++ exit_shell (last_command_exit_value); ++ } ++ redir_stack[need_here_doc++] = r; ++} ++ + void + gather_here_documents () + { +@@ -8541,3 +8561,4 @@ set_line_mbstate () + } + } + #endif /* HANDLE_MULTIBYTE */ ++ diff --git a/debian/patches/bash43-029.diff b/debian/patches/bash43-029.diff new file mode 100644 index 0000000..a5742bb --- /dev/null +++ b/debian/patches/bash43-029.diff @@ -0,0 +1,54 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-029 + +Bug-Reported-by: Michal Zalewski <lcamtuf@coredump.cx> +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +When bash is parsing a function definition that contains a here-document +delimited by end-of-file (or end-of-string), it leaves the closing delimiter +uninitialized. This can result in an invalid memory access when the parsed +function is later copied. + +Index: b/copy_cmd.c +=================================================================== +--- a/copy_cmd.c ++++ b/copy_cmd.c +@@ -126,7 +126,7 @@ copy_redirect (redirect) + { + case r_reading_until: + case r_deblank_reading_until: +- new_redirect->here_doc_eof = savestring (redirect->here_doc_eof); ++ new_redirect->here_doc_eof = redirect->here_doc_eof ? savestring (redirect->here_doc_eof) : 0; + /*FALLTHROUGH*/ + case r_reading_string: + case r_appending_to: +Index: b/make_cmd.c +=================================================================== +--- a/make_cmd.c ++++ b/make_cmd.c +@@ -692,6 +692,7 @@ make_redirection (source, instruction, d + /* First do the common cases. */ + temp->redirector = source; + temp->redirectee = dest_and_filename; ++ temp->here_doc_eof = 0; + temp->instruction = instruction; + temp->flags = 0; + temp->rflags = flags; +Index: b/patchlevel.h +=================================================================== +--- 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_ */ diff --git a/debian/patches/bash43-030.diff b/debian/patches/bash43-030.diff new file mode 100644 index 0000000..410ed91 --- /dev/null +++ b/debian/patches/bash43-030.diff @@ -0,0 +1,1404 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.3 +Patch-ID: bash43-030 + +Bug-Reported-by: Michal Zalewski <lcamtuf@coredump.cx> +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +A combination of nested command substitutions and function importing from +the environment can cause bash to execute code appearing in the environment +variable value following the function definition. + +Index: b/builtins/evalstring.c +=================================================================== +--- a/builtins/evalstring.c ++++ b/builtins/evalstring.c +@@ -308,12 +308,25 @@ parse_and_execute (string, from_file, fl + { + struct fd_bitmap *bitmap; + +- if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def) ++ if (flags & SEVAL_FUNCDEF) + { +- internal_warning ("%s: ignoring function definition attempt", from_file); +- should_jump_to_top_level = 0; +- last_result = last_command_exit_value = EX_BADUSAGE; +- break; ++ char *x; ++ ++ /* If the command parses to something other than a straight ++ function definition, or if we have not consumed the entire ++ string, or if the parser has transformed the function ++ name (as parsing will if it begins or ends with shell ++ whitespace, for example), reject the attempt */ ++ if (command->type != cm_function_def || ++ ((x = parser_remaining_input ()) && *x) || ++ (STREQ (from_file, command->value.Function_def->name->word) == 0)) ++ { ++ internal_warning (_("%s: ignoring function definition attempt"), from_file); ++ should_jump_to_top_level = 0; ++ last_result = last_command_exit_value = EX_BADUSAGE; ++ reset_parser (); ++ break; ++ } + } + + bitmap = new_fd_bitmap (FD_BITMAP_SIZE); +@@ -378,7 +391,10 @@ parse_and_execute (string, from_file, fl + discard_unwind_frame ("pe_dispose"); + + if (flags & SEVAL_ONECMD) +- break; ++ { ++ reset_parser (); ++ break; ++ } + } + } + else +Index: b/parse.y +=================================================================== +--- a/parse.y ++++ b/parse.y +@@ -2538,6 +2538,16 @@ shell_ungetc (c) + eol_ungetc_lookahead = c; + } + ++char * ++parser_remaining_input () ++{ ++ if (shell_input_line == 0) ++ return 0; ++ if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len) ++ return '\0'; /* XXX */ ++ return (shell_input_line + shell_input_line_index); ++} ++ + #ifdef INCLUDE_UNUSED + /* Back the input pointer up by one, effectively `ungetting' a character. */ + static void +@@ -4027,8 +4037,8 @@ xparse_dolparen (base, string, indp, fla + reset_parser (); + /* reset_parser clears shell_input_line and associated variables */ + restore_input_line_state (&ls); +- if (interactive) +- token_to_read = 0; ++ ++ token_to_read = 0; + + /* Need to find how many characters parse_and_execute consumed, update + *indp, if flags != 0, copy the portion of the string parsed into RET +Index: b/patchlevel.h +=================================================================== +--- 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_ */ +Index: b/shell.h +=================================================================== +--- a/shell.h ++++ b/shell.h +@@ -180,6 +180,8 @@ typedef struct _sh_input_line_state_t { + } sh_input_line_state_t; + + /* Let's try declaring these here. */ ++extern char *parser_remaining_input __P((void)); ++ + extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *)); + extern void restore_parser_state __P((sh_parser_state_t *)); + +Index: b/y.tab.c +=================================================================== +--- a/y.tab.c ++++ b/y.tab.c +@@ -168,7 +168,7 @@ + + + /* Copy the first part of user declarations. */ +-#line 21 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 21 "/usr/src/local/bash/bash-4.3-patched/parse.y" + + #include "config.h" + +@@ -497,7 +497,7 @@ static REDIRECTEE redir; + + #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + typedef union YYSTYPE +-#line 329 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 329 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + WORD_DESC *word; /* the word that we read. */ + int number; /* the number that we read. */ +@@ -2098,7 +2098,7 @@ yyreduce: + switch (yyn) + { + case 2: +-#line 383 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 383 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + /* Case of regular command. Discard the error + safety net,and return the command just parsed. */ +@@ -2112,7 +2112,7 @@ yyreduce: + break; + + case 3: +-#line 394 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 394 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + /* Case of regular command, but not a very + interesting one. Return a NULL command. */ +@@ -2124,7 +2124,7 @@ yyreduce: + break; + + case 4: +-#line 403 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 403 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + /* Error during parsing. Return NULL command. */ + global_command = (COMMAND *)NULL; +@@ -2142,7 +2142,7 @@ yyreduce: + break; + + case 5: +-#line 418 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 418 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + /* Case of EOF seen by itself. Do ignoreeof or + not. */ +@@ -2153,17 +2153,17 @@ yyreduce: + break; + + case 6: +-#line 428 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 428 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); } + break; + + case 7: +-#line 430 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 430 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); } + break; + + case 8: +-#line 434 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 434 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2172,7 +2172,7 @@ yyreduce: + break; + + case 9: +-#line 440 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 440 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2181,7 +2181,7 @@ yyreduce: + break; + + case 10: +-#line 446 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 446 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2190,7 +2190,7 @@ yyreduce: + break; + + case 11: +-#line 452 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 452 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2199,7 +2199,7 @@ yyreduce: + break; + + case 12: +-#line 458 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 458 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2208,7 +2208,7 @@ yyreduce: + break; + + case 13: +-#line 464 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 464 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2217,7 +2217,7 @@ yyreduce: + break; + + case 14: +-#line 470 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 470 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2226,7 +2226,7 @@ yyreduce: + break; + + case 15: +-#line 476 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 476 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2235,7 +2235,7 @@ yyreduce: + break; + + case 16: +-#line 482 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 482 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2244,7 +2244,7 @@ yyreduce: + break; + + case 17: +-#line 488 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 488 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2253,7 +2253,7 @@ yyreduce: + break; + + case 18: +-#line 494 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 494 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2262,7 +2262,7 @@ yyreduce: + break; + + case 19: +-#line 500 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 500 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2271,7 +2271,7 @@ yyreduce: + break; + + case 20: +-#line 506 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 506 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2280,7 +2280,7 @@ yyreduce: + break; + + case 21: +-#line 512 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 512 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2289,7 +2289,7 @@ yyreduce: + break; + + case 22: +-#line 518 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 518 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2298,7 +2298,7 @@ yyreduce: + break; + + case 23: +-#line 524 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 524 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2308,7 +2308,7 @@ yyreduce: + break; + + case 24: +-#line 531 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 531 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2318,7 +2318,7 @@ yyreduce: + break; + + case 25: +-#line 538 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 538 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2328,7 +2328,7 @@ yyreduce: + break; + + case 26: +-#line 545 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 545 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2338,7 +2338,7 @@ yyreduce: + break; + + case 27: +-#line 552 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 552 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2348,7 +2348,7 @@ yyreduce: + break; + + case 28: +-#line 559 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 559 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2358,7 +2358,7 @@ yyreduce: + break; + + case 29: +-#line 566 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 566 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2367,7 +2367,7 @@ yyreduce: + break; + + case 30: +-#line 572 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 572 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2376,7 +2376,7 @@ yyreduce: + break; + + case 31: +-#line 578 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 578 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2385,7 +2385,7 @@ yyreduce: + break; + + case 32: +-#line 584 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 584 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 0; + redir.dest = (yyvsp[(2) - (2)].number); +@@ -2394,7 +2394,7 @@ yyreduce: + break; + + case 33: +-#line 590 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 590 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = (yyvsp[(3) - (3)].number); +@@ -2403,7 +2403,7 @@ yyreduce: + break; + + case 34: +-#line 596 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 596 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = (yyvsp[(3) - (3)].number); +@@ -2412,7 +2412,7 @@ yyreduce: + break; + + case 35: +-#line 602 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 602 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 1; + redir.dest = (yyvsp[(2) - (2)].number); +@@ -2421,7 +2421,7 @@ yyreduce: + break; + + case 36: +-#line 608 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 608 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = (yyvsp[(3) - (3)].number); +@@ -2430,7 +2430,7 @@ yyreduce: + break; + + case 37: +-#line 614 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 614 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = (yyvsp[(3) - (3)].number); +@@ -2439,7 +2439,7 @@ yyreduce: + break; + + case 38: +-#line 620 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 620 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2448,7 +2448,7 @@ yyreduce: + break; + + case 39: +-#line 626 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 626 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2457,7 +2457,7 @@ yyreduce: + break; + + case 40: +-#line 632 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 632 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2466,7 +2466,7 @@ yyreduce: + break; + + case 41: +-#line 638 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 638 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2475,7 +2475,7 @@ yyreduce: + break; + + case 42: +-#line 644 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 644 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2484,7 +2484,7 @@ yyreduce: + break; + + case 43: +-#line 650 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 650 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); +@@ -2493,7 +2493,7 @@ yyreduce: + break; + + case 44: +-#line 656 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 656 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 1; + redir.dest = 0; +@@ -2502,7 +2502,7 @@ yyreduce: + break; + + case 45: +-#line 662 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 662 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = 0; +@@ -2511,7 +2511,7 @@ yyreduce: + break; + + case 46: +-#line 668 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 668 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = 0; +@@ -2520,7 +2520,7 @@ yyreduce: + break; + + case 47: +-#line 674 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 674 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 0; + redir.dest = 0; +@@ -2529,7 +2529,7 @@ yyreduce: + break; + + case 48: +-#line 680 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 680 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = 0; +@@ -2538,7 +2538,7 @@ yyreduce: + break; + + case 49: +-#line 686 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 686 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = 0; +@@ -2547,7 +2547,7 @@ yyreduce: + break; + + case 50: +-#line 692 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 692 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2556,7 +2556,7 @@ yyreduce: + break; + + case 51: +-#line 698 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 698 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); +@@ -2565,29 +2565,29 @@ yyreduce: + break; + + case 52: +-#line 706 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 706 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; } + break; + + case 53: +-#line 708 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 708 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; } + break; + + case 54: +-#line 710 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 710 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; } + break; + + case 55: +-#line 714 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 714 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.redirect) = (yyvsp[(1) - (1)].redirect); + } + break; + + case 56: +-#line 718 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 718 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + register REDIRECT *t; + +@@ -2599,27 +2599,27 @@ yyreduce: + break; + + case 57: +-#line 729 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 729 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); } + break; + + case 58: +-#line 731 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 731 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); } + break; + + case 59: +-#line 735 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 735 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); } + break; + + case 60: +-#line 737 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 737 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 61: +-#line 739 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 739 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + COMMAND *tc; + +@@ -2638,72 +2638,72 @@ yyreduce: + break; + + case 62: +-#line 755 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 755 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 63: +-#line 757 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 757 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 64: +-#line 761 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 761 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 65: +-#line 763 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 763 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 66: +-#line 765 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 765 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); } + break; + + case 67: +-#line 767 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 767 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); } + break; + + case 68: +-#line 769 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 769 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 69: +-#line 771 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 771 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 70: +-#line 773 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 773 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 71: +-#line 775 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 775 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 72: +-#line 777 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 777 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 73: +-#line 779 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 779 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 74: +-#line 781 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 781 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 75: +-#line 785 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 785 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2711,7 +2711,7 @@ yyreduce: + break; + + case 76: +-#line 790 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 790 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2719,7 +2719,7 @@ yyreduce: + break; + + case 77: +-#line 795 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 795 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2727,7 +2727,7 @@ yyreduce: + break; + + case 78: +-#line 800 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 800 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2735,7 +2735,7 @@ yyreduce: + break; + + case 79: +-#line 805 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 805 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2743,7 +2743,7 @@ yyreduce: + break; + + case 80: +-#line 810 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 810 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2751,7 +2751,7 @@ yyreduce: + break; + + case 81: +-#line 815 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 815 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2759,7 +2759,7 @@ yyreduce: + break; + + case 82: +-#line 820 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 820 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2767,7 +2767,7 @@ yyreduce: + break; + + case 83: +-#line 827 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 827 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno); + if (word_top > 0) word_top--; +@@ -2775,7 +2775,7 @@ yyreduce: + break; + + case 84: +-#line 832 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 832 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno); + if (word_top > 0) word_top--; +@@ -2783,7 +2783,7 @@ yyreduce: + break; + + case 85: +-#line 837 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 837 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno); + if (word_top > 0) word_top--; +@@ -2791,7 +2791,7 @@ yyreduce: + break; + + case 86: +-#line 842 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 842 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno); + if (word_top > 0) word_top--; +@@ -2799,7 +2799,7 @@ yyreduce: + break; + + case 87: +-#line 849 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 849 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2807,7 +2807,7 @@ yyreduce: + break; + + case 88: +-#line 854 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 854 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2815,7 +2815,7 @@ yyreduce: + break; + + case 89: +-#line 859 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 859 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2823,7 +2823,7 @@ yyreduce: + break; + + case 90: +-#line 864 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 864 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2831,7 +2831,7 @@ yyreduce: + break; + + case 91: +-#line 869 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 869 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2839,7 +2839,7 @@ yyreduce: + break; + + case 92: +-#line 874 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 874 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2847,7 +2847,7 @@ yyreduce: + break; + + case 93: +-#line 881 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 881 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2855,7 +2855,7 @@ yyreduce: + break; + + case 94: +-#line 886 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 886 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2863,7 +2863,7 @@ yyreduce: + break; + + case 95: +-#line 891 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 891 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]); + if (word_top > 0) word_top--; +@@ -2871,27 +2871,27 @@ yyreduce: + break; + + case 96: +-#line 898 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 898 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); } + break; + + case 97: +-#line 901 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 901 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); } + break; + + case 98: +-#line 904 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 904 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); } + break; + + case 99: +-#line 908 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 908 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 100: +-#line 910 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 910 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + COMMAND *tc; + +@@ -2923,7 +2923,7 @@ yyreduce: + break; + + case 101: +-#line 941 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 941 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL; +@@ -2931,7 +2931,7 @@ yyreduce: + break; + + case 102: +-#line 948 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 948 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; +@@ -2939,7 +2939,7 @@ yyreduce: + break; + + case 103: +-#line 953 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 953 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + COMMAND *tc; + +@@ -2959,7 +2959,7 @@ yyreduce: + break; + + case 104: +-#line 970 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 970 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; +@@ -2967,7 +2967,7 @@ yyreduce: + break; + + case 105: +-#line 975 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 975 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + COMMAND *tc; + +@@ -2987,7 +2987,7 @@ yyreduce: + break; + + case 106: +-#line 992 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 992 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command))); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; +@@ -2995,117 +2995,117 @@ yyreduce: + break; + + case 107: +-#line 999 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 999 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); } + break; + + case 108: +-#line 1001 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1001 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); } + break; + + case 109: +-#line 1003 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1003 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); } + break; + + case 110: +-#line 1008 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1008 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); } + break; + + case 111: +-#line 1012 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1012 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); } + break; + + case 112: +-#line 1016 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1016 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(2) - (3)].command); } + break; + + case 113: +-#line 1020 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1020 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); } + break; + + case 114: +-#line 1022 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1022 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); } + break; + + case 115: +-#line 1024 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1024 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); } + break; + + case 117: +-#line 1029 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1029 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); } + break; + + case 118: +-#line 1033 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1033 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); } + break; + + case 119: +-#line 1035 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1035 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); } + break; + + case 120: +-#line 1037 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1037 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); } + break; + + case 121: +-#line 1039 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1039 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); } + break; + + case 122: +-#line 1043 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1043 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } + break; + + case 123: +-#line 1045 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1045 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } + break; + + case 124: +-#line 1047 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1047 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } + break; + + case 125: +-#line 1049 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1049 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } + break; + + case 126: +-#line 1051 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1051 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } + break; + + case 127: +-#line 1053 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1053 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } + break; + + case 128: +-#line 1057 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1057 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); } + break; + + case 129: +-#line 1059 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1059 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); } + break; + + case 130: +-#line 1068 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1068 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = (yyvsp[(2) - (2)].command); + if (need_here_doc) +@@ -3114,14 +3114,14 @@ yyreduce: + break; + + case 132: +-#line 1077 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1077 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = (yyvsp[(2) - (2)].command); + } + break; + + case 134: +-#line 1084 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1084 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + if ((yyvsp[(1) - (3)].command)->type == cm_connection) + (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&'); +@@ -3131,17 +3131,17 @@ yyreduce: + break; + + case 136: +-#line 1095 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1095 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); } + break; + + case 137: +-#line 1097 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1097 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); } + break; + + case 138: +-#line 1099 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1099 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + if ((yyvsp[(1) - (4)].command)->type == cm_connection) + (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&'); +@@ -3151,37 +3151,37 @@ yyreduce: + break; + + case 139: +-#line 1106 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1106 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); } + break; + + case 140: +-#line 1108 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1108 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); } + break; + + case 141: +-#line 1110 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1110 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 144: +-#line 1118 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1118 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.number) = '\n'; } + break; + + case 145: +-#line 1120 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1120 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.number) = ';'; } + break; + + case 146: +-#line 1122 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1122 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.number) = yacc_EOF; } + break; + + case 149: +-#line 1136 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1136 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = (yyvsp[(1) - (1)].command); + if (need_here_doc) +@@ -3197,7 +3197,7 @@ yyreduce: + break; + + case 150: +-#line 1149 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1149 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + if ((yyvsp[(1) - (2)].command)->type == cm_connection) + (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&'); +@@ -3216,7 +3216,7 @@ yyreduce: + break; + + case 151: +-#line 1165 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1165 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + (yyval.command) = (yyvsp[(1) - (2)].command); + if (need_here_doc) +@@ -3232,17 +3232,17 @@ yyreduce: + break; + + case 152: +-#line 1180 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1180 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); } + break; + + case 153: +-#line 1182 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1182 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); } + break; + + case 154: +-#line 1184 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1184 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + if ((yyvsp[(1) - (3)].command)->type == cm_connection) + (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&'); +@@ -3252,22 +3252,22 @@ yyreduce: + break; + + case 155: +-#line 1191 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1191 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); } + break; + + case 156: +-#line 1194 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1194 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 157: +-#line 1198 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1198 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 158: +-#line 1200 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1200 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + if ((yyvsp[(2) - (2)].command)) + (yyvsp[(2) - (2)].command)->flags ^= CMD_INVERT_RETURN; /* toggle */ +@@ -3276,7 +3276,7 @@ yyreduce: + break; + + case 159: +-#line 1206 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1206 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + if ((yyvsp[(2) - (2)].command)) + (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number); +@@ -3285,7 +3285,7 @@ yyreduce: + break; + + case 160: +-#line 1212 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1212 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + ELEMENT x; + +@@ -3305,7 +3305,7 @@ yyreduce: + break; + + case 161: +-#line 1229 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1229 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + ELEMENT x; + +@@ -3326,12 +3326,12 @@ yyreduce: + break; + + case 162: +-#line 1249 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1249 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); } + break; + + case 163: +-#line 1251 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1251 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { + /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */ + COMMAND *tc; +@@ -3357,22 +3357,22 @@ yyreduce: + break; + + case 164: +-#line 1274 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1274 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.command) = (yyvsp[(1) - (1)].command); } + break; + + case 165: +-#line 1278 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1278 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE; } + break; + + case 166: +-#line 1280 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1280 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } + break; + + case 167: +-#line 1282 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1282 "/usr/src/local/bash/bash-4.3-patched/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } + break; + +@@ -3592,7 +3592,7 @@ yyreturn: + } + + +-#line 1284 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y" ++#line 1284 "/usr/src/local/bash/bash-4.3-patched/parse.y" + + + /* Initial size to allocate for tokens, and the +@@ -4850,6 +4850,16 @@ shell_ungetc (c) + eol_ungetc_lookahead = c; + } + ++char * ++parser_remaining_input () ++{ ++ if (shell_input_line == 0) ++ return 0; ++ if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len) ++ return '\0'; /* XXX */ ++ return (shell_input_line + shell_input_line_index); ++} ++ + #ifdef INCLUDE_UNUSED + /* Back the input pointer up by one, effectively `ungetting' a character. */ + static void +@@ -6339,8 +6349,8 @@ xparse_dolparen (base, string, indp, fla + reset_parser (); + /* reset_parser clears shell_input_line and associated variables */ + restore_input_line_state (&ls); +- if (interactive) +- token_to_read = 0; ++ ++ token_to_read = 0; + + /* Need to find how many characters parse_and_execute consumed, update + *indp, if flags != 0, copy the portion of the string parsed into RET diff --git a/debian/patches/bashbug-editor.diff b/debian/patches/bashbug-editor.diff new file mode 100644 index 0000000..3b751b6 --- /dev/null +++ b/debian/patches/bashbug-editor.diff @@ -0,0 +1,12 @@ +# DP: send bug reports to Debian bash maintainer too. + +--- a/support/bashbug.sh ++++ b/support/bashbug.sh +@@ -117,6 +117,7 @@ + esac ;; + esac + ++BUGBASH="${BUGBASH},bash@packages.debian.org" + BUGADDR="${1-$BUGBASH}" + + if [ -z "$DEFEDITOR" ] && [ -z "$EDITOR" ]; then diff --git a/debian/patches/bzero.diff b/debian/patches/bzero.diff new file mode 100644 index 0000000..653ed3d --- /dev/null +++ b/debian/patches/bzero.diff @@ -0,0 +1,13 @@ +--- a/lib/sh/oslib.c ++++ b/lib/sh/oslib.c +@@ -180,8 +180,8 @@ + # endif + void + bzero (s, n) +- char *s; +- int n; ++ void *s; ++ size_t n; + { + register int i; + register char *r; diff --git a/debian/patches/deb-bash-config.diff b/debian/patches/deb-bash-config.diff new file mode 100644 index 0000000..327682e --- /dev/null +++ b/debian/patches/deb-bash-config.diff @@ -0,0 +1,52 @@ +# DP: Changed compile time configuration options: +# DP: +# DP: - Set the default path to comply with Debian policy +# DP: +# DP: - Enable System-wide .bashrc file for interactive shells. +# DP: +# DP: - Enable System-wide .bash.logout file for interactive shells. +# DP: +# DP: - make non-interactive shells begun with argv[0][0] == '-' +# DP: run the startup files when not in posix mode. +# DP: +# DP: - try to check whether bash is being run by sshd and source +# DP: the .bashrc if so (like the rshd behavior). +# DP: +# DP: - don't define a default DEFAULT_MAIL_DIRECTORY, because it +# DP: can cause a timeout on NFS mounts. + +--- a/config-bot.h ++++ b/config-bot.h +@@ -196,4 +196,4 @@ + /******************************************************************/ + + /* If you don't want bash to provide a default mail file to check. */ +-/* #undef DEFAULT_MAIL_DIRECTORY */ ++#undef DEFAULT_MAIL_DIRECTORY +--- a/config-top.h ++++ b/config-top.h +@@ -80,20 +80,20 @@ + #define KSH_COMPATIBLE_SELECT + + /* System-wide .bashrc file for interactive shells. */ +-/* #define SYS_BASHRC "/etc/bash.bashrc" */ ++#define SYS_BASHRC "/etc/bash.bashrc" + + /* System-wide .bash_logout for login shells. */ +-/* #define SYS_BASH_LOGOUT "/etc/bash.bash_logout" */ ++#define SYS_BASH_LOGOUT "/etc/bash.bash_logout" + + /* Define this to make non-interactive shells begun with argv[0][0] == '-' + run the startup files when not in posix mode. */ +-/* #define NON_INTERACTIVE_LOGIN_SHELLS */ ++#define NON_INTERACTIVE_LOGIN_SHELLS + + /* Define this if you want bash to try to check whether it's being run by + sshd and source the .bashrc if so (like the rshd behavior). This checks + for the presence of SSH_CLIENT or SSH2_CLIENT in the initial environment, + which can be fooled under certain not-uncommon circumstances. */ +-/* #define SSH_SOURCE_BASHRC */ ++#define SSH_SOURCE_BASHRC + + /* Define if you want the case-capitalizing operators (~[~]) and the + `capcase' variable attribute (declare -c). */ diff --git a/debian/patches/deb-examples.diff b/debian/patches/deb-examples.diff new file mode 100644 index 0000000..4c001b8 --- /dev/null +++ b/debian/patches/deb-examples.diff @@ -0,0 +1,14 @@ +# DP: document readline header location on Debian systems + +--- a/examples/loadables/README ++++ b/examples/loadables/README +@@ -32,6 +32,9 @@ + guide'. The file template.c provides a template to use for creating + new loadable builtins. + ++On Debian GNU/Linux systems, the bash headers are in /usr/include/bash. ++The appropriate options are already set in the example Makefile. ++ + basename.c Return non-directory portion of pathname. + cat.c cat(1) replacement with no options - the way cat was intended. + cut.c cut(1) replacement. diff --git a/debian/patches/exec-redirections-doc.diff b/debian/patches/exec-redirections-doc.diff new file mode 100644 index 0000000..7e6529d --- /dev/null +++ b/debian/patches/exec-redirections-doc.diff @@ -0,0 +1,29 @@ +Index: b/doc/bash.1 +=================================================================== +--- a/doc/bash.1 ++++ b/doc/bash.1 +@@ -3633,6 +3633,10 @@ + Redirections using file descriptors greater than 9 should be used with + care, as they may conflict with file descriptors the shell uses + internally. ++.PP ++Note that the ++.B exec ++builtin command can make redirections take effect in the current shell. + .SS Redirecting Input + .PP + Redirection of input causes the file whose name results from +Index: b/doc/bashref.texi +=================================================================== +--- a/doc/bashref.texi ++++ b/doc/bashref.texi +@@ -2555,6 +2555,9 @@ + care, as they may conflict with file descriptors the shell uses + internally. + ++Note that the @code{exec} builtin command can make redirections take ++effect in the current shell. ++ + @subsection Redirecting Input + Redirection of input causes the file whose name results from + the expansion of @var{word} diff --git a/debian/patches/input-err.diff b/debian/patches/input-err.diff new file mode 100644 index 0000000..ee9ed55 --- /dev/null +++ b/debian/patches/input-err.diff @@ -0,0 +1,15 @@ +# DP: Define PGRP_PIPE to avoid race condition. + +Index: b/input.c +=================================================================== +--- a/input.c ++++ b/input.c +@@ -509,7 +509,7 @@ + if (nr == 0) + bp->b_flag |= B_EOF; + else +- bp->b_flag |= B_ERROR; ++ fatal_error("error reading input file: %s", strerror(errno)); + return (EOF); + } + diff --git a/debian/patches/man-arithmetic.diff b/debian/patches/man-arithmetic.diff new file mode 100644 index 0000000..3c150d5 --- /dev/null +++ b/debian/patches/man-arithmetic.diff @@ -0,0 +1,16 @@ +# DP: document deprecated syntax for arithmetic evaluation. + +Index: b/doc/bash.1 +=================================================================== +--- a/doc/bash.1 ++++ b/doc/bash.1 +@@ -3152,6 +3152,9 @@ + \fB$((\fP\fIexpression\fP\fB))\fP + .RE + .PP ++The old format \fB$[\fP\fIexpression\fP\fB]\fP is deprecated and will ++be removed in upcoming versions of bash. ++.PP + The + .I expression + is treated as if it were within double quotes, but a double quote diff --git a/debian/patches/man-bash.diff b/debian/patches/man-bash.diff new file mode 100644 index 0000000..30da443 --- /dev/null +++ b/debian/patches/man-bash.diff @@ -0,0 +1,11 @@ +--- a/bash/doc/bash.1 ++++ b/bash/doc/bash.1 +@@ -6420,7 +6420,7 @@ + .IR string . + .TP + .B !?\fIstring\fR\fB[?]\fR +-Refer to the most recent command preceding the current postition in the ++Refer to the most recent command preceding the current position in the + history list containing + .IR string . + The trailing \fB?\fP may be omitted if diff --git a/debian/patches/man-bashlogout.diff b/debian/patches/man-bashlogout.diff new file mode 100644 index 0000000..a7f57dc --- /dev/null +++ b/debian/patches/man-bashlogout.diff @@ -0,0 +1,16 @@ +# DP: document /etc/bash.bashrc in bash man page + +Index: b/doc/bash.1 +=================================================================== +--- a/doc/bash.1 ++++ b/doc/bash.1 +@@ -10253,6 +10253,9 @@ + .FN /etc/bash.bashrc + The systemwide per-interactive-shell startup file + .TP ++.FN /etc/bash.bash.logout ++The systemwide login shell cleanup file, executed when a login shell exits ++.TP + .FN ~/.bash_profile + The personal initialization file, executed for login shells + .TP diff --git a/debian/patches/man-bashrc.diff b/debian/patches/man-bashrc.diff new file mode 100644 index 0000000..b0ea9ed --- /dev/null +++ b/debian/patches/man-bashrc.diff @@ -0,0 +1,66 @@ +# DP: document /etc/bash.bashrc in bash man page + +Index: b/doc/bash.1 +=================================================================== +--- a/doc/bash.1 ++++ b/doc/bash.1 +@@ -182,7 +182,9 @@ + .PD + Execute commands from + .I file +-instead of the standard personal initialization file ++instead of the system wide initialization file ++.I /etc/bash.bashrc ++and the standard personal initialization file + .I ~/.bashrc + if the shell is interactive (see + .SM +@@ -213,7 +215,9 @@ + below). + .TP + .B \-\-norc +-Do not read and execute the personal initialization file ++Do not read and execute the system wide initialization file ++.I /etc/bash.bashrc ++and the personal initialization file + .I ~/.bashrc + if the shell is interactive. + This option is on by default if the shell is invoked as +@@ -326,13 +330,15 @@ + .PP + When an interactive shell that is not a login shell is started, + .B bash +-reads and executes commands from \fI~/.bashrc\fP, if that file exists. ++reads and executes commands from \fI/etc/bash.bashrc\fP and \fI~/.bashrc\fP, ++if these files exist. + This may be inhibited by using the + .B \-\-norc + option. + The \fB\-\-rcfile\fP \fIfile\fP option will force + .B bash +-to read and execute commands from \fIfile\fP instead of \fI~/.bashrc\fP. ++to read and execute commands from \fIfile\fP instead of ++\fI/etc/bash.bashrc\fP and \fI~/.bashrc\fP. + .PP + When + .B bash +@@ -418,7 +424,8 @@ + If + .B bash + determines it is being run in this fashion, it reads and executes +-commands from \fI~/.bashrc\fP, if that file exists and is readable. ++commands from \fI~/.bashrc\fP and \fI~/.bashrc\fP, if these files ++exist and are readable. + It will not do this if invoked as \fBsh\fP. + The + .B \-\-norc +@@ -10243,6 +10250,9 @@ + .FN /etc/profile + The systemwide initialization file, executed for login shells + .TP ++.FN /etc/bash.bashrc ++The systemwide per-interactive-shell startup file ++.TP + .FN ~/.bash_profile + The personal initialization file, executed for login shells + .TP diff --git a/debian/patches/man-builtin.dpatch b/debian/patches/man-builtin.dpatch new file mode 100644 index 0000000..6abaef8 --- /dev/null +++ b/debian/patches/man-builtin.dpatch @@ -0,0 +1,29 @@ +#! /bin/sh -e + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: fix man page include + +--- doc/builtins.1~ Mon Nov 29 22:30:13 1999 ++++ doc/builtins.1 Tue Aug 1 21:54:06 2000 +@@ -10,6 +10,6 @@ + ulimit, umask, unalias, unset, until, wait, while \- bash built-in commands, see \fBbash\fR(1) + .SH BASH BUILTIN COMMANDS + .nr zZ 1 +-.so bash.1 ++.so /usr/share/man/man1/bash.1 + .SH SEE ALSO + bash(1), sh(1) diff --git a/debian/patches/man-fignore.diff b/debian/patches/man-fignore.diff new file mode 100644 index 0000000..808963c --- /dev/null +++ b/debian/patches/man-fignore.diff @@ -0,0 +1,17 @@ +# DP: bash(1): mention quoting when assigning to FIGNORE + +Index: b/doc/bash.1 +=================================================================== +--- a/doc/bash.1 ++++ b/doc/bash.1 +@@ -1997,7 +1997,9 @@ + is excluded from the list of matched filenames. + A sample value is + .if t \f(CW".o:~"\fP. +-.if n ".o:~". ++.if n ".o:~" ++(Quoting is needed when assigning a value to this variable, ++which contains tildes). + .TP + .B FUNCNEST + If set to a numeric value greater than 0, defines a maximum function diff --git a/debian/patches/man-nocaseglob.diff b/debian/patches/man-nocaseglob.diff new file mode 100644 index 0000000..257e4ed --- /dev/null +++ b/debian/patches/man-nocaseglob.diff @@ -0,0 +1,17 @@ +# DP: Clarify documentation about case-insensitive pathname expansion + +Index: b/doc/bash.1 +=================================================================== +--- a/doc/bash.1 ++++ b/doc/bash.1 +@@ -3315,6 +3315,10 @@ + .B nocaseglob + is enabled, the match is performed without regard to the case + of alphabetic characters. ++Note that when using range expressions like ++[a-z] (see below), letters of the other case may be included, ++depending on the setting of ++.B LC_COLLATE. + When a pattern is used for pathname expansion, + the character + .B ``.'' diff --git a/debian/patches/man-test.diff b/debian/patches/man-test.diff new file mode 100644 index 0000000..ae9c8bd --- /dev/null +++ b/debian/patches/man-test.diff @@ -0,0 +1,15 @@ +# DP: document conditional file expressions acting on the target of +# DP: symbolic links as well (except -h, -L). + +--- a/builtins/test.def ++++ b/builtins/test.def +@@ -64,6 +64,9 @@ + + FILE1 -ef FILE2 True if file1 is a hard link to file2. + ++All file operators except -h and -L are acting on the target of a symbolic ++link, not on the symlink itself, if FILE is a symbolic link. ++ + String operators: + + -z STRING True if string is empty. diff --git a/debian/patches/man-test2.diff b/debian/patches/man-test2.diff new file mode 100644 index 0000000..285adcb --- /dev/null +++ b/debian/patches/man-test2.diff @@ -0,0 +1,46 @@ +# DP: Document handling of parameters of the test builtin. + +Index: b/builtins/test.def +=================================================================== +--- a/builtins/test.def ++++ b/builtins/test.def +@@ -99,6 +99,9 @@ + less-than, less-than-or-equal, greater-than, or greater-than-or-equal + than ARG2. + ++See the bash manual page bash(1) for the handling of parameters (i.e. ++missing parameters). ++ + Exit Status: + Returns success if EXPR evaluates to true; fails if EXPR evaluates to + false or an invalid argument is given. +Index: b/doc/bash.1 +=================================================================== +--- a/doc/bash.1 ++++ b/doc/bash.1 +@@ -712,6 +712,10 @@ + .if n .sp 1 + When used with \fB[[\fP, the \fB<\fP and \fB>\fP operators sort + lexicographically using the current locale. ++.PP ++See the description of the \fItest\fP builtin command (section SHELL ++BUILTIN COMMANDS below) for the handling of parameters (i.e. ++missing parameters). + .if t .sp 0.5 + .if n .sp 1 + When the \fB==\fP and \fB!=\fP operators are used, the string to the +Index: b/doc/bashref.texi +=================================================================== +--- a/doc/bashref.texi ++++ b/doc/bashref.texi +@@ -6448,6 +6448,10 @@ + Unless otherwise specified, primaries that operate on files follow symbolic + links and operate on the target of the link, rather than the link itself. + ++See the description of the @code{test} builtin command (section ++@pxref{Bash Builtins} below) for the handling of parameters ++(i.e. missing parameters). ++ + @table @code + @item -a @var{file} + True if @var{file} exists. diff --git a/debian/patches/man-vx-opts.dpatch b/debian/patches/man-vx-opts.dpatch new file mode 100644 index 0000000..e85b350 --- /dev/null +++ b/debian/patches/man-vx-opts.dpatch @@ -0,0 +1,34 @@ +#! /bin/sh -e + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p1 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p1 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: document -v / -x options + +--- ./doc/bash.1~ Wed Jan 20 22:48:04 1999 ++++ ./doc/bash.1 Sun Nov 14 13:26:59 1999 +@@ -104,6 +104,12 @@ + This option allows the positional parameters to be set + when invoking an interactive shell. + .TP ++.B \-v ++Print shell input lines as they are read. ++.TP ++.B \-x ++Print commands and their arguments as they are executed. ++.TP + .B \-D + A list of all double-quoted strings preceded by \fB$\fP + is printed on the standard ouput. diff --git a/debian/patches/no-brk-caching.diff b/debian/patches/no-brk-caching.diff new file mode 100644 index 0000000..dc4ba85 --- /dev/null +++ b/debian/patches/no-brk-caching.diff @@ -0,0 +1,47 @@ +# DP: Don't cache the value of brk between sbrk calls. + +--- a/lib/malloc/malloc.c ++++ b/lib/malloc/malloc.c +@@ -227,8 +227,6 @@ + static int pagebucket; /* bucket for requests a page in size */ + static int maxbuck; /* highest bucket receiving allocation request. */ + +-static char *memtop; /* top of heap */ +- + static const unsigned long binsizes[NBUCKETS] = { + 8UL, 16UL, 32UL, 64UL, 128UL, 256UL, 512UL, 1024UL, 2048UL, 4096UL, + 8192UL, 16384UL, 32768UL, 65536UL, 131072UL, 262144UL, 524288UL, +@@ -538,7 +536,6 @@ + siz = binsize (nu); + /* Should check for errors here, I guess. */ + sbrk (-siz); +- memtop -= siz; + + #ifdef MALLOC_STATS + _mstats.nsbrk++; +@@ -633,8 +630,6 @@ + if ((long)mp == -1) + goto morecore_done; + +- memtop += sbrk_amt; +- + /* shouldn't happen, but just in case -- require 8-byte alignment */ + if ((long)mp & MALIGN_MASK) + { +@@ -684,7 +679,7 @@ + Some of this partial page will be wasted space, but we'll use as + much as we can. Once we figure out how much to advance the break + pointer, go ahead and do it. */ +- memtop = curbrk = sbrk (0); ++ curbrk = sbrk (0); + sbrk_needed = pagesz - ((long)curbrk & (pagesz - 1)); /* sbrk(0) % pagesz */ + if (sbrk_needed < 0) + sbrk_needed += pagesz; +@@ -699,7 +694,6 @@ + curbrk = sbrk (sbrk_needed); + if ((long)curbrk == -1) + return -1; +- memtop += sbrk_needed; + + /* Take the memory which would otherwise be wasted and populate the most + popular bin (2 == 32 bytes) with it. Add whatever we need to curbrk diff --git a/debian/patches/pgrp-pipe.diff b/debian/patches/pgrp-pipe.diff new file mode 100644 index 0000000..ccc9bb3 --- /dev/null +++ b/debian/patches/pgrp-pipe.diff @@ -0,0 +1,11 @@ +# DP: Define PGRP_PIPE to avoid race condition. + +--- a/config-bot.h ++++ b/config-bot.h +@@ -197,3 +197,6 @@ + + /* If you don't want bash to provide a default mail file to check. */ + #undef DEFAULT_MAIL_DIRECTORY ++ ++/* Bug #224543 */ ++#define PGRP_PIPE 1 diff --git a/debian/patches/privmode.diff b/debian/patches/privmode.diff new file mode 100644 index 0000000..d138669 --- /dev/null +++ b/debian/patches/privmode.diff @@ -0,0 +1,19 @@ +# DP: XXX missing description +# DP: +# DP: Comment from Chet Ramey <chet@nike.ins.cwru.edu>: +# DP: +# DP: Nope. This will allow setuid scripts if not called as `sh' and not +# DP: called with the -p option. I won't install this. + + +--- a/shell.c ++++ b/shell.c +@@ -492,7 +492,7 @@ + if (dump_translatable_strings) + read_but_dont_execute = 1; + +- if (running_setuid && privileged_mode == 0) ++ if (running_setuid && privileged_mode == 0 && act_like_sh == 0) + disable_priv_mode (); + + /* Need to get the argument to a -c option processed in the diff --git a/debian/patches/random.dpatch b/debian/patches/random.dpatch new file mode 100644 index 0000000..6304468 --- /dev/null +++ b/debian/patches/random.dpatch @@ -0,0 +1,107 @@ +#! /bin/sh -e + +dir=. +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir=$3 +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p1 < $0 + echo '2.05' > $dir/_distribution + echo '0' > $dir/_patchlevel + cd $dir && autoconf + rm -f $dir/_distribution $dir/_patchlevel + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p1 < $0 + rm -f $dir/configure $dir/_distribution $dir/_patchlevel + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: use the system random functions + +diff -urb bash.orig/config.h.in bash/config.h.in +--- bash.orig/config.h.in 2003-09-22 14:42:35.000000000 +0200 ++++ bash/config.h.in 2003-09-28 00:27:15.000000000 +0200 +@@ -606,6 +606,9 @@ + /* Define if you have the putenv function. */ + #undef HAVE_PUTENV + ++/* Define if you have the random function. */ ++#undef HAVE_RANDOM ++ + /* Define if you have the readlink function. */ + #undef HAVE_READLINK + +@@ -696,6 +699,9 @@ + /* Define if you have the strsignal function or macro. */ + #undef HAVE_STRSIGNAL + ++/* Define if you have the srandom function. */ ++#undef HAVE_SRANDOM ++ + /* Define if you have the sysconf function. */ + #undef HAVE_SYSCONF + +diff -urb bash.orig/variables.c bash/variables.c +--- bash.orig/variables.c 2003-07-31 16:28:57.000000000 +0200 ++++ bash/variables.c 2003-09-28 00:27:15.000000000 +0200 +@@ -1098,16 +1098,22 @@ + static unsigned long rseed = 1; + static int last_random_value; + +-/* A linear congruential random number generator based on the example +- one in the ANSI C standard. This one isn't very good, but a more +- complicated one is overkill. */ ++/* Use the random number genrator provided by the standard C library, ++ else use a linear congruential random number generator based on the ++ ANSI C standard. This one isn't very good (the values are alternately ++ odd and even, for example), but a more complicated one is overkill. */ + + /* Returns a pseudo-random number between 0 and 32767. */ + static int + brand () + { ++#if defined(HAVE_RANDOM) ++ rseed = (unsigned int) (labs(random()) & 32767); ++ return rseed; ++#else + rseed = rseed * 1103515245 + 12345; + return ((unsigned int)((rseed >> 16) & 32767)); /* was % 32768 */ ++#endif + } + + /* Set the random number generator seed to SEED. */ +@@ -1115,8 +1121,12 @@ + sbrand (seed) + unsigned long seed; + { ++#if defined(HAVE_SRANDOM) ++ srandom(seed); ++#else + rseed = seed; + last_random_value = 0; ++#endif + } + + static SHELL_VAR * +--- bash/configure.in~ 2004-03-02 00:04:29.000000000 +0100 ++++ bash/configure.in 2004-03-02 00:05:48.000000000 +0100 +@@ -667,6 +667,9 @@ + + AC_FUNC_MKTIME + ++dnl checks for random functions ++AC_CHECK_FUNCS(random srandom) ++ + dnl + dnl Checks for lib/intl and related code (uses some of the output from + dnl AM_GNU_GETTEXT) diff --git a/debian/patches/rbash-manpage.diff b/debian/patches/rbash-manpage.diff new file mode 100644 index 0000000..0103e61 --- /dev/null +++ b/debian/patches/rbash-manpage.diff @@ -0,0 +1,12 @@ +# DP: doc/rbash.1: fix bash(1) reference + +--- a/doc/rbash.1 ++++ b/doc/rbash.1 +@@ -3,6 +3,6 @@ + rbash \- restricted bash, see \fBbash\fR(1) + .SH RESTRICTED SHELL + .nr zY 1 +-.so bash.1 ++.so man1/bash.1 + .SH SEE ALSO + bash(1) diff --git a/debian/patches/rl-del-backspace-policy.dpatch b/debian/patches/rl-del-backspace-policy.dpatch new file mode 100644 index 0000000..ec56b43 --- /dev/null +++ b/debian/patches/rl-del-backspace-policy.dpatch @@ -0,0 +1,48 @@ +#! /bin/sh -e + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p1 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p1 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: Handle Debian Backspace/Delete keyboard policy + +diff -urb bash.orig/lib/readline/terminal.c bash/lib/readline/terminal.c +--- bash.orig/lib/readline/terminal.c 2003-09-18 17:03:42.000000000 +0200 ++++ bash/lib/readline/terminal.c 2003-09-27 23:25:59.000000000 +0200 +@@ -148,6 +148,9 @@ + /* Insert key */ + static char *_rl_term_kI; + ++/* The key sequence sent by the Delete key, if any. */ ++static char *_rl_term_kD; ++ + /* Cursor control */ + static char *_rl_term_vs; /* very visible */ + static char *_rl_term_ve; /* normal */ +@@ -314,6 +317,7 @@ + { "ic", &_rl_term_ic }, + { "im", &_rl_term_im }, + { "kH", &_rl_term_kH }, /* home down ?? */ ++ { "kD", &_rl_term_kD }, /* delete */ + { "kI", &_rl_term_kI }, /* insert */ + { "kd", &_rl_term_kd }, + { "ke", &_rl_term_ke }, /* end keypad mode */ +@@ -492,6 +496,7 @@ + + rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */ + rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line); /* End */ ++ rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete); /* Delete */ + + _rl_keymap = xkeymap; + } diff --git a/debian/patches/rl-examples-bdb.dpatch b/debian/patches/rl-examples-bdb.dpatch new file mode 100644 index 0000000..33cca15 --- /dev/null +++ b/debian/patches/rl-examples-bdb.dpatch @@ -0,0 +1,30 @@ +#! /bin/sh -e + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p1 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p1 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: Modified readline examples to properly build with Debian setup. + +--- ./lib/readline/examples/rl.c~ Mon Nov 8 22:22:03 1999 ++++ ./lib/readline/examples/rl.c Fri Dec 31 17:34:30 1999 +@@ -11,7 +11,7 @@ + + #include <stdio.h> + #include <sys/types.h> +-#include "posixstat.h" ++#include <sys/stat.h> + + #if defined (READLINE_LIBRARY) + # include "readline.h" diff --git a/debian/patches/rl-header.dpatch b/debian/patches/rl-header.dpatch new file mode 100644 index 0000000..d147813 --- /dev/null +++ b/debian/patches/rl-header.dpatch @@ -0,0 +1,28 @@ +#! /bin/sh -e + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: include stdio.h in readline.h +--- lib/readline/readline.h~ Thu Aug 5 14:10:59 1999 ++++ lib/readline/readline.h Mon Oct 9 20:32:56 2000 +@@ -32,6 +32,7 @@ + # include "keymaps.h" + # include "tilde.h" + #else ++# include <stdio.h> + # include <readline/rlstdc.h> + # include <readline/keymaps.h> + # include <readline/tilde.h> diff --git a/debian/patches/rl-setenv.dpatch b/debian/patches/rl-setenv.dpatch new file mode 100644 index 0000000..9ae1d08 --- /dev/null +++ b/debian/patches/rl-setenv.dpatch @@ -0,0 +1,30 @@ +#! /bin/sh -e + +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch $pdir -f --no-backup-if-mismatch -p0 < $0;; + -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p0 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +# DP: Prefer setenv over putenv + +--- lib/readline/shell.c~ 2004-10-17 13:07:37.000000000 +0200 ++++ lib/readline/shell.c 2004-10-17 13:06:48.000000000 +0200 +@@ -122,7 +122,7 @@ + { + char *b; + +-#if defined (HAVE_PUTENV) ++#if 0 + b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("LINES=") + 1); + sprintf (b, "LINES=%d", lines); + putenv (b); diff --git a/debian/patches/series b/debian/patches/series new file mode 100644 index 0000000..f769de5 --- /dev/null +++ b/debian/patches/series @@ -0,0 +1,51 @@ +bash43-001.diff +bash43-002.diff +bash43-003.diff +bash43-004.diff +bash43-005.diff +bash43-006.diff +bash43-007.diff +bash43-008.diff +bash43-009.diff +bash43-010.diff +bash43-011.diff +bash43-012.diff +bash43-013.diff +bash43-014.diff +bash43-015.diff +bash43-016.diff +bash43-017.diff +bash43-018.diff +bash43-019.diff +bash43-020.diff +bash43-021.diff +bash43-022.diff +bash43-023.diff +bash43-024.diff +bash43-025.diff +bash43-026.diff +bash43-027.diff +bash43-028.diff +bash43-029.diff +bash43-030.diff +bashbug-editor.diff +deb-bash-config.diff +deb-examples.diff +man-arithmetic.diff +man-fignore.diff +man-bashrc.diff +man-bashlogout.diff +man-nocaseglob.diff +man-test.diff +man-test2.diff +privmode.diff +rbash-manpage.diff +bash-default-editor.diff +bash-subst-param-length.diff +pgrp-pipe.diff +input-err.diff +exec-redirections-doc.diff +bash-aliases-repeat.diff +# no-brk-caching.diff +use-system-texi2html.diff +bzero.diff diff --git a/debian/patches/use-system-texi2html.diff b/debian/patches/use-system-texi2html.diff new file mode 100644 index 0000000..274d9e2 --- /dev/null +++ b/debian/patches/use-system-texi2html.diff @@ -0,0 +1,15 @@ +Index: b/doc/Makefile.in +=================================================================== +--- a/doc/Makefile.in ++++ b/doc/Makefile.in +@@ -70,8 +70,8 @@ + TEX = tex + + MAKEINFO = makeinfo +-TEXI2DVI = ${SUPPORT_SRCDIR}/texi2dvi +-TEXI2HTML = ${SUPPORT_SRCDIR}/texi2html ++TEXI2DVI = texi2dvi ++TEXI2HTML = texi2html + MAN2HTML = ${BUILD_DIR}/support/man2html + HTMLPOST = ${srcdir}/htmlpost.sh + INFOPOST = ${srcdir}/infopost.sh |