diff --git a/.gitignore b/.gitignore index a36a09ce..4ba9e218 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /bash/bash-4.3.30-32 +/bash/bash-5.2-32 /bind/bind-9.10.1-P1-32 /binutils/binutils-2.34-32* /bzip2/bzip2-1.0.6* diff --git a/bash/Makefile b/bash/Makefile index da042c28..e849036b 100644 --- a/bash/Makefile +++ b/bash/Makefile @@ -21,7 +21,7 @@ # Copyright (c) 2012, Joyent Inc. All rights reserved. # -VER = bash-4.3.30 +VER = bash-5.2 include ../Makefile.defs diff --git a/bash/Patches/bash52-001.patch b/bash/Patches/bash52-001.patch new file mode 100644 index 00000000..5c1095eb --- /dev/null +++ b/bash/Patches/bash52-001.patch @@ -0,0 +1,46 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-001 + +Bug-Reported-by: Emanuele Torre +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-09/msg00060.html + +Bug-Description: + +Expanding unset arrays in an arithmetic context can cause a segmentation fault. + +Patch (apply with `patch -p1'): + +*** a/subst.c 2022-08-31 17:36:46.000000000 -0400 +--- b/subst.c 2022-09-30 09:12:05.000000000 -0400 +*************** +*** 10858,10862 **** + t = expand_subscript_string (exp, quoted & ~(Q_ARITH|Q_DOUBLE_QUOTES)); + free (exp); +! exp = sh_backslash_quote (t, abstab, 0); + free (t); + +--- 10858,10862 ---- + t = expand_subscript_string (exp, quoted & ~(Q_ARITH|Q_DOUBLE_QUOTES)); + free (exp); +! exp = t ? sh_backslash_quote (t, abstab, 0) : savestring (""); + free (t); + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 0 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 1 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-002.patch b/bash/Patches/bash52-002.patch new file mode 100644 index 00000000..16a94b6b --- /dev/null +++ b/bash/Patches/bash52-002.patch @@ -0,0 +1,46 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-002 + +Bug-Reported-by: Kan-Ru Chen +Bug-Reference-ID: +Bug-Reference-URL: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1021109 + +Bug-Description: + +Starting bash with an invalid locale specification for LC_ALL/LANG/LC_CTYPE +can cause the shell to crash. + +Patch (apply with `patch -p1'): + +*** a/lib/readline/nls.c 2022-08-15 09:38:51.000000000 -0400 +--- b/lib/readline/nls.c 2022-10-05 09:23:22.000000000 -0400 +*************** +*** 142,145 **** +--- 142,149 ---- + lspec = ""; + ret = setlocale (LC_CTYPE, lspec); /* ok, since it does not change locale */ ++ if (ret == 0 || *ret == 0) ++ ret = setlocale (LC_CTYPE, (char *)NULL); ++ if (ret == 0 || *ret == 0) ++ ret = RL_DEFAULT_LOCALE; + #else + ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec; + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 1 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 2 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-003.patch b/bash/Patches/bash52-003.patch new file mode 100644 index 00000000..27595d4c --- /dev/null +++ b/bash/Patches/bash52-003.patch @@ -0,0 +1,89 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-003 + +Bug-Reported-by: D630 +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00092.html + +Bug-Description: + +Command substitutions need to preserve newlines instead of replacing them +with semicolons, especially in the presence of multiple here-documents. + +Patch (apply with `patch -p1'): + +*** a/print_cmd.c 2022-07-26 09:16:39.000000000 -0400 +--- b/print_cmd.c 2022-10-17 10:41:06.000000000 -0400 +*************** +*** 298,305 **** +--- 298,307 ---- + { + char c = command->value.Connection->connector; ++ int was_newline; + + s[0] = printing_comsub ? c : ';'; + s[1] = '\0'; + ++ was_newline = deferred_heredocs == 0 && was_heredoc == 0 && c == '\n'; + if (deferred_heredocs == 0) + { +*************** +*** 315,318 **** +--- 317,322 ---- + if (inside_function_def) + cprintf ("\n"); ++ else if (printing_comsub && c == '\n' && was_newline == 0) ++ cprintf ("\n"); /* preserve newlines in comsubs but don't double them */ + else + { +*************** +*** 1366,1370 **** + } + else +! newline ("}"); + + dispose_command (cmdcopy); +--- 1371,1379 ---- + } + else +! { +! /* { */ +! newline ("}"); +! was_heredoc = 0; /* not printing any here-documents now */ +! } + + dispose_command (cmdcopy); +*************** +*** 1443,1447 **** + } + else +! newline ("}"); + + result = the_printed_command; +--- 1452,1459 ---- + } + else +! { /* { */ +! newline ("}"); +! was_heredoc = 0; +! } + + result = the_printed_command; +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 2 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 3 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-004.patch b/bash/Patches/bash52-004.patch new file mode 100644 index 00000000..1234f93b --- /dev/null +++ b/bash/Patches/bash52-004.patch @@ -0,0 +1,70 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-004 + +Bug-Reported-by: Antoine +Bug-Reference-ID: <8bd59753-05ff-9b09-2337-2c7f52ded650@glitchimini.net> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00022.html + +Bug-Description: + +Bash needs to keep better track of nested brace expansions to avoid problems +with quoting and POSIX semantics. + +Patch (apply with `patch -p1'): + +*** a/subst.c 2022-10-05 10:22:02.000000000 -0400 +--- b/subst.c 2022-10-06 15:19:08.000000000 -0400 +*************** +*** 1799,1802 **** +--- 1804,1810 ---- + } + ++ #define PARAMEXPNEST_MAX 32 // for now ++ static int dbstate[PARAMEXPNEST_MAX]; ++ + /* Extract a parameter expansion expression within ${ and } from STRING. + Obey the Posix.2 rules for finding the ending `}': count braces while +*************** +*** 1829,1832 **** +--- 1837,1842 ---- + return (extract_heredoc_dolbrace_string (string, sindex, quoted, flags)); + ++ dbstate[0] = dolbrace_state; ++ + pass_character = 0; + nesting_level = 1; +*************** +*** 1853,1856 **** +--- 1863,1868 ---- + if (string[i] == '$' && string[i+1] == LBRACE) + { ++ if (nesting_level < PARAMEXPNEST_MAX) ++ dbstate[nesting_level] = dolbrace_state; + nesting_level++; + i += 2; +*************** +*** 1865,1868 **** +--- 1877,1881 ---- + if (nesting_level == 0) + break; ++ dolbrace_state = (nesting_level < PARAMEXPNEST_MAX) ? dbstate[nesting_level] : dbstate[0]; /* Guess using initial state */ + i++; + continue; +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 3 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 4 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-005.patch b/bash/Patches/bash52-005.patch new file mode 100644 index 00000000..1c1fec01 --- /dev/null +++ b/bash/Patches/bash52-005.patch @@ -0,0 +1,47 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-005 + +Bug-Reported-by: Justin Wood (Callek) +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00088.html + +Bug-Description: + +Null pattern substitution replacement strings can cause a crash. + +Patch (apply with `patch -p1'): + +*** a/subst.c 2022-10-05 10:22:02.000000000 -0400 +--- b/subst.c 2022-10-13 16:57:26.000000000 -0400 +*************** +*** 8966,8970 **** + } + else if (*string == 0 && (match_pattern (string, pat, mtype, &s, &e) != 0)) +! return ((mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2) : savestring (rep)); + + ret = (char *)xmalloc (rsize = 64); +--- 8966,8971 ---- + } + else if (*string == 0 && (match_pattern (string, pat, mtype, &s, &e) != 0)) +! return (mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2) +! : (rep ? savestring (rep) : savestring ("")); + + ret = (char *)xmalloc (rsize = 64); +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 4 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 5 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-006.patch b/bash/Patches/bash52-006.patch new file mode 100644 index 00000000..dba98133 --- /dev/null +++ b/bash/Patches/bash52-006.patch @@ -0,0 +1,293 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-006 + +Bug-Reported-by: feng xiangjun +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00089.html + +Bug-Description: + +In interactive shells, interrupting the shell while entering a command +substitution can inhibit alias expansion. + +Patch (apply with `patch -p1'): + +*** a/parse.y 2022-10-08 13:10:06.000000000 -0400 +--- b/parse.y 2022-10-14 10:03:19.000000000 -0400 +*************** +*** 3307,3310 **** +--- 3307,3312 ---- + extended_glob = global_extglob; + #endif ++ if (parser_state & (PST_CMDSUBST|PST_STRING)) ++ expand_aliases = expaliases_flag; + + parser_state = 0; +*************** +*** 4389,4392 **** +--- 4391,4395 ---- + parser_state |= PST_NOERROR; + ++ parser_state |= PST_STRING; + expand_aliases = 0; + +*************** +*** 6402,6406 **** + parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */ + /* State flags we want to set for this run through the tokenizer. */ +! parser_state |= PST_COMPASSIGN|PST_REPARSE; + } + +--- 6405,6409 ---- + parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */ + /* State flags we want to set for this run through the tokenizer. */ +! parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING; + } + +*** a/parser.h 2022-08-30 11:39:56.000000000 -0400 +--- b/parser.h 2022-10-14 09:56:18.000000000 -0400 +*************** +*** 51,54 **** +--- 51,55 ---- + #define PST_NOEXPAND 0x400000 /* don't expand anything in read_token_word; for command substitution */ + #define PST_NOERROR 0x800000 /* don't print error messages in yyerror */ ++ #define PST_STRING 0x1000000 /* parsing a string to a command or word list */ + + /* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */ +*** a/builtins/shopt.def 2022-10-07 10:25:55.000000000 -0400 +--- b/builtins/shopt.def 2022-10-14 09:30:11.000000000 -0400 +*************** +*** 150,153 **** +--- 150,156 ---- + #endif + ++ int expaliases_flag = 0; ++ static int shopt_set_expaliases PARAMS((char *, int)); ++ + static int shopt_set_debug_mode PARAMS((char *, int)); + +*************** +*** 199,203 **** + { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL }, + { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL }, +! { "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL }, + #if defined (DEBUGGER) + { "extdebug", &debugging_mode, shopt_set_debug_mode }, +--- 202,206 ---- + { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL }, + { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL }, +! { "expand_aliases", &expaliases_flag, shopt_set_expaliases }, + #if defined (DEBUGGER) + { "extdebug", &debugging_mode, shopt_set_debug_mode }, +*************** +*** 351,355 **** + allow_null_glob_expansion = glob_dot_filenames = 0; + no_exit_on_failed_exec = 0; +! expand_aliases = 0; + extended_quote = 1; + fail_glob_expansion = 0; +--- 354,358 ---- + allow_null_glob_expansion = glob_dot_filenames = 0; + no_exit_on_failed_exec = 0; +! expand_aliases = expaliases_flag = 0; + extended_quote = 1; + fail_glob_expansion = 0; +*************** +*** 632,635 **** +--- 635,647 ---- + } + ++ static int ++ shopt_set_expaliases (option_name, mode) ++ char *option_name; ++ int mode; ++ { ++ expand_aliases = expaliases_flag; ++ return 0; ++ } ++ + #if defined (READLINE) + static int +*** a/builtins/common.h 2022-10-07 10:10:17.000000000 -0400 +--- b/builtins/common.h 2022-10-14 09:29:25.000000000 -0400 +*************** +*** 258,261 **** +--- 258,263 ---- + #endif + ++ extern int expaliases_flag; ++ + /* variables from source.def */ + extern int source_searches_cwd; +*** a/execute_cmd.c 2022-10-10 10:48:54.000000000 -0400 +--- b/execute_cmd.c 2022-10-14 09:32:24.000000000 -0400 +*************** +*** 1537,1541 **** + aliases. */ + if (ois != interactive_shell) +! expand_aliases = 0; + } + +--- 1537,1541 ---- + aliases. */ + if (ois != interactive_shell) +! expand_aliases = expaliases_flag = 0; + } + +*** a/general.c 2021-11-04 14:12:38.000000000 -0400 +--- b/general.c 2022-10-14 09:34:24.000000000 -0400 +*************** +*** 92,96 **** + &interactive_comments, + &source_uses_path, +! &expand_aliases, + &inherit_errexit, + &print_shift_error, +--- 92,96 ---- + &interactive_comments, + &source_uses_path, +! &expaliases_flag, + &inherit_errexit, + &print_shift_error, +*************** +*** 107,111 **** + if (on != 0) + { +! interactive_comments = source_uses_path = expand_aliases = 1; + inherit_errexit = 1; + source_searches_cwd = 0; +--- 107,112 ---- + if (on != 0) + { +! interactive_comments = source_uses_path = 1; +! expand_aliases = expaliases_flag = 1; + inherit_errexit = 1; + source_searches_cwd = 0; +*************** +*** 117,120 **** +--- 118,122 ---- + { + set_posix_options (saved_posix_vars); ++ expand_aliases = expaliases_flag; + free (saved_posix_vars); + saved_posix_vars = 0; +*************** +*** 123,127 **** + { + source_searches_cwd = 1; +! expand_aliases = interactive_shell; + print_shift_error = 0; + } +--- 125,129 ---- + { + source_searches_cwd = 1; +! expand_aliases = expaliases_flag = interactive_shell; /* XXX */ + print_shift_error = 0; + } + +*** a/shell.c 2022-03-04 15:13:00.000000000 -0500 +--- b/shell.c 2022-10-14 09:36:19.000000000 -0400 +*************** +*** 1845,1850 **** + init_interactive () + { +! expand_aliases = interactive_shell = startup_state = 1; +! interactive = 1; + #if defined (HISTORY) + if (enable_history_list == -1) +--- 1845,1850 ---- + init_interactive () + { +! expand_aliases = expaliases_flag = 1; +! interactive_shell = startup_state = interactive = 1; + #if defined (HISTORY) + if (enable_history_list == -1) +*************** +*** 1866,1870 **** + #endif /* HISTORY */ + interactive_shell = startup_state = interactive = 0; +! expand_aliases = posixly_correct; /* XXX - was 0 not posixly_correct */ + no_line_editing = 1; + #if defined (JOB_CONTROL) +--- 1866,1870 ---- + #endif /* HISTORY */ + interactive_shell = startup_state = interactive = 0; +! expand_aliases = expaliases_flag = posixly_correct; /* XXX - was 0 not posixly_correct */ + no_line_editing = 1; + #if defined (JOB_CONTROL) +*************** +*** 1883,1887 **** + #endif + init_noninteractive (); +! expand_aliases = interactive_shell = startup_state = 1; + #if defined (HISTORY) + remember_on_history = enable_history_list; /* XXX */ +--- 1883,1887 ---- + #endif + init_noninteractive (); +! expand_aliases = expaliases_flag = interactive_shell = startup_state = 1; + #if defined (HISTORY) + remember_on_history = enable_history_list; /* XXX */ +*************** +*** 2026,2030 **** + forced_interactive = interactive_shell = 0; + subshell_environment = running_in_background = 0; +! expand_aliases = 0; + bash_argv_initialized = 0; + +--- 2026,2030 ---- + forced_interactive = interactive_shell = 0; + subshell_environment = running_in_background = 0; +! expand_aliases = expaliases_flag = 0; + bash_argv_initialized = 0; + +*** a/y.tab.c 2022-09-23 10:18:27.000000000 -0400 +--- b/y.tab.c 2022-10-14 14:57:26.000000000 -0400 +*************** +*** 5618,5621 **** +--- 5618,5623 ---- + extended_glob = global_extglob; + #endif ++ if (parser_state & (PST_CMDSUBST|PST_STRING)) ++ expand_aliases = expaliases_flag; + + parser_state = 0; +*************** +*** 6700,6703 **** +--- 6702,6706 ---- + parser_state |= PST_NOERROR; + ++ parser_state |= PST_STRING; + expand_aliases = 0; + +*************** +*** 8713,8717 **** + parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */ + /* State flags we want to set for this run through the tokenizer. */ +! parser_state |= PST_COMPASSIGN|PST_REPARSE; + } + +--- 8716,8720 ---- + parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */ + /* State flags we want to set for this run through the tokenizer. */ +! parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING; + } + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 5 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 6 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-007.patch b/bash/Patches/bash52-007.patch new file mode 100644 index 00000000..a0855de4 --- /dev/null +++ b/bash/Patches/bash52-007.patch @@ -0,0 +1,262 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-007 + +Bug-Reported-by: Bruce Jerrick +Bug-Reference-ID: +Bug-Reference-URL: https://bugzilla.redhat.com/show_bug.cgi?id=2134307 + +Bug-Description: + +This patch fixes several problems with alias expansion inside command +substitutions when in POSIX mode. + +Patch (apply with `patch -p1'): + +*** a/parse.y 2022-11-02 10:36:54.000000000 -0400 +--- b/parse.y 2022-10-24 10:53:26.000000000 -0400 +*************** +*** 3613,3616 **** +--- 3614,3618 ---- + #define P_ARRAYSUB 0x0020 /* parsing a [...] array subscript for assignment */ + #define P_DOLBRACE 0x0040 /* parsing a ${...} construct */ ++ #define P_ARITH 0x0080 /* parsing a $(( )) arithmetic expansion */ + + /* Lexical state while parsing a grouping construct or $(...). */ +*************** +*** 3911,3914 **** +--- 3914,3920 ---- + else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ + goto parse_dollar_word; ++ else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/ ++ /* $() inside $(( ))/$[ ] */ ++ goto parse_dollar_word; + #if defined (PROCESS_SUBSTITUTION) + /* XXX - technically this should only be recognized at the start of +*************** +*** 3941,3945 **** + nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags); + else if (ch == '[') /* ] */ +! nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags); + + CHECK_NESTRET_ERROR (); +--- 3947,3951 ---- + nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags); + else if (ch == '[') /* ] */ +! nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH); + + CHECK_NESTRET_ERROR (); +*************** +*** 4080,4084 **** + shell_ungetc (peekc); + if (peekc == '(') /*)*/ +! return (parse_matched_pair (qc, open, close, lenp, 0)); + } + +--- 4086,4090 ---- + shell_ungetc (peekc); + if (peekc == '(') /*)*/ +! return (parse_matched_pair (qc, open, close, lenp, P_ARITH)); + } + +*************** +*** 4501,4505 **** + + exp_lineno = line_number; +! ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0); + rval = 1; + if (ttok == &matched_pair_error) +--- 4512,4516 ---- + + exp_lineno = line_number; +! ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH); + rval = 1; + if (ttok == &matched_pair_error) +*************** +*** 5016,5020 **** + } + else +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0); + if (ttok == &matched_pair_error) + return -1; /* Bail immediately. */ +--- 5030,5034 ---- + } + else +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH); + if (ttok == &matched_pair_error) + return -1; /* Bail immediately. */ +*** a/y.tab.c 2022-11-02 10:36:54.000000000 -0400 +--- b/y.tab.c 2022-11-02 10:55:58.000000000 -0400 +*************** +*** 5924,5927 **** +--- 5924,5928 ---- + #define P_ARRAYSUB 0x0020 /* parsing a [...] array subscript for assignment */ + #define P_DOLBRACE 0x0040 /* parsing a ${...} construct */ ++ #define P_ARITH 0x0080 /* parsing a $(( )) arithmetic expansion */ + + /* Lexical state while parsing a grouping construct or $(...). */ +*************** +*** 6222,6225 **** +--- 6223,6229 ---- + else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ + goto parse_dollar_word; ++ else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/ ++ /* $() inside $(( ))/$[ ] */ ++ goto parse_dollar_word; + #if defined (PROCESS_SUBSTITUTION) + /* XXX - technically this should only be recognized at the start of +*************** +*** 6252,6256 **** + nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags); + else if (ch == '[') /* ] */ +! nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags); + + CHECK_NESTRET_ERROR (); +--- 6256,6260 ---- + nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags); + else if (ch == '[') /* ] */ +! nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH); + + CHECK_NESTRET_ERROR (); +*************** +*** 6391,6395 **** + shell_ungetc (peekc); + if (peekc == '(') /*)*/ +! return (parse_matched_pair (qc, open, close, lenp, 0)); + } + +--- 6395,6399 ---- + shell_ungetc (peekc); + if (peekc == '(') /*)*/ +! return (parse_matched_pair (qc, open, close, lenp, P_ARITH)); + } + +*************** +*** 6812,6816 **** + + exp_lineno = line_number; +! ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0); + rval = 1; + if (ttok == &matched_pair_error) +--- 6816,6820 ---- + + exp_lineno = line_number; +! ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH); + rval = 1; + if (ttok == &matched_pair_error) +*************** +*** 7327,7331 **** + } + else +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0); + if (ttok == &matched_pair_error) + return -1; /* Bail immediately. */ +--- 7331,7335 ---- + } + else +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH); + if (ttok == &matched_pair_error) + return -1; /* Bail immediately. */ +*** a/builtins/evalstring.c 2022-07-18 14:46:56.000000000 -0400 +--- b/builtins/evalstring.c 2022-10-18 10:57:51.000000000 -0400 +*************** +*** 432,435 **** +--- 432,437 ---- + if (parse_command () == 0) + { ++ int local_expalias, local_alflag; ++ + if ((flags & SEVAL_PARSEONLY) || (interactive_shell == 0 && read_but_dont_execute)) + { +*************** +*** 508,511 **** +--- 510,526 ---- + #endif /* ONESHOT */ + ++ /* We play tricks in the parser and command_substitute() turning ++ expand_aliases on and off depending on which parsing pass and ++ whether or not we're in posix mode. This only matters for ++ parsing, and we let the higher layers deal with that. We just ++ want to ensure that expand_aliases is set to the appropriate ++ global value when we go to execute this command, so we save ++ and restore it around the execution (we don't restore it if ++ the global value of the flag (expaliases_flag) changes). */ ++ local_expalias = expand_aliases; ++ local_alflag = expaliases_flag; ++ if (subshell_environment & SUBSHELL_COMSUB) ++ expand_aliases = expaliases_flag; ++ + /* See if this is a candidate for $( word : (char *)NULL; + if (tword) +--- 11306,11310 ---- + { + de_backslash (temp); +! tword = command_substitute (temp, quoted, PF_BACKQUOTE); + temp1 = tword ? tword->word : (char *)NULL; + if (tword) +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 6 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 7 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-008.patch b/bash/Patches/bash52-008.patch new file mode 100644 index 00000000..26894506 --- /dev/null +++ b/bash/Patches/bash52-008.patch @@ -0,0 +1,58 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-008 + +Bug-Reported-by: Glenn Jackman +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00095.html + +Bug-Description: + +Array subscript expansion can inappropriately quote brackets if the expression +contains < or >. + +Patch (apply with `patch -p1'): + +*** a/subst.c 2022-10-18 10:47:33.000000000 -0500 +--- b/subst.c 2022-10-20 11:41:07.000000000 -0500 +*************** +*** 3820,3823 **** +--- 3820,3827 ---- + #endif + ++ /* We don't perform process substitution in arithmetic expressions, so don't ++ bother checking for it. */ ++ #define ARITH_EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~') ++ + /* If there are any characters in STRING that require full expansion, + then call FUNC to expand STRING; otherwise just perform quote +*************** +*** 4029,4033 **** + while (string[i]) + { +! if (EXP_CHAR (string[i])) + break; + else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"') +--- 4033,4037 ---- + while (string[i]) + { +! if (ARITH_EXP_CHAR (string[i])) + break; + else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"') +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 7 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 8 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-009.patch b/bash/Patches/bash52-009.patch new file mode 100644 index 00000000..1a0a47be --- /dev/null +++ b/bash/Patches/bash52-009.patch @@ -0,0 +1,43 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-009 + +Bug-Reported-by: Corey Hickey +Bug-Reference-ID: <134330ef-0ead-d73e-68eb-d58fc51efdba@fatooh.org> +Bug-Reference-URL: https://lists.gnu.org/archive/html/help-bash/2022-10/msg00025.html + +Bug-Description: + +Bash arithmetic expansion should allow `@' and `*' to be used as associative +array keys in expressions. + +Patch (apply with `patch -p1'): + +*** a/expr.c 2022-07-11 10:03:34.000000000 -0400 +--- b/expr.c 2022-10-31 10:51:08.000000000 -0400 +*************** +*** 1169,1172 **** +--- 1169,1174 ---- + #if defined (ARRAY_VARS) + aflag = tflag; /* use a different variable for now */ ++ if (shell_compatibility_level > 51) ++ aflag |= AV_ATSTARKEYS; + v = (e == ']') ? array_variable_part (tok, tflag, (char **)0, (int *)0) : find_variable (tok); + #else +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 8 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 9 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-010.patch b/bash/Patches/bash52-010.patch new file mode 100644 index 00000000..27105d35 --- /dev/null +++ b/bash/Patches/bash52-010.patch @@ -0,0 +1,71 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-010 + +Bug-Reported-by: larsh@apache.org +Bug-Reference-ID: +Bug-Reference-URL: https://savannah.gnu.org/support/?110744 + +Bug-Description: + +Bash-5.2 checks the first 128 characters of an executable file that execve() +refuses to execute to see whether it's a binary file before trying to +execute it as a shell script. This defeats some previously-supported use +cases like "self-executing" jar files or "self-uncompressing" scripts. + +Patch (apply with `patch -p1'): + +*** a/general.c 2022-11-07 10:31:42.000000000 -0500 +--- b/general.c 2022-11-18 14:48:45.000000000 -0500 +*************** +*** 684,687 **** +--- 684,688 ---- + { + register int i; ++ int nline; + unsigned char c; + +*************** +*** 690,702 **** + + /* Generally we check the first line for NULs. If the first line looks like +! a `#!' interpreter specifier, we just look for NULs anywhere in the +! buffer. */ +! if (sample[0] == '#' && sample[1] == '!') +! return (memchr (sample, '\0', sample_len) != NULL); + + for (i = 0; i < sample_len; i++) + { + c = sample[i]; +! if (c == '\n') + return (0); + if (c == '\0') +--- 691,701 ---- + + /* Generally we check the first line for NULs. If the first line looks like +! a `#!' interpreter specifier, we look for NULs in the first two lines. */ +! nline = (sample[0] == '#' && sample[1] == '!') ? 2 : 1; + + for (i = 0; i < sample_len; i++) + { + c = sample[i]; +! if (c == '\n' && --nline == 0) + return (0); + if (c == '\0') +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 9 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 10 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-011.patch b/bash/Patches/bash52-011.patch new file mode 100644 index 00000000..f65491c6 --- /dev/null +++ b/bash/Patches/bash52-011.patch @@ -0,0 +1,45 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-011 + +Bug-Reported-by: Fabien Orjollet +Bug-Reference-ID: +Bug-Reference-URL: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1023776 + +Bug-Description: + +Patch (apply with `patch -p1'): + +Using timeouts and readline editing with the `read' builtin (read -e -t) can +leave the readline timeout enabled, potentially resulting in an erroneous +timeout on the next call. + +*** a/builtins/read.def 2022-06-02 14:23:19.000000000 -0400 +--- b/builtins/read.def 2022-11-10 10:27:45.000000000 -0500 +*************** +*** 168,171 **** +--- 168,174 ---- + if (read_timeout) + shtimer_clear (read_timeout); ++ #if defined (READLINE) ++ rl_clear_timeout (); ++ #endif + read_timeout = 0; + } +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 10 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 11 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-012.patch b/bash/Patches/bash52-012.patch new file mode 100644 index 00000000..6293dcd9 --- /dev/null +++ b/bash/Patches/bash52-012.patch @@ -0,0 +1,344 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-012 + +Bug-Reported-by: Kerin Millar +Bug-Reference-ID: <20221002095107.89561bc811e549b55644df11@plushkava.net> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00001.html + +Bug-Description: + +When running in bash compatibility mode, nested command substitutions can +leave the `extglob' option enabled. + +Patch (apply with `patch -p1'): + +*** a/builtins/shopt.def 2022-11-07 10:31:42.000000000 -0500 +--- b/builtins/shopt.def 2022-10-14 09:30:11.000000000 -0400 +*************** +*** 150,153 **** +--- 150,158 ---- + #endif + ++ #if defined (EXTENDED_GLOB) ++ int extglob_flag = EXTGLOB_DEFAULT; ++ static int shopt_set_extglob PARAMS((char *, int)); ++ #endif ++ + int expaliases_flag = 0; + static int shopt_set_expaliases PARAMS((char *, int)); +*************** +*** 207,211 **** + #endif + #if defined (EXTENDED_GLOB) +! { "extglob", &extended_glob, (shopt_set_func_t *)NULL }, + #endif + { "extquote", &extended_quote, (shopt_set_func_t *)NULL }, +--- 212,216 ---- + #endif + #if defined (EXTENDED_GLOB) +! { "extglob", &extglob_flag, shopt_set_extglob }, + #endif + { "extquote", &extended_quote, (shopt_set_func_t *)NULL }, +*************** +*** 378,382 **** + + #if defined (EXTENDED_GLOB) +! extended_glob = EXTGLOB_DEFAULT; + #endif + +--- 383,387 ---- + + #if defined (EXTENDED_GLOB) +! extended_glob = extglob_flag = EXTGLOB_DEFAULT; + #endif + +*************** +*** 644,647 **** +--- 649,663 ---- + } + ++ #if defined (EXTENDED_GLOB) ++ static int ++ shopt_set_extglob (option_name, mode) ++ char *option_name; ++ int mode; ++ { ++ extended_glob = extglob_flag; ++ return 0; ++ } ++ #endif ++ + #if defined (READLINE) + static int +*** a/builtins/common.h 2022-11-07 10:31:42.000000000 -0500 +--- b/builtins/common.h 2022-10-14 09:29:25.000000000 -0400 +*************** +*** 258,261 **** +--- 258,265 ---- + #endif + ++ #if defined (EXTENDED_GLOB) ++ extern int extglob_flag; ++ #endif ++ + extern int expaliases_flag; + +*** a/execute_cmd.c 2022-11-07 10:31:42.000000000 -0500 +--- b/execute_cmd.c 2022-11-02 16:32:12.000000000 -0400 +*************** +*** 3991,4001 **** + #endif /* COND_REGEXP */ + { +- int oe; +- oe = extended_glob; + extended_glob = 1; + result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP|TEST_LOCALE) + ? EXECUTION_SUCCESS + : EXECUTION_FAILURE; +! extended_glob = oe; + } + if (arg1 != nullstr) +--- 4015,4023 ---- + #endif /* COND_REGEXP */ + { + extended_glob = 1; + result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP|TEST_LOCALE) + ? EXECUTION_SUCCESS + : EXECUTION_FAILURE; +! extended_glob = extglob_flag; + } + if (arg1 != nullstr) +*** a/parse.y 2022-11-07 10:31:47.000000000 -0500 +--- b/parse.y 2022-11-14 11:27:22.000000000 -0500 +*************** +*** 126,130 **** + + #if defined (EXTENDED_GLOB) +! extern int extended_glob; + #endif + +--- 126,130 ---- + + #if defined (EXTENDED_GLOB) +! extern int extended_glob, extglob_flag; + #endif + +*************** +*** 3305,3309 **** + /* Reset to global value of extended glob */ + if (parser_state & (PST_EXTPAT|PST_CMDSUBST)) +! extended_glob = global_extglob; + #endif + if (parser_state & (PST_CMDSUBST|PST_STRING)) +--- 3321,3325 ---- + /* Reset to global value of extended glob */ + if (parser_state & (PST_EXTPAT|PST_CMDSUBST)) +! extended_glob = extglob_flag; + #endif + if (parser_state & (PST_CMDSUBST|PST_STRING)) +*************** +*** 4125,4132 **** + #if defined (EXTENDED_GLOB) + /* If (parser_state & PST_EXTPAT), we're parsing an extended pattern for a +! conditional command and have already set global_extglob appropriately. */ + if (shell_compatibility_level <= 51 && was_extpat == 0) + { +! local_extglob = global_extglob = extended_glob; + extended_glob = 1; + } +--- 4143,4150 ---- + #if defined (EXTENDED_GLOB) + /* If (parser_state & PST_EXTPAT), we're parsing an extended pattern for a +! conditional command and have already set extended_glob appropriately. */ + if (shell_compatibility_level <= 51 && was_extpat == 0) + { +! local_extglob = extended_glob; + extended_glob = 1; + } +*************** +*** 4236,4240 **** + sh_parser_state_t ps; + sh_input_line_state_t ls; +! int orig_ind, nc, sflags, start_lineno; + char *ret, *ep, *ostring; + +--- 4256,4260 ---- + sh_parser_state_t ps; + sh_input_line_state_t ls; +! int orig_ind, nc, sflags, start_lineno, local_extglob; + char *ret, *ep, *ostring; + +*************** +*** 4279,4283 **** + expand_aliases = 0; + #if defined (EXTENDED_GLOB) +! global_extglob = extended_glob; /* for reset_parser() */ + #endif + +--- 4299,4303 ---- + expand_aliases = 0; + #if defined (EXTENDED_GLOB) +! local_extglob = extended_glob; + #endif + +*************** +*** 4297,4300 **** +--- 4317,4323 ---- + restore_parser_state (&ps); + ++ #if defined (EXTENDED_GLOB) ++ extended_glob = local_extglob; ++ #endif + token_to_read = 0; + +*************** +*** 4732,4741 **** +--- 4755,4768 ---- + + /* rhs */ ++ #if defined (EXTENDED_GLOB) + local_extglob = extended_glob; + if (parser_state & PST_EXTPAT) + extended_glob = 1; ++ #endif + tok = read_token (READ); ++ #if defined (EXTENDED_GLOB) + if (parser_state & PST_EXTPAT) + extended_glob = local_extglob; ++ #endif + parser_state &= ~(PST_REGEXP|PST_EXTPAT); + +*************** +*** 4784,4788 **** + COND_COM *cexp; + +- global_extglob = extended_glob; + cexp = cond_expr (); + return (make_cond_command (cexp)); +--- 4811,4814 ---- +*** a/y.tab.c 2022-11-07 10:31:47.000000000 -0500 +--- b/y.tab.c 2022-11-18 15:58:03.000000000 -0500 +*************** +*** 176,180 **** + + #if defined (EXTENDED_GLOB) +! extern int extended_glob; + #endif + +--- 176,180 ---- + + #if defined (EXTENDED_GLOB) +! extern int extended_glob, extglob_flag; + #endif + +*************** +*** 5616,5620 **** + /* Reset to global value of extended glob */ + if (parser_state & (PST_EXTPAT|PST_CMDSUBST)) +! extended_glob = global_extglob; + #endif + if (parser_state & (PST_CMDSUBST|PST_STRING)) +--- 5616,5620 ---- + /* Reset to global value of extended glob */ + if (parser_state & (PST_EXTPAT|PST_CMDSUBST)) +! extended_glob = extglob_flag; + #endif + if (parser_state & (PST_CMDSUBST|PST_STRING)) +*************** +*** 6436,6443 **** + #if defined (EXTENDED_GLOB) + /* If (parser_state & PST_EXTPAT), we're parsing an extended pattern for a +! conditional command and have already set global_extglob appropriately. */ + if (shell_compatibility_level <= 51 && was_extpat == 0) + { +! local_extglob = global_extglob = extended_glob; + extended_glob = 1; + } +--- 6436,6443 ---- + #if defined (EXTENDED_GLOB) + /* If (parser_state & PST_EXTPAT), we're parsing an extended pattern for a +! conditional command and have already set extended_glob appropriately. */ + if (shell_compatibility_level <= 51 && was_extpat == 0) + { +! local_extglob = extended_glob; + extended_glob = 1; + } +*************** +*** 6547,6551 **** + sh_parser_state_t ps; + sh_input_line_state_t ls; +! int orig_ind, nc, sflags, start_lineno; + char *ret, *ep, *ostring; + +--- 6547,6551 ---- + sh_parser_state_t ps; + sh_input_line_state_t ls; +! int orig_ind, nc, sflags, start_lineno, local_extglob; + char *ret, *ep, *ostring; + +*************** +*** 6590,6594 **** + expand_aliases = 0; + #if defined (EXTENDED_GLOB) +! global_extglob = extended_glob; /* for reset_parser() */ + #endif + +--- 6590,6594 ---- + expand_aliases = 0; + #if defined (EXTENDED_GLOB) +! local_extglob = extended_glob; + #endif + +*************** +*** 6608,6611 **** +--- 6608,6614 ---- + restore_parser_state (&ps); + ++ #if defined (EXTENDED_GLOB) ++ extended_glob = local_extglob; ++ #endif + token_to_read = 0; + +*************** +*** 7043,7052 **** +--- 7046,7059 ---- + + /* rhs */ ++ #if defined (EXTENDED_GLOB) + local_extglob = extended_glob; + if (parser_state & PST_EXTPAT) + extended_glob = 1; ++ #endif + tok = read_token (READ); ++ #if defined (EXTENDED_GLOB) + if (parser_state & PST_EXTPAT) + extended_glob = local_extglob; ++ #endif + parser_state &= ~(PST_REGEXP|PST_EXTPAT); + +*************** +*** 7095,7099 **** + COND_COM *cexp; + +- global_extglob = extended_glob; + cexp = cond_expr (); + return (make_cond_command (cexp)); +--- 7102,7105 ---- +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 11 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 12 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-013.patch b/bash/Patches/bash52-013.patch new file mode 100644 index 00000000..a7e0d643 --- /dev/null +++ b/bash/Patches/bash52-013.patch @@ -0,0 +1,58 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-013 + +Bug-Reported-by: Ralf Oehler +Bug-Reference-ID: <20221120140252.2fc6489b@bilbo> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-11/msg00082.html + +Bug-Description: + +Bash can leak memory when referencing a non-existent associative array +element. + +Patch (apply with `patch -p1'): + +*** a/subst.c 2022-11-05 17:27:48.000000000 -0400 +--- b/subst.c 2022-11-21 14:42:59.000000000 -0500 +*************** +*** 7498,7503 **** + : quote_escapes (temp); + rflags |= W_ARRAYIND; +- if (estatep) +- *estatep = es; /* structure copy */ + } + /* Note that array[*] and array[@] expanded to a quoted null string by +--- 7508,7511 ---- +*************** +*** 7508,7512 **** + rflags |= W_HASQUOTEDNULL; + +! if (estatep == 0) + flush_eltstate (&es); + } +--- 7516,7522 ---- + rflags |= W_HASQUOTEDNULL; + +! if (estatep) +! *estatep = es; /* structure copy */ +! else + flush_eltstate (&es); + } +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 12 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 13 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-014.patch b/bash/Patches/bash52-014.patch new file mode 100644 index 00000000..6750c84b --- /dev/null +++ b/bash/Patches/bash52-014.patch @@ -0,0 +1,119 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-014 + +Bug-Reported-by: Andreas Schwab +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00076.html + +Bug-Description: + +Bash defers processing additional terminating signals when running the +EXIT trap while exiting due to a terminating signal. This patch allows the +new terminating signal to kill the shell immediately. + +Patch (apply with `patch -p1'): + +*** a/execute_cmd.c 2022-11-23 17:09:18.000000000 -0500 +--- b/execute_cmd.c 2022-11-28 10:36:08.000000000 -0500 +*************** +*** 3625,3628 **** +--- 3649,3653 ---- + + dispose_words (es); ++ QUIT; + + if (match) +*** a/sig.c 2021-11-04 14:15:31.000000000 -0400 +--- b/sig.c 2022-12-06 09:45:11.000000000 -0500 +*************** +*** 95,98 **** +--- 95,99 ---- + + static void initialize_shell_signals PARAMS((void)); ++ static void kill_shell PARAMS((int)); + + void +*************** +*** 487,490 **** +--- 495,500 ---- + } + ++ static int handling_termsig = 0; ++ + sighandler + termsig_sighandler (sig) +*************** +*** 533,536 **** +--- 543,554 ---- + terminate_immediately = 1; + ++ /* If we are currently handling a terminating signal, we have a couple of ++ choices here. We can ignore this second terminating signal and let the ++ shell exit from the first one, or we can exit immediately by killing ++ the shell with this signal. This code implements the latter; to implement ++ the former, replace the kill_shell(sig) with return. */ ++ if (handling_termsig) ++ kill_shell (sig); /* just short-circuit now */ ++ + terminating_signal = sig; + +*************** +*** 565,572 **** + int sig; + { +- static int handling_termsig = 0; +- int i, core; +- sigset_t mask; +- + /* Simple semaphore to keep this function from being executed multiple + times. Since we no longer are running as a signal handler, we don't +--- 585,588 ---- +*************** +*** 574,578 **** + if (handling_termsig) + return; +! handling_termsig = 1; + terminating_signal = 0; /* keep macro from re-testing true. */ + +--- 590,595 ---- + if (handling_termsig) + return; +! +! handling_termsig = terminating_signal; /* for termsig_sighandler */ + terminating_signal = 0; /* keep macro from re-testing true. */ + +*************** +*** 614,617 **** +--- 631,644 ---- + run_exit_trap (); /* XXX - run exit trap possibly in signal context? */ + ++ kill_shell (sig); ++ } ++ ++ static void ++ kill_shell (sig) ++ int sig; ++ { ++ int i, core; ++ sigset_t mask; ++ + /* We don't change the set of blocked signals. If a user starts the shell + with a terminating signal blocked, we won't get here (and if by some +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 13 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 14 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-015.patch b/bash/Patches/bash52-015.patch new file mode 100644 index 00000000..81c62f13 --- /dev/null +++ b/bash/Patches/bash52-015.patch @@ -0,0 +1,216 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-015 + +Bug-Reported-by: Frode Nordahl +Bug-Reference-ID: <20221119070714.351759-1-frode.nordahl@canonical.com> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-11/msg00078.html + +Bug-Description: + +There are several cases where bash is too aggressive when optimizing out forks +in subshells. For example, `eval' and traps should never be optimized. + +Patch (apply with `patch -p1'): + +*** a/builtins/common.h 2022-11-23 17:09:18.000000000 -0500 +--- b/builtins/common.h 2022-11-19 18:03:59.000000000 -0500 +*************** +*** 52,55 **** +--- 52,56 ---- + #define SEVAL_ONECMD 0x100 /* only allow a single command */ + #define SEVAL_NOHISTEXP 0x200 /* inhibit history expansion */ ++ #define SEVAL_NOOPTIMIZE 0x400 /* don't try to set optimization flags */ + + /* Flags for describe_command, shared between type.def and command.def */ +*** a/builtins/evalstring.c 2022-11-05 17:27:44.000000000 -0400 +--- b/builtins/evalstring.c 2022-11-19 18:23:21.000000000 -0500 +*************** +*** 133,138 **** + (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') && + (command->value.Connection->second->flags & CMD_TRY_OPTIMIZING) && +! ((startup_state == 2 && should_suppress_fork (command->value.Connection->second)) || +! ((subshell_environment & SUBSHELL_PAREN) && should_optimize_fork (command->value.Connection->second, 0)))) + { + command->value.Connection->second->flags |= CMD_NO_FORK; +--- 133,138 ---- + (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') && + (command->value.Connection->second->flags & CMD_TRY_OPTIMIZING) && +! (should_suppress_fork (command->value.Connection->second) || +! ((subshell_environment & SUBSHELL_PAREN) && should_optimize_fork (command->value.Connection->second, 0)))) + { + command->value.Connection->second->flags |= CMD_NO_FORK; +*************** +*** 291,294 **** +--- 291,295 ---- + (flags & SEVAL_RESETLINE) -> reset line_number to 1 + (flags & SEVAL_NOHISTEXP) -> history_expansion_inhibited -> 1 ++ (flags & SEVAL_NOOPTIMIZE) -> don't try to turn on optimizing flags + */ + +*************** +*** 503,507 **** + series of connection commands is + command->value.Connection->second. */ +! else if (command->type == cm_connection && can_optimize_connection (command)) + { + command->value.Connection->second->flags |= CMD_TRY_OPTIMIZING; +--- 504,510 ---- + series of connection commands is + command->value.Connection->second. */ +! else if (command->type == cm_connection && +! (flags & SEVAL_NOOPTIMIZE) == 0 && +! can_optimize_connection (command)) + { + command->value.Connection->second->flags |= CMD_TRY_OPTIMIZING; +*** a/builtins/eval.def 2016-01-25 13:28:37.000000000 -0500 +--- b/builtins/eval.def 2022-11-19 18:04:25.000000000 -0500 +*************** +*** 54,57 **** + list = loptend; /* skip over possible `--' */ + +! return (list ? evalstring (string_list (list), "eval", SEVAL_NOHIST) : EXECUTION_SUCCESS); + } +--- 54,57 ---- + list = loptend; /* skip over possible `--' */ + +! return (list ? evalstring (string_list (list), "eval", SEVAL_NOHIST|SEVAL_NOOPTIMIZE) : EXECUTION_SUCCESS); + } +*** a/trap.c 2022-08-10 08:59:45.000000000 -0400 +--- b/trap.c 2022-12-12 10:57:51.000000000 -0500 +*************** +*** 305,308 **** +--- 305,309 ---- + volatile int save_return_catch_flag, function_code; + procenv_t save_return_catch; ++ char *trap_command, *old_trap; + #if defined (ARRAY_VARS) + ARRAY *ps; +*************** +*** 420,423 **** +--- 421,427 ---- + else + { ++ old_trap = trap_list[sig]; ++ trap_command = savestring (old_trap); ++ + save_parser_state (&pstate); + save_subst_varlist = subst_assign_varlist; +*************** +*** 442,446 **** + + if (function_code == 0) +! x = parse_and_execute (savestring (trap_list[sig]), "trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE); + else + { +--- 446,451 ---- + + if (function_code == 0) +! /* XXX is x always last_command_exit_value? */ +! x = parse_and_execute (trap_command, "trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE|SEVAL_NOOPTIMIZE); + else + { +*************** +*** 1003,1007 **** + { + reset_parser (); +! parse_and_execute (trap_command, "exit trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE); + } + else if (code == ERREXIT) +--- 1008,1012 ---- + { + reset_parser (); +! parse_and_execute (trap_command, "exit trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE|SEVAL_NOOPTIMIZE); + } + else if (code == ERREXIT) +*************** +*** 1110,1114 **** + } + +! flags = SEVAL_NONINT|SEVAL_NOHIST; + if (sig != DEBUG_TRAP && sig != RETURN_TRAP && sig != ERROR_TRAP) + flags |= SEVAL_RESETLINE; +--- 1115,1119 ---- + } + +! flags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOOPTIMIZE; + if (sig != DEBUG_TRAP && sig != RETURN_TRAP && sig != ERROR_TRAP) + flags |= SEVAL_RESETLINE; +*** a/parse.y 2022-11-23 17:09:18.000000000 -0500 +--- b/parse.y 2022-11-19 18:15:34.000000000 -0500 +*************** +*** 2828,2832 **** + last_lastarg = savestring (last_lastarg); + +! parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST); + + restore_parser_state (&ps); +--- 2844,2848 ---- + last_lastarg = savestring (last_lastarg); + +! parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOOPTIMIZE); + + restore_parser_state (&ps); +*** a/jobs.c 2022-07-18 10:19:56.000000000 -0400 +--- b/jobs.c 2022-11-19 18:10:24.000000000 -0500 +*************** +*** 4221,4225 **** + for (i = 0; i < nchild; i++) + { +! parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE); + } + +--- 4243,4247 ---- + for (i = 0; i < nchild; i++) + { +! parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE|SEVAL_NOOPTIMIZE); + } + +*** a/y.tab.c 2022-11-23 17:09:18.000000000 -0500 +--- b/y.tab.c 2022-11-23 17:21:17.000000000 -0500 +*************** +*** 5139,5143 **** + last_lastarg = savestring (last_lastarg); + +! parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST); + + restore_parser_state (&ps); +--- 5154,5158 ---- + last_lastarg = savestring (last_lastarg); + +! parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOOPTIMIZE); + + restore_parser_state (&ps); +*** a/execute_cmd.c 2022-11-05 17:27:41.000000000 -0400 +--- b/execute_cmd.c 2022-11-22 17:09:38.000000000 -0500 +*************** +*** 1655,1659 **** + and set CMD_TRY_OPTIMIZING for simple commands on the right side of an + and-or or `;' list to test for optimizing forks when they are executed. */ +! if (user_subshell && command->type == cm_subshell) + optimize_subshell_command (command->value.Subshell->command); + +--- 1665,1670 ---- + and set CMD_TRY_OPTIMIZING for simple commands on the right side of an + and-or or `;' list to test for optimizing forks when they are executed. */ +! if (user_subshell && command->type == cm_subshell && +! (command->flags & (CMD_TIME_PIPELINE|CMD_INVERT_RETURN)) == 0) + optimize_subshell_command (command->value.Subshell->command); + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 14 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 15 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-016.patch b/bash/Patches/bash52-016.patch new file mode 100644 index 00000000..26873570 --- /dev/null +++ b/bash/Patches/bash52-016.patch @@ -0,0 +1,47 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-016 + +Bug-Reported-by: F G +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +If an expression in an arithmetic for loop expands to NULL, the shell +would crash. + +Patch (apply with `patch -p1'): + +*** a/execute_cmd.c Thu Feb 23 14:15:05 2023 +--- b/execute_cmd.c Mon Feb 27 17:53:08 2023 +*************** +*** 3051,3055 **** + if (l->next) + free (expr); +! new = make_word_list (make_word (temp), (WORD_LIST *)NULL); + free (temp); + +--- 3051,3055 ---- + if (l->next) + free (expr); +! new = make_word_list (make_word (temp ? temp : ""), (WORD_LIST *)NULL); + free (temp); + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 15 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 16 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-017.patch b/bash/Patches/bash52-017.patch new file mode 100644 index 00000000..371abd20 --- /dev/null +++ b/bash/Patches/bash52-017.patch @@ -0,0 +1,47 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-017 + +Bug-Reported-by: Dan Church +Bug-Reference-ID: <1a8fd1d6-a3ac-9a67-78eb-b9a7435304c8@gmx.com> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-12/msg00076.html + +Bug-Description: + +In certain cases, using the `.' builtin in a subshell would optimize away +the rest of the commands in the subshell. + +Patch (apply with `patch -p1'): + +*** a/builtins/evalfile.c 2019-07-20 16:16:08.000000000 -0400 +--- b/builtins/evalfile.c 2022-12-22 12:13:08.000000000 -0500 +*************** +*** 267,271 **** + + /* set the flags to be passed to parse_and_execute */ +! pflags = SEVAL_RESETLINE; + pflags |= (flags & FEVAL_HISTORY) ? 0 : SEVAL_NOHIST; + +--- 267,271 ---- + + /* set the flags to be passed to parse_and_execute */ +! pflags = SEVAL_RESETLINE|SEVAL_NOOPTIMIZE; + pflags |= (flags & FEVAL_HISTORY) ? 0 : SEVAL_NOHIST; + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 16 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 17 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-018.patch b/bash/Patches/bash52-018.patch new file mode 100644 index 00000000..6d9e6a31 --- /dev/null +++ b/bash/Patches/bash52-018.patch @@ -0,0 +1,3643 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-018 + +Bug-Reported-by: Todd Stein + Eduardo A . Bustamante López +Bug-Reference-ID: + +Bug-Reference-URL: https://savannah.gnu.org/support/?110745 + https://lists.gnu.org/archive/html/bug-bash/2023-02/msg00141.html + +Bug-Description: + +There are two problems with returning tokens to yyparse() when the shell +encounters a syntax error or when it reads EOF. + +When reading a WORD token, the parser has to return the correct value to +yyparse. Previous versions returned a value < 0, which the bash parser +translated into YYERRCODE for bison, and in newer versions of bison, the +appropriate reset actions didn't happen. We should return YYUNDEF, which +bison uses for `invalid token'. Since we can return a token < 0 for both +invalid tokens and EOF, the bash tokenizer needs to differentiate between +those two cases. + +Patch (apply with `patch -p1'): + +*** a/parse.y 2022-12-13 12:09:02.000000000 -0500 +--- b/parse.y 2023-11-08 14:29:13.000000000 -0500 +*************** +*** 453,456 **** +--- 453,471 ---- + } + } ++ | error YYEOF ++ { ++ global_command = (COMMAND *)NULL; ++ if (last_command_exit_value == 0) ++ last_command_exit_value = EX_BADUSAGE; /* force error return */ ++ if (interactive && parse_and_execute_level == 0) ++ { ++ handle_eof_input_unit (); ++ YYACCEPT; ++ } ++ else ++ { ++ YYABORT; ++ } ++ } + | yacc_EOF + { +*************** +*** 2898,2904 **** + if (current_token < 0) + #if defined (YYERRCODE) && !defined (YYUNDEF) +! current_token = YYERRCODE; + #else +! current_token = YYerror; + #endif + +--- 2913,2919 ---- + if (current_token < 0) + #if defined (YYERRCODE) && !defined (YYUNDEF) +! current_token = EOF_Reached ? YYEOF : YYERRCODE; + #else +! current_token = EOF_Reached ? YYEOF : YYUNDEF; + #endif + +*************** +*** 3695,3698 **** +--- 3711,3715 ---- + parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close); + EOF_Reached = 1; /* XXX */ ++ parser_state |= PST_NOERROR; /* avoid redundant error message */ + return (&matched_pair_error); + } +*************** +*** 4157,4160 **** +--- 4172,4176 ---- + + /* yyparse() has already called yyerror() and reset_parser() */ ++ parser_state |= PST_NOERROR; + return (&matched_pair_error); + } + +*** a/y.tab.c 2022-12-13 12:09:02.000000000 -0500 +--- b/y.tab.c 2023-11-08 14:38:01.000000000 -0500 +*************** +*** 993,997 **** + + /* YYFINAL -- State number of the termination state. */ +! #define YYFINAL 121 + /* YYLAST -- Last index in YYTABLE. */ + #define YYLAST 740 +--- 993,997 ---- + + /* YYFINAL -- State number of the termination state. */ +! #define YYFINAL 122 + /* YYLAST -- Last index in YYTABLE. */ + #define YYLAST 740 +*************** +*** 1002,1008 **** + #define YYNNTS 38 + /* YYNRULES -- Number of rules. */ +! #define YYNRULES 174 + /* YYNSTATES -- Number of states. */ +! #define YYNSTATES 349 + + /* YYMAXUTOK -- Last valid token kind. */ +--- 1002,1008 ---- + #define YYNNTS 38 + /* YYNRULES -- Number of rules. */ +! #define YYNRULES 175 + /* YYNSTATES -- Number of states. */ +! #define YYNSTATES 350 + + /* YYMAXUTOK -- Last valid token kind. */ +*************** +*** 1058,1079 **** + static const yytype_int16 yyrline[] = + { +! 0, 395, 395, 406, 414, 423, 438, 455, 465, 467, +! 471, 477, 483, 489, 495, 501, 507, 513, 519, 525, +! 531, 537, 543, 549, 555, 561, 568, 575, 582, 589, +! 596, 603, 609, 615, 621, 627, 633, 639, 645, 651, +! 657, 663, 669, 675, 681, 687, 693, 699, 705, 711, +! 717, 723, 729, 735, 743, 745, 747, 751, 755, 766, +! 768, 772, 774, 776, 792, 794, 798, 800, 802, 804, +! 806, 808, 810, 812, 814, 816, 818, 822, 827, 832, +! 837, 842, 847, 852, 857, 864, 870, 876, 882, 890, +! 895, 900, 905, 910, 915, 920, 925, 932, 937, 942, +! 949, 951, 953, 955, 959, 961, 992, 999, 1003, 1009, +! 1014, 1031, 1036, 1053, 1060, 1062, 1064, 1069, 1073, 1077, +! 1081, 1083, 1085, 1089, 1090, 1094, 1096, 1098, 1100, 1104, +! 1106, 1108, 1110, 1112, 1114, 1118, 1120, 1129, 1135, 1141, +! 1142, 1149, 1153, 1155, 1157, 1164, 1166, 1173, 1177, 1178, +! 1181, 1183, 1185, 1189, 1190, 1199, 1214, 1232, 1249, 1251, +! 1253, 1260, 1263, 1267, 1269, 1275, 1281, 1301, 1324, 1326, +! 1349, 1353, 1355, 1357, 1359 + }; + #endif +--- 1058,1079 ---- + static const yytype_int16 yyrline[] = + { +! 0, 395, 395, 406, 414, 423, 438, 455, 470, 480, +! 482, 486, 492, 498, 504, 510, 516, 522, 528, 534, +! 540, 546, 552, 558, 564, 570, 576, 583, 590, 597, +! 604, 611, 618, 624, 630, 636, 642, 648, 654, 660, +! 666, 672, 678, 684, 690, 696, 702, 708, 714, 720, +! 726, 732, 738, 744, 750, 758, 760, 762, 766, 770, +! 781, 783, 787, 789, 791, 807, 809, 813, 815, 817, +! 819, 821, 823, 825, 827, 829, 831, 833, 837, 842, +! 847, 852, 857, 862, 867, 872, 879, 885, 891, 897, +! 905, 910, 915, 920, 925, 930, 935, 940, 947, 952, +! 957, 964, 966, 968, 970, 974, 976, 1007, 1014, 1018, +! 1024, 1029, 1046, 1051, 1068, 1075, 1077, 1079, 1084, 1088, +! 1092, 1096, 1098, 1100, 1104, 1105, 1109, 1111, 1113, 1115, +! 1119, 1121, 1123, 1125, 1127, 1129, 1133, 1135, 1144, 1150, +! 1156, 1157, 1164, 1168, 1170, 1172, 1179, 1181, 1188, 1192, +! 1193, 1196, 1198, 1200, 1204, 1205, 1214, 1229, 1247, 1264, +! 1266, 1268, 1275, 1278, 1282, 1284, 1290, 1296, 1316, 1339, +! 1341, 1364, 1368, 1370, 1372, 1374 + }; + #endif +*************** +*** 1120,1124 **** + #endif + +! #define YYPACT_NINF (-152) + + #define yypact_value_is_default(Yyn) \ +--- 1120,1124 ---- + #endif + +! #define YYPACT_NINF (-125) + + #define yypact_value_is_default(Yyn) \ +*************** +*** 1134,1172 **** + static const yytype_int16 yypact[] = + { +! 328, 80, -152, -11, -1, 3, -152, -152, 15, 637, +! -5, 433, 149, -28, -152, 187, 684, -152, 18, 28, +! 130, 38, 139, 50, 52, 60, 65, 74, -152, -152, +! -152, 89, 104, -152, -152, 97, -152, -152, 246, -152, +! 670, -152, -152, -152, -152, -152, -152, -152, -152, -152, +! -152, -152, -152, 146, 211, -152, 1, 433, -152, -152, +! 135, 484, -152, 59, 61, 90, 167, 171, 10, 71, +! 246, 670, 144, -152, -152, -152, -152, -152, 165, -152, +! 142, 179, 192, 140, 194, 160, 227, 245, 252, 253, +! 260, 261, 262, 162, 269, 178, 270, 272, 273, 274, +! 277, -152, -152, -152, -152, -152, -152, -152, -152, -152, +! -152, -152, -152, -152, -152, 168, 379, -152, -152, 173, +! 244, -152, -152, -152, -152, 670, -152, -152, -152, -152, +! -152, 535, 535, -152, -152, -152, -152, -152, -152, -152, +! 205, -152, 14, -152, 36, -152, -152, -152, -152, 84, +! -152, -152, -152, 249, 670, -152, 670, 670, -152, -152, +! -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, +! -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, +! -152, -152, -152, -152, -152, -152, -152, -152, -152, -152, +! -152, -152, -152, -152, 484, 484, 203, 203, 586, 586, +! 145, -152, -152, -152, -152, -152, -152, 0, -152, 119, +! -152, 291, 248, 66, 88, -152, 119, -152, 296, 297, +! 35, -152, 670, 670, 35, -152, -152, 1, 1, -152, +! -152, -152, 306, 484, 484, 484, 484, 484, 305, 169, +! -152, 7, -152, -152, 302, -152, 131, -152, 265, -152, +! -152, -152, -152, -152, -152, 304, 131, -152, 266, -152, +! -152, -152, 35, -152, 313, 317, -152, -152, -152, 225, +! 225, 225, -152, -152, -152, -152, 206, 25, -152, -152, +! 307, -42, 319, 276, -152, -152, -152, 95, -152, 322, +! 283, 332, 284, -152, -152, 102, -152, -152, -152, -152, +! -152, -152, -152, -152, 45, 323, -152, -152, -152, 106, +! -152, -152, -152, -152, -152, -152, 109, -152, -152, 264, +! -152, -152, -152, 484, -152, -152, 333, 293, -152, -152, +! 338, 300, -152, -152, -152, 484, 345, 303, -152, -152, +! 346, 309, -152, -152, -152, -152, -152, -152, -152 + }; + +--- 1134,1172 ---- + static const yytype_int16 yypact[] = + { +! 329, 27, -125, 8, 81, 10, -125, -125, 16, 38, +! 0, 434, -5, -16, -125, 670, 684, -125, 33, 43, +! 62, 63, 71, 69, 94, 105, 108, 116, -125, -125, +! -125, 125, 139, -125, -125, 111, -125, -125, 626, -125, +! 648, -125, -125, -125, -125, -125, -125, -125, -125, -125, +! -125, -125, -125, 5, -21, -125, -15, 434, -125, -125, +! -125, 196, 485, -125, 157, 2, 180, 207, 222, 227, +! 638, 626, 648, 224, -125, -125, -125, -125, -125, 219, +! -125, 185, 223, 228, 140, 230, 161, 232, 233, 234, +! 236, 241, 248, 249, 162, 250, 163, 251, 254, 256, +! 257, 258, -125, -125, -125, -125, -125, -125, -125, -125, +! -125, -125, -125, -125, -125, -125, 225, 380, -125, -125, +! 229, 231, -125, -125, -125, -125, 648, -125, -125, -125, +! -125, -125, 536, 536, -125, -125, -125, -125, -125, -125, +! -125, 214, -125, -7, -125, 85, -125, -125, -125, -125, +! 89, -125, -125, -125, 235, 648, -125, 648, 648, -125, +! -125, -125, -125, -125, -125, -125, -125, -125, -125, -125, +! -125, -125, -125, -125, -125, -125, -125, -125, -125, -125, +! -125, -125, -125, -125, -125, -125, -125, -125, -125, -125, +! -125, -125, -125, -125, -125, 485, 485, 138, 138, 587, +! 587, 17, -125, -125, -125, -125, -125, -125, 88, -125, +! 122, -125, 274, 238, 100, 101, -125, 122, -125, 276, +! 278, 260, -125, 648, 648, 260, -125, -125, -15, -15, +! -125, -125, -125, 287, 485, 485, 485, 485, 485, 290, +! 164, -125, 26, -125, -125, 285, -125, 131, -125, 242, +! -125, -125, -125, -125, -125, -125, 288, 131, -125, 243, +! -125, -125, -125, 260, -125, 297, 302, -125, -125, -125, +! 152, 152, 152, -125, -125, -125, -125, 170, 61, -125, +! -125, 281, -36, 293, 252, -125, -125, -125, 102, -125, +! 298, 255, 300, 262, -125, -125, 103, -125, -125, -125, +! -125, -125, -125, -125, -125, -33, 296, -125, -125, -125, +! 110, -125, -125, -125, -125, -125, -125, 112, -125, -125, +! 189, -125, -125, -125, 485, -125, -125, 310, 267, -125, +! -125, 314, 275, -125, -125, -125, 485, 318, 277, -125, +! -125, 320, 279, -125, -125, -125, -125, -125, -125, -125 + }; + +*************** +*** 1176,1214 **** + static const yytype_uint8 yydefact[] = + { +! 0, 0, 153, 0, 0, 0, 153, 153, 0, 0, +! 0, 0, 171, 54, 55, 0, 0, 118, 0, 0, +! 0, 0, 0, 0, 0, 0, 0, 0, 153, 4, +! 7, 0, 0, 153, 153, 0, 56, 59, 61, 170, +! 62, 66, 76, 70, 67, 64, 72, 3, 65, 71, +! 73, 74, 75, 0, 155, 162, 163, 0, 5, 6, +! 0, 0, 153, 153, 0, 153, 0, 0, 0, 54, +! 113, 109, 0, 151, 150, 152, 167, 164, 172, 173, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +! 0, 16, 25, 40, 34, 49, 31, 43, 37, 46, +! 28, 52, 53, 22, 19, 0, 0, 10, 11, 0, +! 0, 1, 54, 60, 57, 63, 148, 149, 2, 153, +! 153, 156, 157, 153, 153, 166, 165, 153, 154, 137, +! 138, 147, 0, 153, 0, 153, 153, 153, 153, 0, +! 153, 153, 153, 153, 104, 102, 111, 110, 119, 174, +! 153, 18, 27, 42, 36, 51, 33, 45, 39, 48, +! 30, 24, 21, 14, 15, 17, 26, 41, 35, 50, +! 32, 44, 38, 47, 29, 23, 20, 12, 13, 107, +! 108, 117, 106, 58, 0, 0, 160, 161, 0, 0, +! 0, 153, 153, 153, 153, 153, 153, 0, 153, 0, +! 153, 0, 0, 0, 0, 153, 0, 153, 0, 0, +! 0, 153, 105, 112, 0, 158, 159, 169, 168, 153, +! 153, 114, 0, 0, 0, 140, 141, 139, 0, 123, +! 153, 0, 153, 153, 0, 8, 0, 153, 0, 87, +! 88, 153, 153, 153, 153, 0, 0, 153, 0, 68, +! 69, 103, 0, 100, 0, 0, 116, 142, 143, 144, +! 145, 146, 99, 129, 131, 133, 124, 0, 97, 135, +! 0, 0, 0, 0, 77, 9, 153, 0, 78, 0, +! 0, 0, 0, 89, 153, 0, 90, 101, 115, 153, +! 130, 132, 134, 98, 0, 0, 153, 79, 80, 0, +! 153, 153, 85, 86, 91, 92, 0, 153, 153, 120, +! 153, 136, 125, 126, 153, 153, 0, 0, 153, 153, +! 0, 0, 153, 122, 127, 128, 0, 0, 83, 84, +! 0, 0, 95, 96, 121, 81, 82, 93, 94 + }; + +--- 1176,1214 ---- + static const yytype_uint8 yydefact[] = + { +! 0, 0, 154, 0, 0, 0, 154, 154, 0, 0, +! 0, 0, 172, 55, 56, 0, 0, 119, 0, 0, +! 0, 0, 0, 0, 0, 0, 0, 0, 154, 4, +! 8, 0, 0, 154, 154, 0, 57, 60, 62, 171, +! 63, 67, 77, 71, 68, 65, 73, 3, 66, 72, +! 74, 75, 76, 0, 156, 163, 164, 0, 7, 5, +! 6, 0, 0, 154, 154, 0, 154, 0, 0, 0, +! 55, 114, 110, 0, 152, 151, 153, 168, 165, 173, +! 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +! 0, 0, 17, 26, 41, 35, 50, 32, 44, 38, +! 47, 29, 53, 54, 23, 20, 0, 0, 11, 12, +! 0, 0, 1, 55, 61, 58, 64, 149, 150, 2, +! 154, 154, 157, 158, 154, 154, 167, 166, 154, 155, +! 138, 139, 148, 0, 154, 0, 154, 154, 154, 154, +! 0, 154, 154, 154, 154, 105, 103, 112, 111, 120, +! 175, 154, 19, 28, 43, 37, 52, 34, 46, 40, +! 49, 31, 25, 22, 15, 16, 18, 27, 42, 36, +! 51, 33, 45, 39, 48, 30, 24, 21, 13, 14, +! 108, 109, 118, 107, 59, 0, 0, 161, 162, 0, +! 0, 0, 154, 154, 154, 154, 154, 154, 0, 154, +! 0, 154, 0, 0, 0, 0, 154, 0, 154, 0, +! 0, 0, 154, 106, 113, 0, 159, 160, 170, 169, +! 154, 154, 115, 0, 0, 0, 141, 142, 140, 0, +! 124, 154, 0, 154, 154, 0, 9, 0, 154, 0, +! 88, 89, 154, 154, 154, 154, 0, 0, 154, 0, +! 69, 70, 104, 0, 101, 0, 0, 117, 143, 144, +! 145, 146, 147, 100, 130, 132, 134, 125, 0, 98, +! 136, 0, 0, 0, 0, 78, 10, 154, 0, 79, +! 0, 0, 0, 0, 90, 154, 0, 91, 102, 116, +! 154, 131, 133, 135, 99, 0, 0, 154, 80, 81, +! 0, 154, 154, 86, 87, 92, 93, 0, 154, 154, +! 121, 154, 137, 126, 127, 154, 154, 0, 0, 154, +! 154, 0, 0, 154, 123, 128, 129, 0, 0, 84, +! 85, 0, 0, 96, 97, 122, 82, 83, 94, 95 + }; + +*************** +*** 1216,1223 **** + static const yytype_int16 yypgoto[] = + { +! -152, -152, 112, -29, -14, -64, 360, -152, -8, -152, +! -152, -152, -152, -152, -151, -152, -152, -152, -152, -152, +! -152, -152, 13, -152, 136, -152, 98, -2, -152, 30, +! -152, -54, -26, -152, -123, 6, 78, -152 + }; + +--- 1216,1223 ---- + static const yytype_int16 yypgoto[] = + { +! -125, -125, 126, -25, -28, -65, 335, -125, -8, -125, +! -125, -125, -125, -125, -96, -125, -125, -125, -125, -125, +! -125, -125, 28, -125, 109, -125, 68, -2, -125, -11, +! -125, -54, -26, -125, -124, 6, 34, -125 + }; + +*************** +*** 1225,1232 **** + static const yytype_int16 yydefgoto[] = + { +! 0, 35, 246, 36, 37, 125, 38, 39, 40, 41, +! 42, 43, 44, 45, 155, 46, 47, 48, 49, 50, +! 51, 52, 232, 238, 239, 240, 281, 120, 139, 140, +! 128, 76, 61, 53, 54, 141, 56, 57 + }; + +--- 1225,1232 ---- + static const yytype_int16 yydefgoto[] = + { +! 0, 35, 247, 36, 37, 126, 38, 39, 40, 41, +! 42, 43, 44, 45, 156, 46, 47, 48, 49, 50, +! 51, 52, 233, 239, 240, 241, 282, 121, 140, 141, +! 129, 77, 62, 53, 54, 142, 56, 57 + }; + +*************** +*** 1236,1390 **** + static const yytype_int16 yytable[] = + { +! 60, 71, 116, 135, 66, 67, 55, 157, 196, 197, +! 147, 124, 305, 2, 242, 62, 278, 77, 3, 306, +! 4, 5, 6, 7, 123, 63, 115, 72, 10, 65, +! 64, 119, 80, 279, 303, 206, 142, 144, 2, 149, +! 17, 68, 124, 3, 101, 4, 5, 6, 7, 133, +! 208, 279, 138, 10, 102, 134, 123, 209, 243, 138, +! 154, 156, 152, 136, 106, 17, 138, 280, 33, 261, +! 153, 225, 226, 263, 2, 145, 110, 138, 111, 3, +! 251, 4, 5, 6, 7, 280, 112, 138, 138, 10, +! 222, 113, 223, 33, 210, 34, 193, 121, 215, 305, +! 114, 17, 253, 194, 195, 216, 320, 198, 199, 310, +! 143, 297, 73, 74, 75, 117, 317, 207, 138, 146, +! 324, 213, 214, 328, 252, 124, 220, 124, 193, 33, +! 118, 34, 58, 59, 224, 200, 138, 55, 55, 137, +! 138, 148, 217, 211, 212, 245, 254, 138, 218, 219, +! 229, 230, 231, 311, 138, 247, 103, 285, 138, 104, +! 318, 138, 257, 158, 325, 107, 163, 329, 108, 164, +! 73, 74, 75, 78, 79, 233, 234, 235, 236, 237, +! 241, 150, 73, 74, 75, 151, 167, 105, 177, 168, +! 159, 178, 286, 193, 193, 262, 109, 165, 126, 127, +! 55, 55, 294, 160, 181, 161, 244, 182, 248, 273, +! 274, 275, 154, 255, 277, 258, 154, 169, 162, 179, +! 166, 287, 81, 82, 83, 84, 85, 264, 265, 189, +! 86, 295, 191, 87, 88, 183, 129, 130, 201, 202, +! 282, 283, 89, 90, 129, 130, 300, 301, 302, 289, +! 290, 291, 292, 170, 154, 203, 204, 205, 201, 202, +! 309, 131, 132, 267, 268, 269, 270, 271, 316, 332, +! 230, 171, 122, 14, 15, 16, 227, 228, 172, 173, +! 323, 18, 19, 20, 21, 22, 174, 175, 176, 23, +! 24, 25, 26, 27, 335, 180, 184, 319, 185, 186, +! 187, 31, 32, 188, 322, 192, 249, 250, 326, 327, +! 221, 259, 260, 266, 272, 330, 331, 284, 334, 293, +! 298, 299, 336, 337, 288, 296, 340, 341, 256, 1, +! 344, 2, 333, 279, 307, 308, 3, 312, 4, 5, +! 6, 7, 313, 315, 8, 9, 10, 314, 338, 321, +! 11, 12, 339, 342, 13, 14, 15, 16, 17, 343, +! 345, 347, 346, 18, 19, 20, 21, 22, 348, 70, +! 0, 23, 24, 25, 26, 27, 276, 28, 304, 0, +! 29, 30, 2, 31, 32, 0, 33, 3, 34, 4, +! 5, 6, 7, 0, 0, 8, 9, 10, 0, 0, +! 0, 11, 12, 0, 0, 13, 14, 15, 16, 17, + 0, 0, 0, 0, 18, 19, 20, 21, 22, 0, +! 0, 0, 23, 24, 25, 26, 27, 0, 0, 0, +! 0, 138, 0, 0, 31, 32, 2, 33, 0, 34, +! 190, 3, 0, 4, 5, 6, 7, 0, 0, 8, +! 9, 10, 0, 0, 0, 11, 12, 0, 0, 13, +! 14, 15, 16, 17, 0, 0, 0, 0, 18, 19, +! 20, 21, 22, 0, 0, 0, 23, 24, 25, 26, +! 27, 0, 0, 0, 73, 74, 75, 2, 31, 32, +! 0, 33, 3, 34, 4, 5, 6, 7, 0, 0, + 8, 9, 10, 0, 0, 0, 11, 12, 0, 0, + 13, 14, 15, 16, 17, 0, 0, 0, 0, 18, + 19, 20, 21, 22, 0, 0, 0, 23, 24, 25, +! 26, 27, 0, 0, 0, 0, 138, 0, 2, 31, + 32, 0, 33, 3, 34, 4, 5, 6, 7, 0, + 0, 8, 9, 10, 0, 0, 0, 11, 12, 0, + 0, 13, 14, 15, 16, 17, 0, 0, 0, 0, + 18, 19, 20, 21, 22, 0, 0, 0, 23, 24, +! 25, 26, 27, 0, 0, 0, 0, 0, 0, 2, + 31, 32, 0, 33, 3, 34, 4, 5, 6, 7, +! 0, 0, 8, 9, 10, 0, 0, 0, 0, 0, + 0, 0, 13, 14, 15, 16, 17, 0, 0, 0, + 0, 18, 19, 20, 21, 22, 0, 0, 0, 23, +! 24, 25, 26, 27, 0, 0, 0, 0, 138, 0, + 2, 31, 32, 0, 33, 3, 34, 4, 5, 6, +! 7, 0, 0, 0, 0, 10, 0, 0, 0, 0, +! 0, 0, 0, 69, 14, 15, 16, 17, 0, 0, + 0, 0, 18, 19, 20, 21, 22, 0, 0, 0, +! 23, 24, 25, 26, 27, 0, 0, 0, 0, 0, +! 0, 0, 31, 32, 0, 33, 0, 34, 15, 16, +! 0, 0, 0, 0, 0, 18, 19, 20, 21, 22, +! 0, 0, 0, 23, 24, 25, 26, 27, 0, 91, +! 92, 93, 94, 95, 0, 31, 32, 96, 0, 0, +! 97, 98, 0, 0, 0, 0, 0, 0, 0, 99, +! 100 + }; + + static const yytype_int16 yycheck[] = + { +! 2, 9, 28, 57, 6, 7, 0, 71, 131, 132, +! 64, 40, 54, 3, 14, 26, 9, 11, 8, 61, +! 10, 11, 12, 13, 38, 26, 28, 32, 18, 26, +! 31, 33, 60, 26, 9, 21, 62, 63, 3, 65, +! 30, 26, 71, 8, 26, 10, 11, 12, 13, 48, +! 14, 26, 52, 18, 26, 54, 70, 21, 58, 52, +! 68, 69, 52, 57, 26, 30, 52, 60, 58, 220, +! 60, 194, 195, 224, 3, 14, 26, 52, 26, 8, +! 14, 10, 11, 12, 13, 60, 26, 52, 52, 18, +! 154, 26, 156, 58, 58, 60, 125, 0, 14, 54, +! 26, 30, 14, 129, 130, 21, 61, 133, 134, 14, +! 51, 262, 51, 52, 53, 26, 14, 143, 52, 58, +! 14, 147, 148, 14, 58, 154, 152, 156, 157, 58, +! 26, 60, 52, 53, 160, 137, 52, 131, 132, 4, +! 52, 51, 58, 145, 146, 26, 58, 52, 150, 151, +! 5, 6, 7, 58, 52, 209, 26, 26, 52, 29, +! 58, 52, 216, 19, 58, 26, 26, 58, 29, 29, +! 51, 52, 53, 24, 25, 201, 202, 203, 204, 205, +! 206, 14, 51, 52, 53, 14, 26, 57, 26, 29, +! 25, 29, 246, 222, 223, 221, 57, 57, 52, 53, +! 194, 195, 256, 61, 26, 26, 208, 29, 210, 40, +! 41, 42, 220, 215, 240, 217, 224, 57, 26, 57, +! 26, 247, 35, 36, 37, 38, 39, 229, 230, 61, +! 43, 257, 59, 46, 47, 57, 33, 34, 33, 34, +! 242, 243, 55, 56, 33, 34, 40, 41, 42, 251, +! 252, 253, 254, 26, 262, 50, 51, 52, 33, 34, +! 286, 50, 51, 233, 234, 235, 236, 237, 294, 5, +! 6, 26, 26, 27, 28, 29, 198, 199, 26, 26, +! 306, 35, 36, 37, 38, 39, 26, 26, 26, 43, +! 44, 45, 46, 47, 320, 26, 26, 299, 26, 26, +! 26, 55, 56, 26, 306, 61, 15, 59, 310, 311, +! 61, 15, 15, 7, 9, 317, 318, 15, 320, 15, +! 7, 4, 324, 325, 59, 59, 328, 329, 216, 1, +! 332, 3, 319, 26, 15, 59, 8, 15, 10, 11, +! 12, 13, 59, 59, 16, 17, 18, 15, 15, 26, +! 22, 23, 59, 15, 26, 27, 28, 29, 30, 59, +! 15, 15, 59, 35, 36, 37, 38, 39, 59, 9, +! -1, 43, 44, 45, 46, 47, 240, 49, 280, -1, +! 52, 53, 3, 55, 56, -1, 58, 8, 60, 10, +! 11, 12, 13, -1, -1, 16, 17, 18, -1, -1, +! -1, 22, 23, -1, -1, 26, 27, 28, 29, 30, + -1, -1, -1, -1, 35, 36, 37, 38, 39, -1, +! -1, -1, 43, 44, 45, 46, 47, -1, -1, -1, +! -1, 52, -1, -1, 55, 56, 3, 58, -1, 60, +! 61, 8, -1, 10, 11, 12, 13, -1, -1, 16, +! 17, 18, -1, -1, -1, 22, 23, -1, -1, 26, +! 27, 28, 29, 30, -1, -1, -1, -1, 35, 36, +! 37, 38, 39, -1, -1, -1, 43, 44, 45, 46, +! 47, -1, -1, -1, 51, 52, 53, 3, 55, 56, +! -1, 58, 8, 60, 10, 11, 12, 13, -1, -1, + 16, 17, 18, -1, -1, -1, 22, 23, -1, -1, + 26, 27, 28, 29, 30, -1, -1, -1, -1, 35, + 36, 37, 38, 39, -1, -1, -1, 43, 44, 45, +! 46, 47, -1, -1, -1, -1, 52, -1, 3, 55, + 56, -1, 58, 8, 60, 10, 11, 12, 13, -1, + -1, 16, 17, 18, -1, -1, -1, 22, 23, -1, + -1, 26, 27, 28, 29, 30, -1, -1, -1, -1, + 35, 36, 37, 38, 39, -1, -1, -1, 43, 44, +! 45, 46, 47, -1, -1, -1, -1, -1, -1, 3, + 55, 56, -1, 58, 8, 60, 10, 11, 12, 13, +! -1, -1, 16, 17, 18, -1, -1, -1, -1, -1, + -1, -1, 26, 27, 28, 29, 30, -1, -1, -1, + -1, 35, 36, 37, 38, 39, -1, -1, -1, 43, +! 44, 45, 46, 47, -1, -1, -1, -1, 52, -1, + 3, 55, 56, -1, 58, 8, 60, 10, 11, 12, +! 13, -1, -1, -1, -1, 18, -1, -1, -1, -1, + -1, -1, -1, 26, 27, 28, 29, 30, -1, -1, + -1, -1, 35, 36, 37, 38, 39, -1, -1, -1, +! 43, 44, 45, 46, 47, -1, -1, -1, -1, -1, +! -1, -1, 55, 56, -1, 58, -1, 60, 28, 29, +! -1, -1, -1, -1, -1, 35, 36, 37, 38, 39, +! -1, -1, -1, 43, 44, 45, 46, 47, -1, 35, + 36, 37, 38, 39, -1, 55, 56, 43, -1, -1, + 46, 47, -1, -1, -1, -1, -1, -1, -1, 55, +--- 1236,1390 ---- + static const yytype_int16 yytable[] = + { +! 61, 72, 117, 136, 67, 68, 55, 158, 197, 198, +! 124, 148, 130, 131, 207, 125, 146, 78, 306, 79, +! 80, 306, 230, 231, 232, 307, 116, 58, 321, 132, +! 133, 120, 73, 134, 63, 279, 66, 143, 145, 135, +! 150, 2, 69, 124, 81, 139, 3, 125, 4, 5, +! 6, 7, 280, 74, 75, 76, 10, 127, 128, 102, +! 147, 155, 157, 137, 70, 14, 15, 16, 17, 103, +! 304, 226, 227, 18, 19, 20, 21, 22, 139, 59, +! 60, 23, 24, 25, 26, 27, 281, 280, 104, 107, +! 223, 105, 224, 31, 32, 111, 33, 108, 34, 209, +! 109, 194, 243, 216, 195, 196, 210, 64, 199, 200, +! 217, 122, 65, 139, 252, 254, 311, 318, 208, 106, +! 112, 281, 214, 215, 325, 262, 329, 221, 110, 264, +! 125, 113, 125, 194, 114, 225, 201, 139, 55, 55, +! 139, 139, 115, 211, 212, 213, 244, 218, 246, 219, +! 220, 118, 139, 139, 139, 139, 248, 286, 253, 255, +! 312, 319, 139, 258, 139, 119, 164, 298, 326, 165, +! 330, 130, 131, 74, 75, 76, 234, 235, 236, 237, +! 238, 242, 74, 75, 76, 202, 203, 168, 178, 182, +! 169, 179, 183, 287, 333, 231, 263, 166, 194, 194, +! 138, 55, 55, 295, 274, 275, 276, 245, 144, 249, +! 301, 302, 303, 155, 256, 278, 259, 155, 170, 180, +! 184, 151, 288, 268, 269, 270, 271, 272, 265, 266, +! 2, 149, 296, 228, 229, 3, 152, 4, 5, 6, +! 7, 283, 284, 159, 160, 10, 161, 202, 203, 162, +! 290, 291, 292, 293, 163, 155, 167, 17, 171, 172, +! 173, 310, 174, 2, 204, 205, 206, 175, 3, 317, +! 4, 5, 6, 7, 176, 177, 181, 185, 10, 153, +! 186, 324, 187, 188, 189, 33, 190, 154, 192, 250, +! 17, 260, 193, 261, 267, 336, 222, 251, 320, 273, +! 285, 289, 297, 294, 299, 323, 300, 280, 308, 327, +! 328, 309, 139, 313, 314, 315, 331, 332, 33, 335, +! 34, 316, 322, 337, 338, 339, 340, 341, 342, 343, +! 1, 345, 2, 346, 344, 348, 347, 3, 349, 4, +! 5, 6, 7, 257, 71, 8, 9, 10, 334, 305, +! 277, 11, 12, 0, 0, 13, 14, 15, 16, 17, + 0, 0, 0, 0, 18, 19, 20, 21, 22, 0, +! 0, 0, 23, 24, 25, 26, 27, 0, 28, 0, +! 0, 29, 30, 2, 31, 32, 0, 33, 3, 34, +! 4, 5, 6, 7, 0, 0, 8, 9, 10, 0, +! 0, 0, 11, 12, 0, 0, 13, 14, 15, 16, +! 17, 0, 0, 0, 0, 18, 19, 20, 21, 22, +! 0, 0, 0, 23, 24, 25, 26, 27, 0, 0, +! 0, 0, 139, 0, 0, 31, 32, 2, 33, 0, +! 34, 191, 3, 0, 4, 5, 6, 7, 0, 0, + 8, 9, 10, 0, 0, 0, 11, 12, 0, 0, + 13, 14, 15, 16, 17, 0, 0, 0, 0, 18, + 19, 20, 21, 22, 0, 0, 0, 23, 24, 25, +! 26, 27, 0, 0, 0, 74, 75, 76, 2, 31, + 32, 0, 33, 3, 34, 4, 5, 6, 7, 0, + 0, 8, 9, 10, 0, 0, 0, 11, 12, 0, + 0, 13, 14, 15, 16, 17, 0, 0, 0, 0, + 18, 19, 20, 21, 22, 0, 0, 0, 23, 24, +! 25, 26, 27, 0, 0, 0, 0, 139, 0, 2, + 31, 32, 0, 33, 3, 34, 4, 5, 6, 7, +! 0, 0, 8, 9, 10, 0, 0, 0, 11, 12, + 0, 0, 13, 14, 15, 16, 17, 0, 0, 0, + 0, 18, 19, 20, 21, 22, 0, 0, 0, 23, +! 24, 25, 26, 27, 0, 0, 0, 0, 0, 0, + 2, 31, 32, 0, 33, 3, 34, 4, 5, 6, +! 7, 0, 0, 8, 9, 10, 0, 0, 0, 0, +! 0, 0, 0, 13, 14, 15, 16, 17, 0, 0, + 0, 0, 18, 19, 20, 21, 22, 0, 0, 0, +! 23, 24, 25, 26, 27, 0, 0, 0, 0, 139, +! 0, 2, 31, 32, 0, 33, 3, 34, 4, 5, +! 6, 7, 123, 14, 15, 16, 10, 0, 0, 0, +! 0, 18, 19, 20, 21, 22, 0, 0, 17, 23, +! 24, 25, 26, 27, 0, 0, 15, 16, 0, 0, +! 0, 31, 32, 18, 19, 20, 21, 22, 0, 0, +! 0, 23, 24, 25, 26, 27, 33, 0, 34, 0, +! 0, 0, 0, 31, 32, 82, 83, 84, 85, 86, +! 0, 0, 0, 87, 0, 0, 88, 89, 0, 92, +! 93, 94, 95, 96, 0, 90, 91, 97, 0, 0, +! 98, 99, 0, 0, 0, 0, 0, 0, 0, 100, +! 101 + }; + + static const yytype_int16 yycheck[] = + { +! 2, 9, 28, 57, 6, 7, 0, 72, 132, 133, +! 38, 65, 33, 34, 21, 40, 14, 11, 54, 24, +! 25, 54, 5, 6, 7, 61, 28, 0, 61, 50, +! 51, 33, 32, 48, 26, 9, 26, 63, 64, 54, +! 66, 3, 26, 71, 60, 52, 8, 72, 10, 11, +! 12, 13, 26, 51, 52, 53, 18, 52, 53, 26, +! 58, 69, 70, 57, 26, 27, 28, 29, 30, 26, +! 9, 195, 196, 35, 36, 37, 38, 39, 52, 52, +! 53, 43, 44, 45, 46, 47, 60, 26, 26, 26, +! 155, 29, 157, 55, 56, 26, 58, 26, 60, 14, +! 29, 126, 14, 14, 130, 131, 21, 26, 134, 135, +! 21, 0, 31, 52, 14, 14, 14, 14, 144, 57, +! 26, 60, 148, 149, 14, 221, 14, 153, 57, 225, +! 155, 26, 157, 158, 26, 161, 138, 52, 132, 133, +! 52, 52, 26, 58, 146, 147, 58, 58, 26, 151, +! 152, 26, 52, 52, 52, 52, 210, 26, 58, 58, +! 58, 58, 52, 217, 52, 26, 26, 263, 58, 29, +! 58, 33, 34, 51, 52, 53, 202, 203, 204, 205, +! 206, 207, 51, 52, 53, 33, 34, 26, 26, 26, +! 29, 29, 29, 247, 5, 6, 222, 57, 223, 224, +! 4, 195, 196, 257, 40, 41, 42, 209, 51, 211, +! 40, 41, 42, 221, 216, 241, 218, 225, 57, 57, +! 57, 14, 248, 234, 235, 236, 237, 238, 230, 231, +! 3, 51, 258, 199, 200, 8, 14, 10, 11, 12, +! 13, 243, 244, 19, 25, 18, 61, 33, 34, 26, +! 252, 253, 254, 255, 26, 263, 26, 30, 26, 26, +! 26, 287, 26, 3, 50, 51, 52, 26, 8, 295, +! 10, 11, 12, 13, 26, 26, 26, 26, 18, 52, +! 26, 307, 26, 26, 26, 58, 61, 60, 59, 15, +! 30, 15, 61, 15, 7, 321, 61, 59, 300, 9, +! 15, 59, 59, 15, 7, 307, 4, 26, 15, 311, +! 312, 59, 52, 15, 59, 15, 318, 319, 58, 321, +! 60, 59, 26, 325, 326, 15, 59, 329, 330, 15, +! 1, 333, 3, 15, 59, 15, 59, 8, 59, 10, +! 11, 12, 13, 217, 9, 16, 17, 18, 320, 281, +! 241, 22, 23, -1, -1, 26, 27, 28, 29, 30, + -1, -1, -1, -1, 35, 36, 37, 38, 39, -1, +! -1, -1, 43, 44, 45, 46, 47, -1, 49, -1, +! -1, 52, 53, 3, 55, 56, -1, 58, 8, 60, +! 10, 11, 12, 13, -1, -1, 16, 17, 18, -1, +! -1, -1, 22, 23, -1, -1, 26, 27, 28, 29, +! 30, -1, -1, -1, -1, 35, 36, 37, 38, 39, +! -1, -1, -1, 43, 44, 45, 46, 47, -1, -1, +! -1, -1, 52, -1, -1, 55, 56, 3, 58, -1, +! 60, 61, 8, -1, 10, 11, 12, 13, -1, -1, + 16, 17, 18, -1, -1, -1, 22, 23, -1, -1, + 26, 27, 28, 29, 30, -1, -1, -1, -1, 35, + 36, 37, 38, 39, -1, -1, -1, 43, 44, 45, +! 46, 47, -1, -1, -1, 51, 52, 53, 3, 55, + 56, -1, 58, 8, 60, 10, 11, 12, 13, -1, + -1, 16, 17, 18, -1, -1, -1, 22, 23, -1, + -1, 26, 27, 28, 29, 30, -1, -1, -1, -1, + 35, 36, 37, 38, 39, -1, -1, -1, 43, 44, +! 45, 46, 47, -1, -1, -1, -1, 52, -1, 3, + 55, 56, -1, 58, 8, 60, 10, 11, 12, 13, +! -1, -1, 16, 17, 18, -1, -1, -1, 22, 23, + -1, -1, 26, 27, 28, 29, 30, -1, -1, -1, + -1, 35, 36, 37, 38, 39, -1, -1, -1, 43, +! 44, 45, 46, 47, -1, -1, -1, -1, -1, -1, + 3, 55, 56, -1, 58, 8, 60, 10, 11, 12, +! 13, -1, -1, 16, 17, 18, -1, -1, -1, -1, + -1, -1, -1, 26, 27, 28, 29, 30, -1, -1, + -1, -1, 35, 36, 37, 38, 39, -1, -1, -1, +! 43, 44, 45, 46, 47, -1, -1, -1, -1, 52, +! -1, 3, 55, 56, -1, 58, 8, 60, 10, 11, +! 12, 13, 26, 27, 28, 29, 18, -1, -1, -1, +! -1, 35, 36, 37, 38, 39, -1, -1, 30, 43, +! 44, 45, 46, 47, -1, -1, 28, 29, -1, -1, +! -1, 55, 56, 35, 36, 37, 38, 39, -1, -1, +! -1, 43, 44, 45, 46, 47, 58, -1, 60, -1, +! -1, -1, -1, 55, 56, 35, 36, 37, 38, 39, +! -1, -1, -1, 43, -1, -1, 46, 47, -1, 35, + 36, 37, 38, 39, -1, 55, 56, 43, -1, -1, + 46, 47, -1, -1, -1, -1, -1, -1, -1, 55, +*************** +*** 1401,1434 **** + 53, 55, 56, 58, 60, 63, 65, 66, 68, 69, + 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, +! 81, 82, 83, 95, 96, 97, 98, 99, 52, 53, +! 89, 94, 26, 26, 31, 26, 89, 89, 26, 26, +! 68, 70, 32, 51, 52, 53, 93, 97, 24, 25, +! 60, 35, 36, 37, 38, 39, 43, 46, 47, 55, +! 56, 35, 36, 37, 38, 39, 43, 46, 47, 55, +! 56, 26, 26, 26, 29, 57, 26, 26, 29, 57, +! 26, 26, 26, 26, 26, 89, 94, 26, 26, 89, +! 89, 0, 26, 66, 65, 67, 52, 53, 92, 33, +! 34, 50, 51, 48, 54, 93, 97, 4, 52, 90, +! 91, 97, 94, 51, 94, 14, 58, 93, 51, 94, +! 14, 14, 52, 60, 70, 76, 70, 67, 19, 25, +! 61, 26, 26, 26, 29, 57, 26, 26, 29, 57, +! 26, 26, 26, 26, 26, 26, 26, 26, 29, 57, +! 26, 26, 29, 57, 26, 26, 26, 26, 26, 61, +! 61, 59, 61, 65, 94, 94, 96, 96, 94, 94, +! 89, 33, 34, 50, 51, 52, 21, 94, 14, 21, +! 58, 89, 89, 94, 94, 14, 21, 58, 89, 89, +! 94, 61, 67, 67, 94, 96, 96, 98, 98, 5, +! 6, 7, 84, 94, 94, 94, 94, 94, 85, 86, +! 87, 94, 14, 58, 89, 26, 64, 93, 89, 15, +! 59, 14, 58, 14, 58, 89, 64, 93, 89, 15, +! 15, 76, 94, 76, 89, 89, 7, 91, 91, 91, +! 91, 91, 9, 40, 41, 42, 86, 94, 9, 26, +! 60, 88, 89, 89, 15, 26, 93, 94, 59, 89, +! 89, 89, 89, 15, 93, 94, 59, 76, 7, 4, +! 40, 41, 42, 9, 88, 54, 61, 15, 59, 94, +! 14, 58, 15, 59, 15, 59, 94, 14, 58, 89, +! 61, 26, 89, 94, 14, 58, 89, 89, 14, 58, +! 89, 89, 5, 84, 89, 94, 89, 89, 15, 59, +! 89, 89, 15, 59, 89, 15, 59, 15, 59 + }; + +--- 1401,1434 ---- + 53, 55, 56, 58, 60, 63, 65, 66, 68, 69, + 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, +! 81, 82, 83, 95, 96, 97, 98, 99, 0, 52, +! 53, 89, 94, 26, 26, 31, 26, 89, 89, 26, +! 26, 68, 70, 32, 51, 52, 53, 93, 97, 24, +! 25, 60, 35, 36, 37, 38, 39, 43, 46, 47, +! 55, 56, 35, 36, 37, 38, 39, 43, 46, 47, +! 55, 56, 26, 26, 26, 29, 57, 26, 26, 29, +! 57, 26, 26, 26, 26, 26, 89, 94, 26, 26, +! 89, 89, 0, 26, 66, 65, 67, 52, 53, 92, +! 33, 34, 50, 51, 48, 54, 93, 97, 4, 52, +! 90, 91, 97, 94, 51, 94, 14, 58, 93, 51, +! 94, 14, 14, 52, 60, 70, 76, 70, 67, 19, +! 25, 61, 26, 26, 26, 29, 57, 26, 26, 29, +! 57, 26, 26, 26, 26, 26, 26, 26, 26, 29, +! 57, 26, 26, 29, 57, 26, 26, 26, 26, 26, +! 61, 61, 59, 61, 65, 94, 94, 96, 96, 94, +! 94, 89, 33, 34, 50, 51, 52, 21, 94, 14, +! 21, 58, 89, 89, 94, 94, 14, 21, 58, 89, +! 89, 94, 61, 67, 67, 94, 96, 96, 98, 98, +! 5, 6, 7, 84, 94, 94, 94, 94, 94, 85, +! 86, 87, 94, 14, 58, 89, 26, 64, 93, 89, +! 15, 59, 14, 58, 14, 58, 89, 64, 93, 89, +! 15, 15, 76, 94, 76, 89, 89, 7, 91, 91, +! 91, 91, 91, 9, 40, 41, 42, 86, 94, 9, +! 26, 60, 88, 89, 89, 15, 26, 93, 94, 59, +! 89, 89, 89, 89, 15, 93, 94, 59, 76, 7, +! 4, 40, 41, 42, 9, 88, 54, 61, 15, 59, +! 94, 14, 58, 15, 59, 15, 59, 94, 14, 58, +! 89, 61, 26, 89, 94, 14, 58, 89, 89, 14, +! 58, 89, 89, 5, 84, 89, 94, 89, 89, 15, +! 59, 89, 89, 15, 59, 89, 15, 59, 15, 59 + }; + +*************** +*** 1436,1457 **** + static const yytype_int8 yyr1[] = + { +! 0, 62, 63, 63, 63, 63, 63, 63, 64, 64, +! 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, +! 65, 65, 65, 65, 66, 66, 66, 67, 67, 68, +! 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, +! 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, +! 71, 71, 71, 71, 71, 72, 72, 72, 72, 73, +! 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, +! 75, 75, 75, 75, 76, 76, 77, 78, 78, 79, +! 79, 79, 79, 79, 80, 80, 80, 81, 82, 83, +! 84, 84, 84, 85, 85, 86, 86, 86, 86, 87, +! 87, 87, 87, 87, 87, 88, 88, 89, 89, 90, +! 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, +! 93, 93, 93, 94, 94, 95, 95, 95, 96, 96, +! 96, 96, 96, 97, 97, 97, 97, 97, 98, 98, +! 98, 99, 99, 99, 99 + }; + +--- 1436,1457 ---- + static const yytype_int8 yyr1[] = + { +! 0, 62, 63, 63, 63, 63, 63, 63, 63, 64, +! 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, +! 65, 65, 65, 65, 65, 66, 66, 66, 67, 67, +! 68, 68, 69, 69, 69, 69, 69, 70, 70, 70, +! 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, +! 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, +! 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, +! 74, 75, 75, 75, 75, 76, 76, 77, 78, 78, +! 79, 79, 79, 79, 79, 80, 80, 80, 81, 82, +! 83, 84, 84, 84, 85, 85, 86, 86, 86, 86, +! 87, 87, 87, 87, 87, 87, 88, 88, 89, 89, +! 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, +! 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, +! 96, 96, 96, 96, 97, 97, 97, 97, 97, 98, +! 98, 98, 99, 99, 99, 99 + }; + +*************** +*** 1459,1480 **** + static const yytype_int8 yyr2[] = + { +! 0, 2, 2, 1, 1, 2, 2, 1, 1, 2, +! 2, 2, 3, 3, 3, 3, 2, 3, 3, 2, + 3, 3, 2, 3, 3, 2, 3, 3, 2, 3, + 3, 2, 3, 3, 2, 3, 3, 2, 3, 3, +! 2, 3, 3, 2, 3, 3, 2, 3, 3, 2, +! 3, 3, 2, 2, 1, 1, 1, 1, 2, 1, +! 2, 1, 1, 2, 1, 1, 1, 1, 5, 5, +! 1, 1, 1, 1, 1, 1, 1, 6, 6, 7, +! 7, 10, 10, 9, 9, 7, 7, 5, 5, 6, +! 6, 7, 7, 10, 10, 9, 9, 6, 7, 6, +! 5, 6, 3, 5, 1, 2, 3, 3, 3, 2, +! 3, 3, 4, 2, 5, 7, 6, 3, 1, 3, +! 4, 6, 5, 1, 2, 4, 4, 5, 5, 2, +! 3, 2, 3, 2, 3, 1, 3, 2, 2, 3, +! 3, 3, 4, 4, 4, 4, 4, 1, 1, 1, +! 1, 1, 1, 0, 2, 1, 2, 2, 4, 4, +! 3, 3, 1, 1, 2, 2, 2, 2, 4, 4, +! 1, 1, 2, 2, 3 + }; + +--- 1459,1480 ---- + static const yytype_int8 yyr2[] = + { +! 0, 2, 2, 1, 1, 2, 2, 2, 1, 1, +! 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, +! 2, 3, 3, 2, 3, 3, 2, 3, 3, 2, + 3, 3, 2, 3, 3, 2, 3, 3, 2, 3, + 3, 2, 3, 3, 2, 3, 3, 2, 3, 3, +! 2, 3, 3, 2, 2, 1, 1, 1, 1, 2, +! 1, 2, 1, 1, 2, 1, 1, 1, 1, 5, +! 5, 1, 1, 1, 1, 1, 1, 1, 6, 6, +! 7, 7, 10, 10, 9, 9, 7, 7, 5, 5, +! 6, 6, 7, 7, 10, 10, 9, 9, 6, 7, +! 6, 5, 6, 3, 5, 1, 2, 3, 3, 3, +! 2, 3, 3, 4, 2, 5, 7, 6, 3, 1, +! 3, 4, 6, 5, 1, 2, 4, 4, 5, 5, +! 2, 3, 2, 3, 2, 3, 1, 3, 2, 2, +! 3, 3, 3, 4, 4, 4, 4, 4, 1, 1, +! 1, 1, 1, 1, 0, 2, 1, 2, 2, 4, +! 4, 3, 3, 1, 1, 2, 2, 2, 2, 4, +! 4, 1, 1, 2, 2, 3 + }; + +*************** +*** 2019,2025 **** + break; + +! case 7: /* inputunit: yacc_EOF */ + #line 456 "/usr/local/src/chet/src/bash/src/parse.y" + { + /* Case of EOF seen by itself. Do ignoreeof or + not. */ +--- 2019,2044 ---- + break; + +! case 7: /* inputunit: error $end */ + #line 456 "/usr/local/src/chet/src/bash/src/parse.y" + { ++ global_command = (COMMAND *)NULL; ++ if (last_command_exit_value == 0) ++ last_command_exit_value = EX_BADUSAGE; /* force error return */ ++ if (interactive && parse_and_execute_level == 0) ++ { ++ handle_eof_input_unit (); ++ YYACCEPT; ++ } ++ else ++ { ++ YYABORT; ++ } ++ } ++ #line 2038 "y.tab.c" ++ break; ++ ++ case 8: /* inputunit: yacc_EOF */ ++ #line 471 "/usr/local/src/chet/src/bash/src/parse.y" ++ { + /* Case of EOF seen by itself. Do ignoreeof or + not. */ +*************** +*** 2028,2048 **** + YYACCEPT; + } +! #line 2031 "y.tab.c" + break; + +! case 8: /* word_list: WORD */ +! #line 466 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[0].word), (WORD_LIST *)NULL); } +! #line 2037 "y.tab.c" + break; + +! case 9: /* word_list: word_list WORD */ +! #line 468 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[0].word), (yyvsp[-1].word_list)); } +! #line 2043 "y.tab.c" + break; + +! case 10: /* redirection: '>' WORD */ +! #line 472 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +--- 2047,2067 ---- + YYACCEPT; + } +! #line 2050 "y.tab.c" + break; + +! case 9: /* word_list: WORD */ +! #line 481 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[0].word), (WORD_LIST *)NULL); } +! #line 2056 "y.tab.c" + break; + +! case 10: /* word_list: word_list WORD */ +! #line 483 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[0].word), (yyvsp[-1].word_list)); } +! #line 2062 "y.tab.c" + break; + +! case 11: /* redirection: '>' WORD */ +! #line 487 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +*************** +*** 2050,2058 **** + (yyval.redirect) = make_redirection (source, r_output_direction, redir, 0); + } +! #line 2053 "y.tab.c" + break; + +! case 11: /* redirection: '<' WORD */ +! #line 478 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +--- 2069,2077 ---- + (yyval.redirect) = make_redirection (source, r_output_direction, redir, 0); + } +! #line 2072 "y.tab.c" + break; + +! case 12: /* redirection: '<' WORD */ +! #line 493 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +*************** +*** 2060,2068 **** + (yyval.redirect) = make_redirection (source, r_input_direction, redir, 0); + } +! #line 2063 "y.tab.c" + break; + +! case 12: /* redirection: NUMBER '>' WORD */ +! #line 484 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2079,2087 ---- + (yyval.redirect) = make_redirection (source, r_input_direction, redir, 0); + } +! #line 2082 "y.tab.c" + break; + +! case 13: /* redirection: NUMBER '>' WORD */ +! #line 499 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2070,2078 **** + (yyval.redirect) = make_redirection (source, r_output_direction, redir, 0); + } +! #line 2073 "y.tab.c" + break; + +! case 13: /* redirection: NUMBER '<' WORD */ +! #line 490 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2089,2097 ---- + (yyval.redirect) = make_redirection (source, r_output_direction, redir, 0); + } +! #line 2092 "y.tab.c" + break; + +! case 14: /* redirection: NUMBER '<' WORD */ +! #line 505 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2080,2088 **** + (yyval.redirect) = make_redirection (source, r_input_direction, redir, 0); + } +! #line 2083 "y.tab.c" + break; + +! case 14: /* redirection: REDIR_WORD '>' WORD */ +! #line 496 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2099,2107 ---- + (yyval.redirect) = make_redirection (source, r_input_direction, redir, 0); + } +! #line 2102 "y.tab.c" + break; + +! case 15: /* redirection: REDIR_WORD '>' WORD */ +! #line 511 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2090,2098 **** + (yyval.redirect) = make_redirection (source, r_output_direction, redir, REDIR_VARASSIGN); + } +! #line 2093 "y.tab.c" + break; + +! case 15: /* redirection: REDIR_WORD '<' WORD */ +! #line 502 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2109,2117 ---- + (yyval.redirect) = make_redirection (source, r_output_direction, redir, REDIR_VARASSIGN); + } +! #line 2112 "y.tab.c" + break; + +! case 16: /* redirection: REDIR_WORD '<' WORD */ +! #line 517 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2100,2108 **** + (yyval.redirect) = make_redirection (source, r_input_direction, redir, REDIR_VARASSIGN); + } +! #line 2103 "y.tab.c" + break; + +! case 16: /* redirection: GREATER_GREATER WORD */ +! #line 508 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +--- 2119,2127 ---- + (yyval.redirect) = make_redirection (source, r_input_direction, redir, REDIR_VARASSIGN); + } +! #line 2122 "y.tab.c" + break; + +! case 17: /* redirection: GREATER_GREATER WORD */ +! #line 523 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +*************** +*** 2110,2118 **** + (yyval.redirect) = make_redirection (source, r_appending_to, redir, 0); + } +! #line 2113 "y.tab.c" + break; + +! case 17: /* redirection: NUMBER GREATER_GREATER WORD */ +! #line 514 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2129,2137 ---- + (yyval.redirect) = make_redirection (source, r_appending_to, redir, 0); + } +! #line 2132 "y.tab.c" + break; + +! case 18: /* redirection: NUMBER GREATER_GREATER WORD */ +! #line 529 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2120,2128 **** + (yyval.redirect) = make_redirection (source, r_appending_to, redir, 0); + } +! #line 2123 "y.tab.c" + break; + +! case 18: /* redirection: REDIR_WORD GREATER_GREATER WORD */ +! #line 520 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2139,2147 ---- + (yyval.redirect) = make_redirection (source, r_appending_to, redir, 0); + } +! #line 2142 "y.tab.c" + break; + +! case 19: /* redirection: REDIR_WORD GREATER_GREATER WORD */ +! #line 535 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2130,2138 **** + (yyval.redirect) = make_redirection (source, r_appending_to, redir, REDIR_VARASSIGN); + } +! #line 2133 "y.tab.c" + break; + +! case 19: /* redirection: GREATER_BAR WORD */ +! #line 526 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +--- 2149,2157 ---- + (yyval.redirect) = make_redirection (source, r_appending_to, redir, REDIR_VARASSIGN); + } +! #line 2152 "y.tab.c" + break; + +! case 20: /* redirection: GREATER_BAR WORD */ +! #line 541 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +*************** +*** 2140,2148 **** + (yyval.redirect) = make_redirection (source, r_output_force, redir, 0); + } +! #line 2143 "y.tab.c" + break; + +! case 20: /* redirection: NUMBER GREATER_BAR WORD */ +! #line 532 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2159,2167 ---- + (yyval.redirect) = make_redirection (source, r_output_force, redir, 0); + } +! #line 2162 "y.tab.c" + break; + +! case 21: /* redirection: NUMBER GREATER_BAR WORD */ +! #line 547 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2150,2158 **** + (yyval.redirect) = make_redirection (source, r_output_force, redir, 0); + } +! #line 2153 "y.tab.c" + break; + +! case 21: /* redirection: REDIR_WORD GREATER_BAR WORD */ +! #line 538 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2169,2177 ---- + (yyval.redirect) = make_redirection (source, r_output_force, redir, 0); + } +! #line 2172 "y.tab.c" + break; + +! case 22: /* redirection: REDIR_WORD GREATER_BAR WORD */ +! #line 553 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2160,2168 **** + (yyval.redirect) = make_redirection (source, r_output_force, redir, REDIR_VARASSIGN); + } +! #line 2163 "y.tab.c" + break; + +! case 22: /* redirection: LESS_GREATER WORD */ +! #line 544 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +--- 2179,2187 ---- + (yyval.redirect) = make_redirection (source, r_output_force, redir, REDIR_VARASSIGN); + } +! #line 2182 "y.tab.c" + break; + +! case 23: /* redirection: LESS_GREATER WORD */ +! #line 559 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +*************** +*** 2170,2178 **** + (yyval.redirect) = make_redirection (source, r_input_output, redir, 0); + } +! #line 2173 "y.tab.c" + break; + +! case 23: /* redirection: NUMBER LESS_GREATER WORD */ +! #line 550 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2189,2197 ---- + (yyval.redirect) = make_redirection (source, r_input_output, redir, 0); + } +! #line 2192 "y.tab.c" + break; + +! case 24: /* redirection: NUMBER LESS_GREATER WORD */ +! #line 565 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2180,2188 **** + (yyval.redirect) = make_redirection (source, r_input_output, redir, 0); + } +! #line 2183 "y.tab.c" + break; + +! case 24: /* redirection: REDIR_WORD LESS_GREATER WORD */ +! #line 556 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2199,2207 ---- + (yyval.redirect) = make_redirection (source, r_input_output, redir, 0); + } +! #line 2202 "y.tab.c" + break; + +! case 25: /* redirection: REDIR_WORD LESS_GREATER WORD */ +! #line 571 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2190,2198 **** + (yyval.redirect) = make_redirection (source, r_input_output, redir, REDIR_VARASSIGN); + } +! #line 2193 "y.tab.c" + break; + +! case 25: /* redirection: LESS_LESS WORD */ +! #line 562 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +--- 2209,2217 ---- + (yyval.redirect) = make_redirection (source, r_input_output, redir, REDIR_VARASSIGN); + } +! #line 2212 "y.tab.c" + break; + +! case 26: /* redirection: LESS_LESS WORD */ +! #line 577 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +*************** +*** 2201,2209 **** + push_heredoc ((yyval.redirect)); + } +! #line 2204 "y.tab.c" + break; + +! case 26: /* redirection: NUMBER LESS_LESS WORD */ +! #line 569 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2220,2228 ---- + push_heredoc ((yyval.redirect)); + } +! #line 2223 "y.tab.c" + break; + +! case 27: /* redirection: NUMBER LESS_LESS WORD */ +! #line 584 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2212,2220 **** + push_heredoc ((yyval.redirect)); + } +! #line 2215 "y.tab.c" + break; + +! case 27: /* redirection: REDIR_WORD LESS_LESS WORD */ +! #line 576 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2231,2239 ---- + push_heredoc ((yyval.redirect)); + } +! #line 2234 "y.tab.c" + break; + +! case 28: /* redirection: REDIR_WORD LESS_LESS WORD */ +! #line 591 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2223,2231 **** + push_heredoc ((yyval.redirect)); + } +! #line 2226 "y.tab.c" + break; + +! case 28: /* redirection: LESS_LESS_MINUS WORD */ +! #line 583 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +--- 2242,2250 ---- + push_heredoc ((yyval.redirect)); + } +! #line 2245 "y.tab.c" + break; + +! case 29: /* redirection: LESS_LESS_MINUS WORD */ +! #line 598 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +*************** +*** 2234,2242 **** + push_heredoc ((yyval.redirect)); + } +! #line 2237 "y.tab.c" + break; + +! case 29: /* redirection: NUMBER LESS_LESS_MINUS WORD */ +! #line 590 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2253,2261 ---- + push_heredoc ((yyval.redirect)); + } +! #line 2256 "y.tab.c" + break; + +! case 30: /* redirection: NUMBER LESS_LESS_MINUS WORD */ +! #line 605 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2245,2253 **** + push_heredoc ((yyval.redirect)); + } +! #line 2248 "y.tab.c" + break; + +! case 30: /* redirection: REDIR_WORD LESS_LESS_MINUS WORD */ +! #line 597 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2264,2272 ---- + push_heredoc ((yyval.redirect)); + } +! #line 2267 "y.tab.c" + break; + +! case 31: /* redirection: REDIR_WORD LESS_LESS_MINUS WORD */ +! #line 612 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2256,2264 **** + push_heredoc ((yyval.redirect)); + } +! #line 2259 "y.tab.c" + break; + +! case 31: /* redirection: LESS_LESS_LESS WORD */ +! #line 604 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +--- 2275,2283 ---- + push_heredoc ((yyval.redirect)); + } +! #line 2278 "y.tab.c" + break; + +! case 32: /* redirection: LESS_LESS_LESS WORD */ +! #line 619 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +*************** +*** 2266,2274 **** + (yyval.redirect) = make_redirection (source, r_reading_string, redir, 0); + } +! #line 2269 "y.tab.c" + break; + +! case 32: /* redirection: NUMBER LESS_LESS_LESS WORD */ +! #line 610 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2285,2293 ---- + (yyval.redirect) = make_redirection (source, r_reading_string, redir, 0); + } +! #line 2288 "y.tab.c" + break; + +! case 33: /* redirection: NUMBER LESS_LESS_LESS WORD */ +! #line 625 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2276,2284 **** + (yyval.redirect) = make_redirection (source, r_reading_string, redir, 0); + } +! #line 2279 "y.tab.c" + break; + +! case 33: /* redirection: REDIR_WORD LESS_LESS_LESS WORD */ +! #line 616 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2295,2303 ---- + (yyval.redirect) = make_redirection (source, r_reading_string, redir, 0); + } +! #line 2298 "y.tab.c" + break; + +! case 34: /* redirection: REDIR_WORD LESS_LESS_LESS WORD */ +! #line 631 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2286,2294 **** + (yyval.redirect) = make_redirection (source, r_reading_string, redir, REDIR_VARASSIGN); + } +! #line 2289 "y.tab.c" + break; + +! case 34: /* redirection: LESS_AND NUMBER */ +! #line 622 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +--- 2305,2313 ---- + (yyval.redirect) = make_redirection (source, r_reading_string, redir, REDIR_VARASSIGN); + } +! #line 2308 "y.tab.c" + break; + +! case 35: /* redirection: LESS_AND NUMBER */ +! #line 637 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +*************** +*** 2296,2304 **** + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, 0); + } +! #line 2299 "y.tab.c" + break; + +! case 35: /* redirection: NUMBER LESS_AND NUMBER */ +! #line 628 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2315,2323 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, 0); + } +! #line 2318 "y.tab.c" + break; + +! case 36: /* redirection: NUMBER LESS_AND NUMBER */ +! #line 643 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2306,2314 **** + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, 0); + } +! #line 2309 "y.tab.c" + break; + +! case 36: /* redirection: REDIR_WORD LESS_AND NUMBER */ +! #line 634 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2325,2333 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, 0); + } +! #line 2328 "y.tab.c" + break; + +! case 37: /* redirection: REDIR_WORD LESS_AND NUMBER */ +! #line 649 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2316,2324 **** + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, REDIR_VARASSIGN); + } +! #line 2319 "y.tab.c" + break; + +! case 37: /* redirection: GREATER_AND NUMBER */ +! #line 640 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +--- 2335,2343 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, REDIR_VARASSIGN); + } +! #line 2338 "y.tab.c" + break; + +! case 38: /* redirection: GREATER_AND NUMBER */ +! #line 655 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +*************** +*** 2326,2334 **** + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, 0); + } +! #line 2329 "y.tab.c" + break; + +! case 38: /* redirection: NUMBER GREATER_AND NUMBER */ +! #line 646 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2345,2353 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, 0); + } +! #line 2348 "y.tab.c" + break; + +! case 39: /* redirection: NUMBER GREATER_AND NUMBER */ +! #line 661 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2336,2344 **** + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, 0); + } +! #line 2339 "y.tab.c" + break; + +! case 39: /* redirection: REDIR_WORD GREATER_AND NUMBER */ +! #line 652 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2355,2363 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, 0); + } +! #line 2358 "y.tab.c" + break; + +! case 40: /* redirection: REDIR_WORD GREATER_AND NUMBER */ +! #line 667 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2346,2354 **** + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, REDIR_VARASSIGN); + } +! #line 2349 "y.tab.c" + break; + +! case 40: /* redirection: LESS_AND WORD */ +! #line 658 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +--- 2365,2373 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, REDIR_VARASSIGN); + } +! #line 2368 "y.tab.c" + break; + +! case 41: /* redirection: LESS_AND WORD */ +! #line 673 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +*************** +*** 2356,2364 **** + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, 0); + } +! #line 2359 "y.tab.c" + break; + +! case 41: /* redirection: NUMBER LESS_AND WORD */ +! #line 664 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2375,2383 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, 0); + } +! #line 2378 "y.tab.c" + break; + +! case 42: /* redirection: NUMBER LESS_AND WORD */ +! #line 679 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2366,2374 **** + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, 0); + } +! #line 2369 "y.tab.c" + break; + +! case 42: /* redirection: REDIR_WORD LESS_AND WORD */ +! #line 670 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2385,2393 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, 0); + } +! #line 2388 "y.tab.c" + break; + +! case 43: /* redirection: REDIR_WORD LESS_AND WORD */ +! #line 685 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2376,2384 **** + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, REDIR_VARASSIGN); + } +! #line 2379 "y.tab.c" + break; + +! case 43: /* redirection: GREATER_AND WORD */ +! #line 676 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +--- 2395,2403 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, REDIR_VARASSIGN); + } +! #line 2398 "y.tab.c" + break; + +! case 44: /* redirection: GREATER_AND WORD */ +! #line 691 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +*************** +*** 2386,2394 **** + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, 0); + } +! #line 2389 "y.tab.c" + break; + +! case 44: /* redirection: NUMBER GREATER_AND WORD */ +! #line 682 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2405,2413 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, 0); + } +! #line 2408 "y.tab.c" + break; + +! case 45: /* redirection: NUMBER GREATER_AND WORD */ +! #line 697 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2396,2404 **** + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, 0); + } +! #line 2399 "y.tab.c" + break; + +! case 45: /* redirection: REDIR_WORD GREATER_AND WORD */ +! #line 688 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2415,2423 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, 0); + } +! #line 2418 "y.tab.c" + break; + +! case 46: /* redirection: REDIR_WORD GREATER_AND WORD */ +! #line 703 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2406,2414 **** + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, REDIR_VARASSIGN); + } +! #line 2409 "y.tab.c" + break; + +! case 46: /* redirection: GREATER_AND '-' */ +! #line 694 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +--- 2425,2433 ---- + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, REDIR_VARASSIGN); + } +! #line 2428 "y.tab.c" + break; + +! case 47: /* redirection: GREATER_AND '-' */ +! #line 709 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +*************** +*** 2416,2424 **** + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } +! #line 2419 "y.tab.c" + break; + +! case 47: /* redirection: NUMBER GREATER_AND '-' */ +! #line 700 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2435,2443 ---- + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } +! #line 2438 "y.tab.c" + break; + +! case 48: /* redirection: NUMBER GREATER_AND '-' */ +! #line 715 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2426,2434 **** + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } +! #line 2429 "y.tab.c" + break; + +! case 48: /* redirection: REDIR_WORD GREATER_AND '-' */ +! #line 706 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2445,2453 ---- + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } +! #line 2448 "y.tab.c" + break; + +! case 49: /* redirection: REDIR_WORD GREATER_AND '-' */ +! #line 721 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2436,2444 **** + (yyval.redirect) = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN); + } +! #line 2439 "y.tab.c" + break; + +! case 49: /* redirection: LESS_AND '-' */ +! #line 712 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +--- 2455,2463 ---- + (yyval.redirect) = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN); + } +! #line 2458 "y.tab.c" + break; + +! case 50: /* redirection: LESS_AND '-' */ +! #line 727 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 0; +*************** +*** 2446,2454 **** + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } +! #line 2449 "y.tab.c" + break; + +! case 50: /* redirection: NUMBER LESS_AND '-' */ +! #line 718 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +--- 2465,2473 ---- + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } +! #line 2468 "y.tab.c" + break; + +! case 51: /* redirection: NUMBER LESS_AND '-' */ +! #line 733 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[-2].number); +*************** +*** 2456,2464 **** + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } +! #line 2459 "y.tab.c" + break; + +! case 51: /* redirection: REDIR_WORD LESS_AND '-' */ +! #line 724 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +--- 2475,2483 ---- + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } +! #line 2478 "y.tab.c" + break; + +! case 52: /* redirection: REDIR_WORD LESS_AND '-' */ +! #line 739 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[-2].word); +*************** +*** 2466,2474 **** + (yyval.redirect) = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN); + } +! #line 2469 "y.tab.c" + break; + +! case 52: /* redirection: AND_GREATER WORD */ +! #line 730 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +--- 2485,2493 ---- + (yyval.redirect) = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN); + } +! #line 2488 "y.tab.c" + break; + +! case 53: /* redirection: AND_GREATER WORD */ +! #line 745 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +*************** +*** 2476,2484 **** + (yyval.redirect) = make_redirection (source, r_err_and_out, redir, 0); + } +! #line 2479 "y.tab.c" + break; + +! case 53: /* redirection: AND_GREATER_GREATER WORD */ +! #line 736 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +--- 2495,2503 ---- + (yyval.redirect) = make_redirection (source, r_err_and_out, redir, 0); + } +! #line 2498 "y.tab.c" + break; + +! case 54: /* redirection: AND_GREATER_GREATER WORD */ +! #line 751 "/usr/local/src/chet/src/bash/src/parse.y" + { + source.dest = 1; +*************** +*** 2486,2520 **** + (yyval.redirect) = make_redirection (source, r_append_err_and_out, redir, 0); + } +! #line 2489 "y.tab.c" + break; + +! case 54: /* simple_command_element: WORD */ +! #line 744 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.element).word = (yyvsp[0].word); (yyval.element).redirect = 0; } +! #line 2495 "y.tab.c" + break; + +! case 55: /* simple_command_element: ASSIGNMENT_WORD */ +! #line 746 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.element).word = (yyvsp[0].word); (yyval.element).redirect = 0; } +! #line 2501 "y.tab.c" + break; + +! case 56: /* simple_command_element: redirection */ +! #line 748 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.element).redirect = (yyvsp[0].redirect); (yyval.element).word = 0; } +! #line 2507 "y.tab.c" + break; + +! case 57: /* redirection_list: redirection */ +! #line 752 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.redirect) = (yyvsp[0].redirect); + } +! #line 2515 "y.tab.c" + break; + +! case 58: /* redirection_list: redirection_list redirection */ +! #line 756 "/usr/local/src/chet/src/bash/src/parse.y" + { + register REDIRECT *t; +--- 2505,2539 ---- + (yyval.redirect) = make_redirection (source, r_append_err_and_out, redir, 0); + } +! #line 2508 "y.tab.c" + break; + +! case 55: /* simple_command_element: WORD */ +! #line 759 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.element).word = (yyvsp[0].word); (yyval.element).redirect = 0; } +! #line 2514 "y.tab.c" + break; + +! case 56: /* simple_command_element: ASSIGNMENT_WORD */ +! #line 761 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.element).word = (yyvsp[0].word); (yyval.element).redirect = 0; } +! #line 2520 "y.tab.c" + break; + +! case 57: /* simple_command_element: redirection */ +! #line 763 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.element).redirect = (yyvsp[0].redirect); (yyval.element).word = 0; } +! #line 2526 "y.tab.c" + break; + +! case 58: /* redirection_list: redirection */ +! #line 767 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.redirect) = (yyvsp[0].redirect); + } +! #line 2534 "y.tab.c" + break; + +! case 59: /* redirection_list: redirection_list redirection */ +! #line 771 "/usr/local/src/chet/src/bash/src/parse.y" + { + register REDIRECT *t; +*************** +*** 2525,2557 **** + (yyval.redirect) = (yyvsp[-1].redirect); + } +! #line 2528 "y.tab.c" + break; + +! case 59: /* simple_command: simple_command_element */ +! #line 767 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_simple_command ((yyvsp[0].element), (COMMAND *)NULL); } +! #line 2534 "y.tab.c" + break; + +! case 60: /* simple_command: simple_command simple_command_element */ +! #line 769 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_simple_command ((yyvsp[0].element), (yyvsp[-1].command)); } +! #line 2540 "y.tab.c" + break; + +! case 61: /* command: simple_command */ +! #line 773 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = clean_simple_command ((yyvsp[0].command)); } +! #line 2546 "y.tab.c" + break; + +! case 62: /* command: shell_command */ +! #line 775 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2552 "y.tab.c" + break; + +! case 63: /* command: shell_command redirection_list */ +! #line 777 "/usr/local/src/chet/src/bash/src/parse.y" + { + COMMAND *tc; +--- 2544,2576 ---- + (yyval.redirect) = (yyvsp[-1].redirect); + } +! #line 2547 "y.tab.c" + break; + +! case 60: /* simple_command: simple_command_element */ +! #line 782 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_simple_command ((yyvsp[0].element), (COMMAND *)NULL); } +! #line 2553 "y.tab.c" + break; + +! case 61: /* simple_command: simple_command simple_command_element */ +! #line 784 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_simple_command ((yyvsp[0].element), (yyvsp[-1].command)); } +! #line 2559 "y.tab.c" + break; + +! case 62: /* command: simple_command */ +! #line 788 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = clean_simple_command ((yyvsp[0].command)); } +! #line 2565 "y.tab.c" + break; + +! case 63: /* command: shell_command */ +! #line 790 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2571 "y.tab.c" + break; + +! case 64: /* command: shell_command redirection_list */ +! #line 792 "/usr/local/src/chet/src/bash/src/parse.y" + { + COMMAND *tc; +*************** +*** 2569,2727 **** + (yyval.command) = (yyvsp[-1].command); + } +! #line 2572 "y.tab.c" + break; + +! case 64: /* command: function_def */ +! #line 793 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2578 "y.tab.c" + break; + +! case 65: /* command: coproc */ +! #line 795 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2584 "y.tab.c" + break; + +! case 66: /* shell_command: for_command */ +! #line 799 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2590 "y.tab.c" + break; + +! case 67: /* shell_command: case_command */ +! #line 801 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2596 "y.tab.c" + break; + +! case 68: /* shell_command: WHILE compound_list DO compound_list DONE */ +! #line 803 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_while_command ((yyvsp[-3].command), (yyvsp[-1].command)); } +! #line 2602 "y.tab.c" + break; + +! case 69: /* shell_command: UNTIL compound_list DO compound_list DONE */ +! #line 805 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_until_command ((yyvsp[-3].command), (yyvsp[-1].command)); } +! #line 2608 "y.tab.c" + break; + +! case 70: /* shell_command: select_command */ +! #line 807 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2614 "y.tab.c" + break; + +! case 71: /* shell_command: if_command */ +! #line 809 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2620 "y.tab.c" + break; + +! case 72: /* shell_command: subshell */ +! #line 811 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2626 "y.tab.c" + break; + +! case 73: /* shell_command: group_command */ +! #line 813 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2632 "y.tab.c" + break; + +! case 74: /* shell_command: arith_command */ +! #line 815 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2638 "y.tab.c" + break; + +! case 75: /* shell_command: cond_command */ +! #line 817 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2644 "y.tab.c" + break; + +! case 76: /* shell_command: arith_for_command */ +! #line 819 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2650 "y.tab.c" + break; + +! case 77: /* for_command: FOR WORD newline_list DO compound_list DONE */ +! #line 823 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-4].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2659 "y.tab.c" + break; + +! case 78: /* for_command: FOR WORD newline_list '{' compound_list '}' */ +! #line 828 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-4].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2668 "y.tab.c" + break; + +! case 79: /* for_command: FOR WORD ';' newline_list DO compound_list DONE */ +! #line 833 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-5].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2677 "y.tab.c" + break; + +! case 80: /* for_command: FOR WORD ';' newline_list '{' compound_list '}' */ +! #line 838 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-5].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2686 "y.tab.c" + break; + +! case 81: /* for_command: FOR WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE */ +! #line 843 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-8].word), REVERSE_LIST ((yyvsp[-5].word_list), WORD_LIST *), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2695 "y.tab.c" + break; + +! case 82: /* for_command: FOR WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}' */ +! #line 848 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-8].word), REVERSE_LIST ((yyvsp[-5].word_list), WORD_LIST *), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2704 "y.tab.c" + break; + +! case 83: /* for_command: FOR WORD newline_list IN list_terminator newline_list DO compound_list DONE */ +! #line 853 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-7].word), (WORD_LIST *)NULL, (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2713 "y.tab.c" + break; + +! case 84: /* for_command: FOR WORD newline_list IN list_terminator newline_list '{' compound_list '}' */ +! #line 858 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-7].word), (WORD_LIST *)NULL, (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2722 "y.tab.c" + break; + +! case 85: /* arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list DO compound_list DONE */ +! #line 865 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[-5].word_list), (yyvsp[-1].command), arith_for_lineno); +--- 2588,2746 ---- + (yyval.command) = (yyvsp[-1].command); + } +! #line 2591 "y.tab.c" + break; + +! case 65: /* command: function_def */ +! #line 808 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2597 "y.tab.c" + break; + +! case 66: /* command: coproc */ +! #line 810 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2603 "y.tab.c" + break; + +! case 67: /* shell_command: for_command */ +! #line 814 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2609 "y.tab.c" + break; + +! case 68: /* shell_command: case_command */ +! #line 816 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2615 "y.tab.c" + break; + +! case 69: /* shell_command: WHILE compound_list DO compound_list DONE */ +! #line 818 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_while_command ((yyvsp[-3].command), (yyvsp[-1].command)); } +! #line 2621 "y.tab.c" + break; + +! case 70: /* shell_command: UNTIL compound_list DO compound_list DONE */ +! #line 820 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_until_command ((yyvsp[-3].command), (yyvsp[-1].command)); } +! #line 2627 "y.tab.c" + break; + +! case 71: /* shell_command: select_command */ +! #line 822 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2633 "y.tab.c" + break; + +! case 72: /* shell_command: if_command */ +! #line 824 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2639 "y.tab.c" + break; + +! case 73: /* shell_command: subshell */ +! #line 826 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2645 "y.tab.c" + break; + +! case 74: /* shell_command: group_command */ +! #line 828 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2651 "y.tab.c" + break; + +! case 75: /* shell_command: arith_command */ +! #line 830 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2657 "y.tab.c" + break; + +! case 76: /* shell_command: cond_command */ +! #line 832 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2663 "y.tab.c" + break; + +! case 77: /* shell_command: arith_for_command */ +! #line 834 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2669 "y.tab.c" + break; + +! case 78: /* for_command: FOR WORD newline_list DO compound_list DONE */ +! #line 838 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-4].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2678 "y.tab.c" + break; + +! case 79: /* for_command: FOR WORD newline_list '{' compound_list '}' */ +! #line 843 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-4].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2687 "y.tab.c" + break; + +! case 80: /* for_command: FOR WORD ';' newline_list DO compound_list DONE */ +! #line 848 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-5].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2696 "y.tab.c" + break; + +! case 81: /* for_command: FOR WORD ';' newline_list '{' compound_list '}' */ +! #line 853 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-5].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2705 "y.tab.c" + break; + +! case 82: /* for_command: FOR WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE */ +! #line 858 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-8].word), REVERSE_LIST ((yyvsp[-5].word_list), WORD_LIST *), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2714 "y.tab.c" + break; + +! case 83: /* for_command: FOR WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}' */ +! #line 863 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-8].word), REVERSE_LIST ((yyvsp[-5].word_list), WORD_LIST *), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2723 "y.tab.c" + break; + +! case 84: /* for_command: FOR WORD newline_list IN list_terminator newline_list DO compound_list DONE */ +! #line 868 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-7].word), (WORD_LIST *)NULL, (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2732 "y.tab.c" + break; + +! case 85: /* for_command: FOR WORD newline_list IN list_terminator newline_list '{' compound_list '}' */ +! #line 873 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_for_command ((yyvsp[-7].word), (WORD_LIST *)NULL, (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2741 "y.tab.c" + break; + +! case 86: /* arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list DO compound_list DONE */ +! #line 880 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[-5].word_list), (yyvsp[-1].command), arith_for_lineno); +*************** +*** 2729,2737 **** + if (word_top > 0) word_top--; + } +! #line 2732 "y.tab.c" + break; + +! case 86: /* arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list '{' compound_list '}' */ +! #line 871 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[-5].word_list), (yyvsp[-1].command), arith_for_lineno); +--- 2748,2756 ---- + if (word_top > 0) word_top--; + } +! #line 2751 "y.tab.c" + break; + +! case 87: /* arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list '{' compound_list '}' */ +! #line 886 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[-5].word_list), (yyvsp[-1].command), arith_for_lineno); +*************** +*** 2739,2747 **** + if (word_top > 0) word_top--; + } +! #line 2742 "y.tab.c" + break; + +! case 87: /* arith_for_command: FOR ARITH_FOR_EXPRS DO compound_list DONE */ +! #line 877 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[-3].word_list), (yyvsp[-1].command), arith_for_lineno); +--- 2758,2766 ---- + if (word_top > 0) word_top--; + } +! #line 2761 "y.tab.c" + break; + +! case 88: /* arith_for_command: FOR ARITH_FOR_EXPRS DO compound_list DONE */ +! #line 892 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[-3].word_list), (yyvsp[-1].command), arith_for_lineno); +*************** +*** 2749,2757 **** + if (word_top > 0) word_top--; + } +! #line 2752 "y.tab.c" + break; + +! case 88: /* arith_for_command: FOR ARITH_FOR_EXPRS '{' compound_list '}' */ +! #line 883 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[-3].word_list), (yyvsp[-1].command), arith_for_lineno); +--- 2768,2776 ---- + if (word_top > 0) word_top--; + } +! #line 2771 "y.tab.c" + break; + +! case 89: /* arith_for_command: FOR ARITH_FOR_EXPRS '{' compound_list '}' */ +! #line 898 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_arith_for_command ((yyvsp[-3].word_list), (yyvsp[-1].command), arith_for_lineno); +*************** +*** 2759,2896 **** + if (word_top > 0) word_top--; + } +! #line 2762 "y.tab.c" + break; + +! case 89: /* select_command: SELECT WORD newline_list DO compound_list DONE */ +! #line 891 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-4].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2771 "y.tab.c" + break; + +! case 90: /* select_command: SELECT WORD newline_list '{' compound_list '}' */ +! #line 896 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-4].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2780 "y.tab.c" + break; + +! case 91: /* select_command: SELECT WORD ';' newline_list DO compound_list DONE */ +! #line 901 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-5].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2789 "y.tab.c" + break; + +! case 92: /* select_command: SELECT WORD ';' newline_list '{' compound_list '}' */ +! #line 906 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-5].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2798 "y.tab.c" + break; + +! case 93: /* select_command: SELECT WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE */ +! #line 911 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-8].word), REVERSE_LIST ((yyvsp[-5].word_list), WORD_LIST *), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2807 "y.tab.c" + break; + +! case 94: /* select_command: SELECT WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}' */ +! #line 916 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-8].word), REVERSE_LIST ((yyvsp[-5].word_list), WORD_LIST *), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2816 "y.tab.c" + break; + +! case 95: /* select_command: SELECT WORD newline_list IN list_terminator newline_list DO compound_list DONE */ +! #line 921 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-7].word), (WORD_LIST *)NULL, (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2825 "y.tab.c" + break; + +! case 96: /* select_command: SELECT WORD newline_list IN list_terminator newline_list '{' compound_list '}' */ +! #line 926 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-7].word), (WORD_LIST *)NULL, (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2834 "y.tab.c" + break; + +! case 97: /* case_command: CASE WORD newline_list IN newline_list ESAC */ +! #line 933 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[-4].word), (PATTERN_LIST *)NULL, word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2843 "y.tab.c" + break; + +! case 98: /* case_command: CASE WORD newline_list IN case_clause_sequence newline_list ESAC */ +! #line 938 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[-5].word), (yyvsp[-2].pattern), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2852 "y.tab.c" + break; + +! case 99: /* case_command: CASE WORD newline_list IN case_clause ESAC */ +! #line 943 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[-4].word), (yyvsp[-1].pattern), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2861 "y.tab.c" + break; + +! case 100: /* function_def: WORD '(' ')' newline_list function_body */ +! #line 950 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_function_def ((yyvsp[-4].word), (yyvsp[0].command), function_dstart, function_bstart); } +! #line 2867 "y.tab.c" + break; + +! case 101: /* function_def: FUNCTION WORD '(' ')' newline_list function_body */ +! #line 952 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_function_def ((yyvsp[-4].word), (yyvsp[0].command), function_dstart, function_bstart); } +! #line 2873 "y.tab.c" + break; + +! case 102: /* function_def: FUNCTION WORD function_body */ +! #line 954 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_function_def ((yyvsp[-1].word), (yyvsp[0].command), function_dstart, function_bstart); } +! #line 2879 "y.tab.c" + break; + +! case 103: /* function_def: FUNCTION WORD '\n' newline_list function_body */ +! #line 956 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_function_def ((yyvsp[-3].word), (yyvsp[0].command), function_dstart, function_bstart); } +! #line 2885 "y.tab.c" + break; + +! case 104: /* function_body: shell_command */ +! #line 960 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2891 "y.tab.c" + break; + +! case 105: /* function_body: shell_command redirection_list */ +! #line 962 "/usr/local/src/chet/src/bash/src/parse.y" + { + COMMAND *tc; +--- 2778,2915 ---- + if (word_top > 0) word_top--; + } +! #line 2781 "y.tab.c" + break; + +! case 90: /* select_command: SELECT WORD newline_list DO compound_list DONE */ +! #line 906 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-4].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2790 "y.tab.c" + break; + +! case 91: /* select_command: SELECT WORD newline_list '{' compound_list '}' */ +! #line 911 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-4].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2799 "y.tab.c" + break; + +! case 92: /* select_command: SELECT WORD ';' newline_list DO compound_list DONE */ +! #line 916 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-5].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2808 "y.tab.c" + break; + +! case 93: /* select_command: SELECT WORD ';' newline_list '{' compound_list '}' */ +! #line 921 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-5].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2817 "y.tab.c" + break; + +! case 94: /* select_command: SELECT WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE */ +! #line 926 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-8].word), REVERSE_LIST ((yyvsp[-5].word_list), WORD_LIST *), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2826 "y.tab.c" + break; + +! case 95: /* select_command: SELECT WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}' */ +! #line 931 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-8].word), REVERSE_LIST ((yyvsp[-5].word_list), WORD_LIST *), (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2835 "y.tab.c" + break; + +! case 96: /* select_command: SELECT WORD newline_list IN list_terminator newline_list DO compound_list DONE */ +! #line 936 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-7].word), (WORD_LIST *)NULL, (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2844 "y.tab.c" + break; + +! case 97: /* select_command: SELECT WORD newline_list IN list_terminator newline_list '{' compound_list '}' */ +! #line 941 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_select_command ((yyvsp[-7].word), (WORD_LIST *)NULL, (yyvsp[-1].command), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2853 "y.tab.c" + break; + +! case 98: /* case_command: CASE WORD newline_list IN newline_list ESAC */ +! #line 948 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[-4].word), (PATTERN_LIST *)NULL, word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2862 "y.tab.c" + break; + +! case 99: /* case_command: CASE WORD newline_list IN case_clause_sequence newline_list ESAC */ +! #line 953 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[-5].word), (yyvsp[-2].pattern), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2871 "y.tab.c" + break; + +! case 100: /* case_command: CASE WORD newline_list IN case_clause ESAC */ +! #line 958 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_case_command ((yyvsp[-4].word), (yyvsp[-1].pattern), word_lineno[word_top]); + if (word_top > 0) word_top--; + } +! #line 2880 "y.tab.c" + break; + +! case 101: /* function_def: WORD '(' ')' newline_list function_body */ +! #line 965 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_function_def ((yyvsp[-4].word), (yyvsp[0].command), function_dstart, function_bstart); } +! #line 2886 "y.tab.c" + break; + +! case 102: /* function_def: FUNCTION WORD '(' ')' newline_list function_body */ +! #line 967 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_function_def ((yyvsp[-4].word), (yyvsp[0].command), function_dstart, function_bstart); } +! #line 2892 "y.tab.c" + break; + +! case 103: /* function_def: FUNCTION WORD function_body */ +! #line 969 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_function_def ((yyvsp[-1].word), (yyvsp[0].command), function_dstart, function_bstart); } +! #line 2898 "y.tab.c" + break; + +! case 104: /* function_def: FUNCTION WORD '\n' newline_list function_body */ +! #line 971 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_function_def ((yyvsp[-3].word), (yyvsp[0].command), function_dstart, function_bstart); } +! #line 2904 "y.tab.c" + break; + +! case 105: /* function_body: shell_command */ +! #line 975 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 2910 "y.tab.c" + break; + +! case 106: /* function_body: shell_command redirection_list */ +! #line 977 "/usr/local/src/chet/src/bash/src/parse.y" + { + COMMAND *tc; +*************** +*** 2921,2963 **** + (yyval.command) = (yyvsp[-1].command); + } +! #line 2924 "y.tab.c" + break; + +! case 106: /* subshell: '(' compound_list ')' */ +! #line 993 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_subshell_command ((yyvsp[-1].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL; + } +! #line 2933 "y.tab.c" + break; + +! case 107: /* comsub: DOLPAREN compound_list ')' */ +! #line 1000 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[-1].command); + } +! #line 2941 "y.tab.c" + break; + +! case 108: /* comsub: DOLPAREN newline_list ')' */ +! #line 1004 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (COMMAND *)NULL; + } +! #line 2949 "y.tab.c" + break; + +! case 109: /* coproc: COPROC shell_command */ +! #line 1010 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_coproc_command ("COPROC", (yyvsp[0].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 2958 "y.tab.c" + break; + +! case 110: /* coproc: COPROC shell_command redirection_list */ +! #line 1015 "/usr/local/src/chet/src/bash/src/parse.y" + { + COMMAND *tc; +--- 2940,2982 ---- + (yyval.command) = (yyvsp[-1].command); + } +! #line 2943 "y.tab.c" + break; + +! case 107: /* subshell: '(' compound_list ')' */ +! #line 1008 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_subshell_command ((yyvsp[-1].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL; + } +! #line 2952 "y.tab.c" + break; + +! case 108: /* comsub: DOLPAREN compound_list ')' */ +! #line 1015 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[-1].command); + } +! #line 2960 "y.tab.c" + break; + +! case 109: /* comsub: DOLPAREN newline_list ')' */ +! #line 1019 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (COMMAND *)NULL; + } +! #line 2968 "y.tab.c" + break; + +! case 110: /* coproc: COPROC shell_command */ +! #line 1025 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_coproc_command ("COPROC", (yyvsp[0].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 2977 "y.tab.c" + break; + +! case 111: /* coproc: COPROC shell_command redirection_list */ +! #line 1030 "/usr/local/src/chet/src/bash/src/parse.y" + { + COMMAND *tc; +*************** +*** 2976,2993 **** + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 2979 "y.tab.c" + break; + +! case 111: /* coproc: COPROC WORD shell_command */ +! #line 1032 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_coproc_command ((yyvsp[-1].word)->word, (yyvsp[0].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 2988 "y.tab.c" + break; + +! case 112: /* coproc: COPROC WORD shell_command redirection_list */ +! #line 1037 "/usr/local/src/chet/src/bash/src/parse.y" + { + COMMAND *tc; +--- 2995,3012 ---- + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 2998 "y.tab.c" + break; + +! case 112: /* coproc: COPROC WORD shell_command */ +! #line 1047 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_coproc_command ((yyvsp[-1].word)->word, (yyvsp[0].command)); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 3007 "y.tab.c" + break; + +! case 113: /* coproc: COPROC WORD shell_command redirection_list */ +! #line 1052 "/usr/local/src/chet/src/bash/src/parse.y" + { + COMMAND *tc; +*************** +*** 3006,3155 **** + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 3009 "y.tab.c" + break; + +! case 113: /* coproc: COPROC simple_command */ +! #line 1054 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[0].command))); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 3018 "y.tab.c" + break; + +! case 114: /* if_command: IF compound_list THEN compound_list FI */ +! #line 1061 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-3].command), (yyvsp[-1].command), (COMMAND *)NULL); } +! #line 3024 "y.tab.c" + break; + +! case 115: /* if_command: IF compound_list THEN compound_list ELSE compound_list FI */ +! #line 1063 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-5].command), (yyvsp[-3].command), (yyvsp[-1].command)); } +! #line 3030 "y.tab.c" + break; + +! case 116: /* if_command: IF compound_list THEN compound_list elif_clause FI */ +! #line 1065 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-4].command), (yyvsp[-2].command), (yyvsp[-1].command)); } +! #line 3036 "y.tab.c" + break; + +! case 117: /* group_command: '{' compound_list '}' */ +! #line 1070 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_group_command ((yyvsp[-1].command)); } +! #line 3042 "y.tab.c" + break; + +! case 118: /* arith_command: ARITH_CMD */ +! #line 1074 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_arith_command ((yyvsp[0].word_list)); } +! #line 3048 "y.tab.c" + break; + +! case 119: /* cond_command: COND_START COND_CMD COND_END */ +! #line 1078 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[-1].command); } +! #line 3054 "y.tab.c" + break; + +! case 120: /* elif_clause: ELIF compound_list THEN compound_list */ +! #line 1082 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-2].command), (yyvsp[0].command), (COMMAND *)NULL); } +! #line 3060 "y.tab.c" + break; + +! case 121: /* elif_clause: ELIF compound_list THEN compound_list ELSE compound_list */ +! #line 1084 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-4].command), (yyvsp[-2].command), (yyvsp[0].command)); } +! #line 3066 "y.tab.c" + break; + +! case 122: /* elif_clause: ELIF compound_list THEN compound_list elif_clause */ +! #line 1086 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-3].command), (yyvsp[-1].command), (yyvsp[0].command)); } +! #line 3072 "y.tab.c" + break; + +! case 124: /* case_clause: case_clause_sequence pattern_list */ +! #line 1091 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[0].pattern)->next = (yyvsp[-1].pattern); (yyval.pattern) = (yyvsp[0].pattern); } +! #line 3078 "y.tab.c" + break; + +! case 125: /* pattern_list: newline_list pattern ')' compound_list */ +! #line 1095 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[-2].word_list), (yyvsp[0].command)); } +! #line 3084 "y.tab.c" + break; + +! case 126: /* pattern_list: newline_list pattern ')' newline_list */ +! #line 1097 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[-2].word_list), (COMMAND *)NULL); } +! #line 3090 "y.tab.c" + break; + +! case 127: /* pattern_list: newline_list '(' pattern ')' compound_list */ +! #line 1099 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[-2].word_list), (yyvsp[0].command)); } +! #line 3096 "y.tab.c" + break; + +! case 128: /* pattern_list: newline_list '(' pattern ')' newline_list */ +! #line 1101 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[-2].word_list), (COMMAND *)NULL); } +! #line 3102 "y.tab.c" + break; + +! case 129: /* case_clause_sequence: pattern_list SEMI_SEMI */ +! #line 1105 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3108 "y.tab.c" + break; + +! case 130: /* case_clause_sequence: case_clause_sequence pattern_list SEMI_SEMI */ +! #line 1107 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->next = (yyvsp[-2].pattern); (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3114 "y.tab.c" + break; + +! case 131: /* case_clause_sequence: pattern_list SEMI_AND */ +! #line 1109 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3120 "y.tab.c" + break; + +! case 132: /* case_clause_sequence: case_clause_sequence pattern_list SEMI_AND */ +! #line 1111 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[-1].pattern)->next = (yyvsp[-2].pattern); (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3126 "y.tab.c" + break; + +! case 133: /* case_clause_sequence: pattern_list SEMI_SEMI_AND */ +! #line 1113 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3132 "y.tab.c" + break; + +! case 134: /* case_clause_sequence: case_clause_sequence pattern_list SEMI_SEMI_AND */ +! #line 1115 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[-1].pattern)->next = (yyvsp[-2].pattern); (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3138 "y.tab.c" + break; + +! case 135: /* pattern: WORD */ +! #line 1119 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[0].word), (WORD_LIST *)NULL); } +! #line 3144 "y.tab.c" + break; + +! case 136: /* pattern: pattern '|' WORD */ +! #line 1121 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[0].word), (yyvsp[-2].word_list)); } +! #line 3150 "y.tab.c" + break; + +! case 137: /* compound_list: newline_list list0 */ +! #line 1130 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[0].command); +--- 3025,3174 ---- + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 3028 "y.tab.c" + break; + +! case 114: /* coproc: COPROC simple_command */ +! #line 1069 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[0].command))); + (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; + } +! #line 3037 "y.tab.c" + break; + +! case 115: /* if_command: IF compound_list THEN compound_list FI */ +! #line 1076 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-3].command), (yyvsp[-1].command), (COMMAND *)NULL); } +! #line 3043 "y.tab.c" + break; + +! case 116: /* if_command: IF compound_list THEN compound_list ELSE compound_list FI */ +! #line 1078 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-5].command), (yyvsp[-3].command), (yyvsp[-1].command)); } +! #line 3049 "y.tab.c" + break; + +! case 117: /* if_command: IF compound_list THEN compound_list elif_clause FI */ +! #line 1080 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-4].command), (yyvsp[-2].command), (yyvsp[-1].command)); } +! #line 3055 "y.tab.c" + break; + +! case 118: /* group_command: '{' compound_list '}' */ +! #line 1085 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_group_command ((yyvsp[-1].command)); } +! #line 3061 "y.tab.c" + break; + +! case 119: /* arith_command: ARITH_CMD */ +! #line 1089 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_arith_command ((yyvsp[0].word_list)); } +! #line 3067 "y.tab.c" + break; + +! case 120: /* cond_command: COND_START COND_CMD COND_END */ +! #line 1093 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[-1].command); } +! #line 3073 "y.tab.c" + break; + +! case 121: /* elif_clause: ELIF compound_list THEN compound_list */ +! #line 1097 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-2].command), (yyvsp[0].command), (COMMAND *)NULL); } +! #line 3079 "y.tab.c" + break; + +! case 122: /* elif_clause: ELIF compound_list THEN compound_list ELSE compound_list */ +! #line 1099 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-4].command), (yyvsp[-2].command), (yyvsp[0].command)); } +! #line 3085 "y.tab.c" + break; + +! case 123: /* elif_clause: ELIF compound_list THEN compound_list elif_clause */ +! #line 1101 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = make_if_command ((yyvsp[-3].command), (yyvsp[-1].command), (yyvsp[0].command)); } +! #line 3091 "y.tab.c" + break; + +! case 125: /* case_clause: case_clause_sequence pattern_list */ +! #line 1106 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[0].pattern)->next = (yyvsp[-1].pattern); (yyval.pattern) = (yyvsp[0].pattern); } +! #line 3097 "y.tab.c" + break; + +! case 126: /* pattern_list: newline_list pattern ')' compound_list */ +! #line 1110 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[-2].word_list), (yyvsp[0].command)); } +! #line 3103 "y.tab.c" + break; + +! case 127: /* pattern_list: newline_list pattern ')' newline_list */ +! #line 1112 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[-2].word_list), (COMMAND *)NULL); } +! #line 3109 "y.tab.c" + break; + +! case 128: /* pattern_list: newline_list '(' pattern ')' compound_list */ +! #line 1114 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[-2].word_list), (yyvsp[0].command)); } +! #line 3115 "y.tab.c" + break; + +! case 129: /* pattern_list: newline_list '(' pattern ')' newline_list */ +! #line 1116 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = make_pattern_list ((yyvsp[-2].word_list), (COMMAND *)NULL); } +! #line 3121 "y.tab.c" + break; + +! case 130: /* case_clause_sequence: pattern_list SEMI_SEMI */ +! #line 1120 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3127 "y.tab.c" + break; + +! case 131: /* case_clause_sequence: case_clause_sequence pattern_list SEMI_SEMI */ +! #line 1122 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->next = (yyvsp[-2].pattern); (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3133 "y.tab.c" + break; + +! case 132: /* case_clause_sequence: pattern_list SEMI_AND */ +! #line 1124 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3139 "y.tab.c" + break; + +! case 133: /* case_clause_sequence: case_clause_sequence pattern_list SEMI_AND */ +! #line 1126 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[-1].pattern)->next = (yyvsp[-2].pattern); (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3145 "y.tab.c" + break; + +! case 134: /* case_clause_sequence: pattern_list SEMI_SEMI_AND */ +! #line 1128 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3151 "y.tab.c" + break; + +! case 135: /* case_clause_sequence: case_clause_sequence pattern_list SEMI_SEMI_AND */ +! #line 1130 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyvsp[-1].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[-1].pattern)->next = (yyvsp[-2].pattern); (yyval.pattern) = (yyvsp[-1].pattern); } +! #line 3157 "y.tab.c" + break; + +! case 136: /* pattern: WORD */ +! #line 1134 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[0].word), (WORD_LIST *)NULL); } +! #line 3163 "y.tab.c" + break; + +! case 137: /* pattern: pattern '|' WORD */ +! #line 1136 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.word_list) = make_word_list ((yyvsp[0].word), (yyvsp[-2].word_list)); } +! #line 3169 "y.tab.c" + break; + +! case 138: /* compound_list: newline_list list0 */ +! #line 1145 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[0].command); +*************** +*** 3157,3173 **** + gather_here_documents (); + } +! #line 3160 "y.tab.c" + break; + +! case 138: /* compound_list: newline_list list1 */ +! #line 1136 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[0].command); + } +! #line 3168 "y.tab.c" + break; + +! case 140: /* list0: list1 '&' newline_list */ +! #line 1143 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[-2].command)->type == cm_connection) +--- 3176,3192 ---- + gather_here_documents (); + } +! #line 3179 "y.tab.c" + break; + +! case 139: /* compound_list: newline_list list1 */ +! #line 1151 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[0].command); + } +! #line 3187 "y.tab.c" + break; + +! case 141: /* list0: list1 '&' newline_list */ +! #line 1158 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[-2].command)->type == cm_connection) +*************** +*** 3176,3196 **** + (yyval.command) = command_connect ((yyvsp[-2].command), (COMMAND *)NULL, '&'); + } +! #line 3179 "y.tab.c" + break; + +! case 142: /* list1: list1 AND_AND newline_list list1 */ +! #line 1154 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), AND_AND); } +! #line 3185 "y.tab.c" + break; + +! case 143: /* list1: list1 OR_OR newline_list list1 */ +! #line 1156 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), OR_OR); } +! #line 3191 "y.tab.c" + break; + +! case 144: /* list1: list1 '&' newline_list list1 */ +! #line 1158 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[-3].command)->type == cm_connection) +--- 3195,3215 ---- + (yyval.command) = command_connect ((yyvsp[-2].command), (COMMAND *)NULL, '&'); + } +! #line 3198 "y.tab.c" + break; + +! case 143: /* list1: list1 AND_AND newline_list list1 */ +! #line 1169 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), AND_AND); } +! #line 3204 "y.tab.c" + break; + +! case 144: /* list1: list1 OR_OR newline_list list1 */ +! #line 1171 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), OR_OR); } +! #line 3210 "y.tab.c" + break; + +! case 145: /* list1: list1 '&' newline_list list1 */ +! #line 1173 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[-3].command)->type == cm_connection) +*************** +*** 3199,3213 **** + (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), '&'); + } +! #line 3202 "y.tab.c" + break; + +! case 145: /* list1: list1 ';' newline_list list1 */ +! #line 1165 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), ';'); } +! #line 3208 "y.tab.c" + break; + +! case 146: /* list1: list1 '\n' newline_list list1 */ +! #line 1167 "/usr/local/src/chet/src/bash/src/parse.y" + { + if (parser_state & PST_CMDSUBST) +--- 3218,3232 ---- + (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), '&'); + } +! #line 3221 "y.tab.c" + break; + +! case 146: /* list1: list1 ';' newline_list list1 */ +! #line 1180 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), ';'); } +! #line 3227 "y.tab.c" + break; + +! case 147: /* list1: list1 '\n' newline_list list1 */ +! #line 1182 "/usr/local/src/chet/src/bash/src/parse.y" + { + if (parser_state & PST_CMDSUBST) +*************** +*** 3216,3248 **** + (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), ';'); + } +! #line 3219 "y.tab.c" + break; + +! case 147: /* list1: pipeline_command */ +! #line 1174 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 3225 "y.tab.c" + break; + +! case 150: /* list_terminator: '\n' */ +! #line 1182 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = '\n'; } +! #line 3231 "y.tab.c" + break; + +! case 151: /* list_terminator: ';' */ +! #line 1184 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = ';'; } +! #line 3237 "y.tab.c" + break; + +! case 152: /* list_terminator: yacc_EOF */ +! #line 1186 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = yacc_EOF; } +! #line 3243 "y.tab.c" + break; + +! case 155: /* simple_list: simple_list1 */ +! #line 1200 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[0].command); +--- 3235,3267 ---- + (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), ';'); + } +! #line 3238 "y.tab.c" + break; + +! case 148: /* list1: pipeline_command */ +! #line 1189 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 3244 "y.tab.c" + break; + +! case 151: /* list_terminator: '\n' */ +! #line 1197 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = '\n'; } +! #line 3250 "y.tab.c" + break; + +! case 152: /* list_terminator: ';' */ +! #line 1199 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = ';'; } +! #line 3256 "y.tab.c" + break; + +! case 153: /* list_terminator: yacc_EOF */ +! #line 1201 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = yacc_EOF; } +! #line 3262 "y.tab.c" + break; + +! case 156: /* simple_list: simple_list1 */ +! #line 1215 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[0].command); +*************** +*** 3259,3267 **** + } + } +! #line 3262 "y.tab.c" + break; + +! case 156: /* simple_list: simple_list1 '&' */ +! #line 1215 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[-1].command)->type == cm_connection) +--- 3278,3286 ---- + } + } +! #line 3281 "y.tab.c" + break; + +! case 157: /* simple_list: simple_list1 '&' */ +! #line 1230 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[-1].command)->type == cm_connection) +*************** +*** 3281,3289 **** + } + } +! #line 3284 "y.tab.c" + break; + +! case 157: /* simple_list: simple_list1 ';' */ +! #line 1233 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[-1].command); +--- 3300,3308 ---- + } + } +! #line 3303 "y.tab.c" + break; + +! case 158: /* simple_list: simple_list1 ';' */ +! #line 1248 "/usr/local/src/chet/src/bash/src/parse.y" + { + (yyval.command) = (yyvsp[-1].command); +*************** +*** 3300,3320 **** + } + } +! #line 3303 "y.tab.c" + break; + +! case 158: /* simple_list1: simple_list1 AND_AND newline_list simple_list1 */ +! #line 1250 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), AND_AND); } +! #line 3309 "y.tab.c" + break; + +! case 159: /* simple_list1: simple_list1 OR_OR newline_list simple_list1 */ +! #line 1252 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), OR_OR); } +! #line 3315 "y.tab.c" + break; + +! case 160: /* simple_list1: simple_list1 '&' simple_list1 */ +! #line 1254 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[-2].command)->type == cm_connection) +--- 3319,3339 ---- + } + } +! #line 3322 "y.tab.c" + break; + +! case 159: /* simple_list1: simple_list1 AND_AND newline_list simple_list1 */ +! #line 1265 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), AND_AND); } +! #line 3328 "y.tab.c" + break; + +! case 160: /* simple_list1: simple_list1 OR_OR newline_list simple_list1 */ +! #line 1267 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), OR_OR); } +! #line 3334 "y.tab.c" + break; + +! case 161: /* simple_list1: simple_list1 '&' simple_list1 */ +! #line 1269 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[-2].command)->type == cm_connection) +*************** +*** 3323,3349 **** + (yyval.command) = command_connect ((yyvsp[-2].command), (yyvsp[0].command), '&'); + } +! #line 3326 "y.tab.c" + break; + +! case 161: /* simple_list1: simple_list1 ';' simple_list1 */ +! #line 1261 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-2].command), (yyvsp[0].command), ';'); } +! #line 3332 "y.tab.c" + break; + +! case 162: /* simple_list1: pipeline_command */ +! #line 1264 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 3338 "y.tab.c" + break; + +! case 163: /* pipeline_command: pipeline */ +! #line 1268 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 3344 "y.tab.c" + break; + +! case 164: /* pipeline_command: BANG pipeline_command */ +! #line 1270 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[0].command)) +--- 3342,3368 ---- + (yyval.command) = command_connect ((yyvsp[-2].command), (yyvsp[0].command), '&'); + } +! #line 3345 "y.tab.c" + break; + +! case 162: /* simple_list1: simple_list1 ';' simple_list1 */ +! #line 1276 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-2].command), (yyvsp[0].command), ';'); } +! #line 3351 "y.tab.c" + break; + +! case 163: /* simple_list1: pipeline_command */ +! #line 1279 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 3357 "y.tab.c" + break; + +! case 164: /* pipeline_command: pipeline */ +! #line 1283 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 3363 "y.tab.c" + break; + +! case 165: /* pipeline_command: BANG pipeline_command */ +! #line 1285 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[0].command)) +*************** +*** 3351,3359 **** + (yyval.command) = (yyvsp[0].command); + } +! #line 3354 "y.tab.c" + break; + +! case 165: /* pipeline_command: timespec pipeline_command */ +! #line 1276 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[0].command)) +--- 3370,3378 ---- + (yyval.command) = (yyvsp[0].command); + } +! #line 3373 "y.tab.c" + break; + +! case 166: /* pipeline_command: timespec pipeline_command */ +! #line 1291 "/usr/local/src/chet/src/bash/src/parse.y" + { + if ((yyvsp[0].command)) +*************** +*** 3361,3369 **** + (yyval.command) = (yyvsp[0].command); + } +! #line 3364 "y.tab.c" + break; + +! case 166: /* pipeline_command: timespec list_terminator */ +! #line 1282 "/usr/local/src/chet/src/bash/src/parse.y" + { + ELEMENT x; +--- 3380,3388 ---- + (yyval.command) = (yyvsp[0].command); + } +! #line 3383 "y.tab.c" + break; + +! case 167: /* pipeline_command: timespec list_terminator */ +! #line 1297 "/usr/local/src/chet/src/bash/src/parse.y" + { + ELEMENT x; +*************** +*** 3385,3393 **** + parser_state &= ~PST_REDIRLIST; /* make_simple_command sets this */ + } +! #line 3388 "y.tab.c" + break; + +! case 167: /* pipeline_command: BANG list_terminator */ +! #line 1302 "/usr/local/src/chet/src/bash/src/parse.y" + { + ELEMENT x; +--- 3404,3412 ---- + parser_state &= ~PST_REDIRLIST; /* make_simple_command sets this */ + } +! #line 3407 "y.tab.c" + break; + +! case 168: /* pipeline_command: BANG list_terminator */ +! #line 1317 "/usr/local/src/chet/src/bash/src/parse.y" + { + ELEMENT x; +*************** +*** 3410,3424 **** + parser_state &= ~PST_REDIRLIST; /* make_simple_command sets this */ + } +! #line 3413 "y.tab.c" + break; + +! case 168: /* pipeline: pipeline '|' newline_list pipeline */ +! #line 1325 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), '|'); } +! #line 3419 "y.tab.c" + break; + +! case 169: /* pipeline: pipeline BAR_AND newline_list pipeline */ +! #line 1327 "/usr/local/src/chet/src/bash/src/parse.y" + { + /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */ +--- 3429,3443 ---- + parser_state &= ~PST_REDIRLIST; /* make_simple_command sets this */ + } +! #line 3432 "y.tab.c" + break; + +! case 169: /* pipeline: pipeline '|' newline_list pipeline */ +! #line 1340 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), '|'); } +! #line 3438 "y.tab.c" + break; + +! case 170: /* pipeline: pipeline BAR_AND newline_list pipeline */ +! #line 1342 "/usr/local/src/chet/src/bash/src/parse.y" + { + /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */ +*************** +*** 3443,3481 **** + (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), '|'); + } +! #line 3446 "y.tab.c" + break; + +! case 170: /* pipeline: command */ +! #line 1350 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 3452 "y.tab.c" + break; + +! case 171: /* timespec: TIME */ +! #line 1354 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE; } +! #line 3458 "y.tab.c" + break; + +! case 172: /* timespec: TIME TIMEOPT */ +! #line 1356 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } +! #line 3464 "y.tab.c" + break; + +! case 173: /* timespec: TIME TIMEIGN */ +! #line 1358 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } +! #line 3470 "y.tab.c" + break; + +! case 174: /* timespec: TIME TIMEOPT TIMEIGN */ +! #line 1360 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } +! #line 3476 "y.tab.c" + break; + + +! #line 3480 "y.tab.c" + + default: break; +--- 3462,3500 ---- + (yyval.command) = command_connect ((yyvsp[-3].command), (yyvsp[0].command), '|'); + } +! #line 3465 "y.tab.c" + break; + +! case 171: /* pipeline: command */ +! #line 1365 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.command) = (yyvsp[0].command); } +! #line 3471 "y.tab.c" + break; + +! case 172: /* timespec: TIME */ +! #line 1369 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE; } +! #line 3477 "y.tab.c" + break; + +! case 173: /* timespec: TIME TIMEOPT */ +! #line 1371 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } +! #line 3483 "y.tab.c" + break; + +! case 174: /* timespec: TIME TIMEIGN */ +! #line 1373 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } +! #line 3489 "y.tab.c" + break; + +! case 175: /* timespec: TIME TIMEOPT TIMEIGN */ +! #line 1375 "/usr/local/src/chet/src/bash/src/parse.y" + { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } +! #line 3495 "y.tab.c" + break; + + +! #line 3499 "y.tab.c" + + default: break; +*************** +*** 3670,3674 **** + } + +! #line 1362 "/usr/local/src/chet/src/bash/src/parse.y" + + +--- 3689,3693 ---- + } + +! #line 1377 "/usr/local/src/chet/src/bash/src/parse.y" + + +*************** +*** 5209,5215 **** + if (current_token < 0) + #if defined (YYERRCODE) && !defined (YYUNDEF) +! current_token = YYERRCODE; + #else +! current_token = YYerror; + #endif + +--- 5228,5234 ---- + if (current_token < 0) + #if defined (YYERRCODE) && !defined (YYUNDEF) +! current_token = EOF_Reached ? YYEOF : YYERRCODE; + #else +! current_token = EOF_Reached ? YYEOF : YYUNDEF; + #endif + +*************** +*** 6006,6009 **** +--- 6026,6030 ---- + parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close); + EOF_Reached = 1; /* XXX */ ++ parser_state |= PST_NOERROR; /* avoid redundant error message */ + return (&matched_pair_error); + } +*************** +*** 6468,6471 **** +--- 6487,6491 ---- + + /* yyparse() has already called yyerror() and reset_parser() */ ++ parser_state |= PST_NOERROR; + return (&matched_pair_error); + } + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 17 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 18 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-019.patch b/bash/Patches/bash52-019.patch new file mode 100644 index 00000000..e80cffc4 --- /dev/null +++ b/bash/Patches/bash52-019.patch @@ -0,0 +1,66 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-019 + +Bug-Reported-by: Steffen Nurpmeso +Bug-Reference-ID: <20230116233547.2jFxL%steffen@sdaoden.eu> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-01/msg00057.html + +Bug-Description: + +There are some cases where the shell reaped a background (asynchronous) job +and would incorrectly try to set the terminal's process group back to the +shell's. In these cases it never set the terminal process group to that +jobs's process group initially, so resetting it is incorrect. + +Patch (apply with `patch -p1'): + +*** a/jobs.c 2022-12-13 12:09:02.000000000 -0500 +--- b/jobs.c 2023-10-26 12:12:10.000000000 -0400 +*************** +*** 3078,3084 **** + subshell. Make sure subst.c:command_substitute uses the same + conditions to determine whether or not it should undo this and +! give the terminal to pipeline_pgrp. */ +! + if ((flags & JWAIT_NOTERM) == 0 && running_in_background == 0 && + (subshell_environment & (SUBSHELL_ASYNC|SUBSHELL_PIPE)) == 0) + give_terminal_to (shell_pgrp, 0); +--- 3036,3046 ---- + subshell. Make sure subst.c:command_substitute uses the same + conditions to determine whether or not it should undo this and +! give the terminal to pipeline_pgrp. We don't give the terminal +! back to shell_pgrp if an async job in the background exits because +! we never gave it to that job in the first place. An async job in +! the foreground is one we started in the background and foregrounded +! with `fg', and gave it the terminal. */ + if ((flags & JWAIT_NOTERM) == 0 && running_in_background == 0 && ++ (job == NO_JOB || IS_ASYNC (job) == 0 || IS_FOREGROUND (job)) && + (subshell_environment & (SUBSHELL_ASYNC|SUBSHELL_PIPE)) == 0) + give_terminal_to (shell_pgrp, 0); +*************** +*** 3624,3627 **** +--- 3599,3603 ---- + get_tty_state (); + save_stty = shell_tty_info; ++ jobs[job]->flags &= ~J_ASYNC; /* no longer async */ + /* Give the terminal to this job. */ + if (IS_JOBCONTROL (job)) + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 18 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 19 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-020.patch b/bash/Patches/bash52-020.patch new file mode 100644 index 00000000..596498dd --- /dev/null +++ b/bash/Patches/bash52-020.patch @@ -0,0 +1,53 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-020 + +Bug-Reported-by: Dima Korobskiy +Bug-Reference-ID: <16664c2d-40ec-df33-b932-83db06e39a82@gmail.com> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-08/msg00125.html + +Bug-Description: + +The parser did not allow `time' to appear as the first reserved word in a +command substitution. + +Patch (apply with `patch -p1'): + +*** a/parse.y Tue Dec 13 12:53:21 2022 +--- b/parse.y Fri Sep 1 10:36:28 2023 +*************** +*** 3151,3154 **** +--- 3151,3155 ---- + case TIMEOPT: /* time -p time pipeline */ + case TIMEIGN: /* time -p -- ... */ ++ case DOLPAREN: + return 1; + default: +*** a/y.tab.c Tue Dec 13 12:53:21 2022 +--- b/y.tab.c Fri Sep 1 10:36:44 2023 +*************** +*** 5466,5469 **** +--- 5466,5470 ---- + case TIMEOPT: /* time -p time pipeline */ + case TIMEIGN: /* time -p -- ... */ ++ case DOLPAREN: + return 1; + default: + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 19 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 20 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-021.patch b/bash/Patches/bash52-021.patch new file mode 100644 index 00000000..278c3491 --- /dev/null +++ b/bash/Patches/bash52-021.patch @@ -0,0 +1,61 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-021 + +Bug-Reported-by: Norbert Lange +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-12/msg00046.html + +Bug-Description: + +There is an off-by-one error that causes command substitutions to fail when +they appear in a word expansion inside a here-document. + +Patch (apply with `patch -p1'): + +*** a/subst.c 2022-12-13 12:08:58.000000000 -0500 +--- b/subst.c 2022-12-14 09:09:53.000000000 -0500 +*************** +*** 1694,1698 **** + CHECK_STRING_OVERRUN (i, si, slen, c); + +! tlen = si - i - 1; + RESIZE_MALLOCED_BUFFER (result, result_index, tlen + 4, result_size, 64); + result[result_index++] = c; +--- 1699,1703 ---- + CHECK_STRING_OVERRUN (i, si, slen, c); + +! tlen = si - i - 2; + RESIZE_MALLOCED_BUFFER (result, result_index, tlen + 4, result_size, 64); + result[result_index++] = c; +*************** +*** 1714,1718 **** + CHECK_STRING_OVERRUN (i, si, slen, c); + +! tlen = si - i - 1; + RESIZE_MALLOCED_BUFFER (result, result_index, tlen + 4, result_size, 64); + result[result_index++] = c; +--- 1719,1723 ---- + CHECK_STRING_OVERRUN (i, si, slen, c); + +! tlen = si - i - 2; + RESIZE_MALLOCED_BUFFER (result, result_index, tlen + 4, result_size, 64); + result[result_index++] = c; + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 20 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 21 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-022.patch b/bash/Patches/bash52-022.patch new file mode 100644 index 00000000..c9c7dbff --- /dev/null +++ b/bash/Patches/bash52-022.patch @@ -0,0 +1,53 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-022 + +Bug-Reported-by: srobertson@peratonlabs.com +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-09/msg00049.html + +Bug-Description: + +It's possible for readline to try to zero out a line that's not null- +terminated, leading to a memory fault. + +Patch (apply with `patch -p1'): + +*** a/lib/readline/display.c 2022-04-05 10:47:31.000000000 -0400 +--- b/lib/readline/display.c 2022-12-13 13:11:22.000000000 -0500 +*************** +*** 2684,2692 **** + + if (visible_line) +! { +! temp = visible_line; +! while (*temp) +! *temp++ = '\0'; +! } + rl_on_new_line (); + forced_display++; +--- 2735,2740 ---- + + if (visible_line) +! memset (visible_line, 0, line_size); +! + rl_on_new_line (); + forced_display++; + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 21 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 22 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-023.patch b/bash/Patches/bash52-023.patch new file mode 100644 index 00000000..556528f1 --- /dev/null +++ b/bash/Patches/bash52-023.patch @@ -0,0 +1,64 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-023 + +Bug-Reported-by: Emanuele Torre +Bug-Reference-ID: <20230206140824.1710288-1-torreemanuele6@gmail.com> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-02/msg00045.html + +Bug-Description: + +Running `local -' multiple times in a shell function would overwrite the +original saved set of options. + +Patch (apply with `patch -p1'): + +*** a/builtins/declare.def 2023-01-04 20:40:28.000000000 -0500 +--- b/builtins/declare.def 2023-02-08 15:36:49.000000000 -0500 +*************** +*** 421,429 **** + if (local_var && variable_context && STREQ (name, "-")) + { + var = make_local_variable ("-", 0); +! FREE (value_cell (var)); /* just in case */ +! value = get_current_options (); +! var_setvalue (var, value); +! VSETATTR (var, att_invisible); + NEXT_VARIABLE (); + } +--- 421,437 ---- + if (local_var && variable_context && STREQ (name, "-")) + { ++ int o; ++ ++ o = localvar_inherit; ++ localvar_inherit = 0; + var = make_local_variable ("-", 0); +! localvar_inherit = o; +! +! if (value_cell (var) == NULL) /* no duplicate instances */ +! { +! value = get_current_options (); +! var_setvalue (var, value); +! VSETATTR (var, att_invisible); +! } + NEXT_VARIABLE (); + } + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 22 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 23 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-024.patch b/bash/Patches/bash52-024.patch new file mode 100644 index 00000000..fde027ab --- /dev/null +++ b/bash/Patches/bash52-024.patch @@ -0,0 +1,88 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-024 + +Bug-Reported-by: Marco +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-02/msg00044.html + +Bug-Description: + +Fix bug where associative array compound assignment would not expand tildes +in values. + +Patch (apply with `patch -p1'): + +*** a/arrayfunc.c Thu Jan 5 14:23:28 2023 +--- b/arrayfunc.c Wed Feb 8 16:27:48 2023 +*************** +*** 651,655 **** + } + +! aval = expand_subscript_string (v, 0); + if (aval == 0) + { +--- 651,655 ---- + } + +! aval = expand_assignment_string_to_string (v, 0); + if (aval == 0) + { +*************** +*** 843,847 **** + if (assoc_p (var)) + { +! val = expand_subscript_string (val, 0); + if (val == 0) + { +--- 843,847 ---- + if (assoc_p (var)) + { +! val = expand_assignment_string_to_string (val, 0); + if (val == 0) + { +*************** +*** 1031,1035 **** + nword[i++] = w[ind++]; + +! t = expand_subscript_string (w+ind, 0); + s = (t && strchr (t, CTLESC)) ? quote_escapes (t) : t; + value = sh_single_quote (s ? s : ""); +--- 1031,1035 ---- + nword[i++] = w[ind++]; + +! t = expand_assignment_string_to_string (w+ind, 0); + s = (t && strchr (t, CTLESC)) ? quote_escapes (t) : t; + value = sh_single_quote (s ? s : ""); +*** a/subst.c Mon Jan 30 16:19:46 2023 +--- b/subst.c Mon Feb 6 16:25:22 2023 +*************** +*** 10803,10807 **** +--- 10803,10811 ---- + ret = (char *)NULL; + ++ #if 0 + td.flags = W_NOPROCSUB|W_NOTILDE|W_NOSPLIT2; /* XXX - W_NOCOMSUB? */ ++ #else ++ td.flags = W_NOPROCSUB|W_NOSPLIT2; /* XXX - W_NOCOMSUB? */ ++ #endif + td.word = savestring (string); /* in case it's freed on error */ + + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 23 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 24 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-025.patch b/bash/Patches/bash52-025.patch new file mode 100644 index 00000000..243af9d8 --- /dev/null +++ b/bash/Patches/bash52-025.patch @@ -0,0 +1,46 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-025 + +Bug-Reported-by: Andrew Neff +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00100.html + +Bug-Description: + +Make sure a subshell checks for and handles any terminating signals before +exiting (which might have arrived after the command completed) so the parent +and any EXIT trap will see the correct value for $?. + +Patch (apply with `patch -p1'): + +*** a/execute_cmd.c 2022-11-02 10:36:54.000000000 -0400 +--- b/execute_cmd.c 2022-10-27 16:52:55.000000000 -0400 +*************** +*** 1726,1729 **** +--- 1726,1732 ---- + : EXECUTION_SUCCESS; + ++ /* Check for terminating signals before we return to our caller, which we ++ expect to exit immediately anyway. */ ++ CHECK_TERMSIG; + + /* If we were explicitly placed in a subshell with (), we need + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 24 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 25 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-026.patch b/bash/Patches/bash52-026.patch new file mode 100644 index 00000000..d826dbec --- /dev/null +++ b/bash/Patches/bash52-026.patch @@ -0,0 +1,48 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-026 + +Bug-Reported-by: Stefan Klinger +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-readline/2023-08/msg00018.html + +Bug-Description: + +The custom color prefix that readline uses to color possible completions +must have a leading `.'. + +Patch (apply with `patch -p1'): + +*** a/lib/readline/colors.c 2021-12-08 11:38:25.000000000 -0500 +--- b/lib/readline/colors.c 2023-08-28 16:40:04.000000000 -0400 +*************** +*** 74,78 **** + static void restore_default_color (void); + +! #define RL_COLOR_PREFIX_EXTENSION "readline-colored-completion-prefix" + + COLOR_EXT_TYPE *_rl_color_ext_list = 0; +--- 74,78 ---- + static void restore_default_color (void); + +! #define RL_COLOR_PREFIX_EXTENSION ".readline-colored-completion-prefix" + + COLOR_EXT_TYPE *_rl_color_ext_list = 0; + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 25 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 26 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-027.patch b/bash/Patches/bash52-027.patch new file mode 100644 index 00000000..63eaf863 --- /dev/null +++ b/bash/Patches/bash52-027.patch @@ -0,0 +1,63 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-027 + +Bug-Reported-by: Emanuel Haupt +Bug-Reference-ID: <20221001123841.27e1bfb3bf3ed58ab32ea2b5@FreeBSD.org> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00000.html + +Bug-Description: + +The configure test for the presence of strtoimax(3) is inverted. + +Patch (apply with `patch -p1'): + + +*** a/m4/strtoimax.m4 Mon Apr 11 16:31:52 2022 +--- b/m4/strtoimax.m4 Tue Apr 9 11:12:36 2024 +*************** +*** 30,34 **** + ]) + AC_MSG_RESULT($bash_cv_func_strtoimax) +! if test $bash_cv_func_strtoimax = yes; then + AC_LIBOBJ(strtoimax) + fi +--- 30,34 ---- + ]) + AC_MSG_RESULT($bash_cv_func_strtoimax) +! if test $bash_cv_func_strtoimax = no; then + AC_LIBOBJ(strtoimax) + fi +*** a/configure Fri Sep 23 10:13:22 2022 +--- b/configure Tue Apr 9 11:13:21 2024 +*************** +*** 20444,20448 **** + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_strtoimax" >&5 + printf "%s\n" "$bash_cv_func_strtoimax" >&6; } +! if test $bash_cv_func_strtoimax = yes; then + case " $LIBOBJS " in + *" strtoimax.$ac_objext "* ) ;; +--- 20444,20448 ---- + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_strtoimax" >&5 + printf "%s\n" "$bash_cv_func_strtoimax" >&6; } +! if test $bash_cv_func_strtoimax = no; then + case " $LIBOBJS " in + *" strtoimax.$ac_objext "* ) ;; + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 26 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 27 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-028.patch b/bash/Patches/bash52-028.patch new file mode 100644 index 00000000..0c4f08ca --- /dev/null +++ b/bash/Patches/bash52-028.patch @@ -0,0 +1,49 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-028 + +Bug-Reported-by: Mark March +Bug-Reference-ID: <834896722.6304071.1718744118467@mail.yahoo.com> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2024-06/msg00122.html + +Bug-Description: + +A DEBUG trap in an asynchronous process can steal the controlling terminal +away from the calling shell, causing it to exit. + +Patch (apply with `patch -p1'): + +*** a/trap.c Fri May 3 12:12:38 2024 +--- b/trap.c Wed Jun 26 10:41:40 2024 +*************** +*** 1217,1221 **** + restore_pgrp_pipe (save_pipe); + # endif +! if (pipeline_pgrp > 0 && ((subshell_environment & (SUBSHELL_ASYNC|SUBSHELL_PIPE)) == 0)) + give_terminal_to (pipeline_pgrp, 1); + +--- 1217,1223 ---- + restore_pgrp_pipe (save_pipe); + # endif +! /* If the trap command gave the terminal to another process group, +! restore it. XXX - check running_in_background? */ +! if (job_control && pipeline_pgrp > 0 && ((subshell_environment & (SUBSHELL_ASYNC|SUBSHELL_PIPE)) == 0)) + give_terminal_to (pipeline_pgrp, 1); + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 27 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 28 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-029.patch b/bash/Patches/bash52-029.patch new file mode 100644 index 00000000..085e92bf --- /dev/null +++ b/bash/Patches/bash52-029.patch @@ -0,0 +1,137 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-029 + +Bug-Reported-by: Grisha Levit +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-04/msg00072.html + +Bug-Description: + +There are problems with recovery after parser errors when parsing compound +assignments. For instance, the `local' builtin reports an error but never +cleans up the function context. + +Patch (apply with `patch -p1'): + +*** a/parse.y Fri Apr 14 11:50:29 2023 +--- b/parse.y Mon May 1 16:25:14 2023 +*************** +*** 6471,6478 **** + { + set_exit_status (EXECUTION_FAILURE); + if (interactive_shell == 0 && posixly_correct) + jump_to_top_level (FORCE_EOF); + else +! jump_to_top_level (DISCARD); + } + +--- 6471,6483 ---- + { + set_exit_status (EXECUTION_FAILURE); ++ current_token = '\n'; /* XXX */ + if (interactive_shell == 0 && posixly_correct) + jump_to_top_level (FORCE_EOF); + else +! { +! if (executing && parse_and_execute_level == 0) +! top_level_cleanup (); +! jump_to_top_level (DISCARD); +! } + } + +*************** +*** 6538,6546 **** + { + set_exit_status (EXECUTION_FAILURE); +! last_read_token = '\n'; /* XXX */ + if (interactive_shell == 0 && posixly_correct) + jump_to_top_level (FORCE_EOF); + else +! jump_to_top_level (DISCARD); + } + +--- 6543,6555 ---- + { + set_exit_status (EXECUTION_FAILURE); +! last_read_token = current_token = '\n'; /* XXX */ + if (interactive_shell == 0 && posixly_correct) + jump_to_top_level (FORCE_EOF); + else +! { +! if (executing && parse_and_execute_level == 0) +! top_level_cleanup (); +! jump_to_top_level (DISCARD); +! } + } + + +*** a/y.tab.c Tue Jul 30 15:19:31 2024 +--- b/y.tab.c Tue Jul 30 15:20:21 2024 +*************** +*** 8786,8793 **** + { + set_exit_status (EXECUTION_FAILURE); + if (interactive_shell == 0 && posixly_correct) + jump_to_top_level (FORCE_EOF); + else +! jump_to_top_level (DISCARD); + } + +--- 8786,8798 ---- + { + set_exit_status (EXECUTION_FAILURE); ++ current_token = '\n'; /* XXX */ + if (interactive_shell == 0 && posixly_correct) + jump_to_top_level (FORCE_EOF); + else +! { +! if (executing && parse_and_execute_level == 0) +! top_level_cleanup (); +! jump_to_top_level (DISCARD); +! } + } + +*************** +*** 8853,8861 **** + { + set_exit_status (EXECUTION_FAILURE); +! last_read_token = '\n'; /* XXX */ + if (interactive_shell == 0 && posixly_correct) + jump_to_top_level (FORCE_EOF); + else +! jump_to_top_level (DISCARD); + } + +--- 8858,8870 ---- + { + set_exit_status (EXECUTION_FAILURE); +! last_read_token = current_token = '\n'; /* XXX */ + if (interactive_shell == 0 && posixly_correct) + jump_to_top_level (FORCE_EOF); + else +! { +! if (executing && parse_and_execute_level == 0) +! top_level_cleanup (); +! jump_to_top_level (DISCARD); +! } + } + + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 28 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 29 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-030.patch b/bash/Patches/bash52-030.patch new file mode 100644 index 00000000..8893a3cf --- /dev/null +++ b/bash/Patches/bash52-030.patch @@ -0,0 +1,130 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-030 + +Bug-Reported-by: Steven Pelley +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2024-01/msg00104.html + +Bug-Description: + +`wait -n' can fail to return some jobs if they exit due to signals the shell +does not report to the user. + +Patch (apply with `patch -p1'): + +*** a/jobs.c Thu Nov 9 14:59:14 2023 +--- b/jobs.c Tue Jul 30 15:27:44 2024 +*************** +*** 4275,4279 **** + ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job))) + continue; +! + /* If job control is disabled, don't print the status messages. + Mark dead jobs as notified so that they get cleaned up. If +--- 4288,4312 ---- + ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job))) + continue; +! +! /* Do the same thing and don't print anything or mark as notified +! for the signals we're not going to report on. This is the opposite +! of the first two cases under case JDEAD below. */ +! else if (interactive_shell == 0 && DEADJOB (job) && IS_FOREGROUND (job) == 0 && +! WIFSIGNALED (s) && (termsig == SIGINT +! #if defined (DONT_REPORT_SIGTERM) +! || termsig == SIGTERM +! #endif +! #if defined (DONT_REPORT_SIGPIPE) +! || termsig == SIGPIPE +! #endif +! || signal_is_trapped (termsig))) +! continue; +! +! /* hang onto the status if the shell is running -c command */ +! else if (startup_state == 2 && subshell_environment == 0 && +! WIFSIGNALED (s) == 0 && +! ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job))) +! continue; +! + /* If job control is disabled, don't print the status messages. + Mark dead jobs as notified so that they get cleaned up. If +*************** +*** 4298,4302 **** + /* Print info on jobs that are running in the background, + and on foreground jobs that were killed by anything +! except SIGINT (and possibly SIGPIPE). */ + switch (JOBSTATE (job)) + { +--- 4331,4335 ---- + /* Print info on jobs that are running in the background, + and on foreground jobs that were killed by anything +! except SIGINT (and possibly SIGTERM and SIGPIPE). */ + switch (JOBSTATE (job)) + { +*************** +*** 4318,4321 **** +--- 4351,4355 ---- + else if (IS_FOREGROUND (job)) + { ++ /* foreground jobs, interactive and non-interactive shells */ + #if !defined (DONT_REPORT_SIGPIPE) + if (termsig && WIFSIGNALED (s) && termsig != SIGINT) +*************** +*** 4331,4337 **** + fprintf (stderr, "\n"); + } + } +! else if (job_control) /* XXX job control test added */ + { + if (dir == 0) + dir = current_working_directory (); +--- 4365,4375 ---- + fprintf (stderr, "\n"); + } ++ /* foreground jobs that exit cleanly */ ++ jobs[job]->flags |= J_NOTIFIED; + } +! else if (job_control) + { ++ /* background jobs with job control, interactive and ++ non-interactive shells */ + if (dir == 0) + dir = current_working_directory (); +*************** +*** 4342,4346 **** + } + +! jobs[job]->flags |= J_NOTIFIED; + break; + +--- 4380,4391 ---- + } + +! /* Interactive shells without job control enabled are handled +! above. */ +! /* XXX - this is a catch-all in case we missed a state */ +! else +! { +! internal_debug("notify_of_job_status: catch-all setting J_NOTIFIED on job %d (%d), startup state = %d", job, jobs[job]->flags, startup_state); +! jobs[job]->flags |= J_NOTIFIED; +! } + break; + + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 29 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 30 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-031.patch b/bash/Patches/bash52-031.patch new file mode 100644 index 00000000..6c5e3446 --- /dev/null +++ b/bash/Patches/bash52-031.patch @@ -0,0 +1,46 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-031 + +Bug-Reported-by: Grisha Levit +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-06/msg00045.html + +Bug-Description: + +There is a memory leak in the code that implements the optimized $( +Bug-Reference-ID: Mon, 11 Dec 2023 20:41:58 +0600 +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-12/msg00047.html + +Bug-Description: + +Patch (apply with `patch -p1'): + +When printing functions containing coprocesses, the displayed coproc command +has the word COPROC inserted unconditionally, resulting in function bodies +that cannot be re-read as input. + +*** a/print_cmd.c Mon Aug 21 16:09:44 2023 +--- b/print_cmd.c Mon Dec 11 15:34:30 2023 +*************** +*** 357,361 **** + + case cm_coproc: +! cprintf ("coproc %s ", command->value.Coproc->name); + skip_this_indent++; + make_command_string_internal (command->value.Coproc->command); +--- 357,363 ---- + + case cm_coproc: +! cprintf ("coproc "); +! if (command->value.Coproc->command->type != cm_simple) +! cprintf ("%s ", command->value.Coproc->name); + skip_this_indent++; + make_command_string_internal (command->value.Coproc->command); + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 31 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 32 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-033.patch b/bash/Patches/bash52-033.patch new file mode 100644 index 00000000..ef4ade7c --- /dev/null +++ b/bash/Patches/bash52-033.patch @@ -0,0 +1,80 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-033 + +Bug-Reported-by: Florian Weimer +Bug-Reference-ID: <87leasmvoo.fsf@oldenburg.str.redhat.com> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-11/msg00104.html + +Bug-Description: + +A typo in the autoconf test for strtold causes false negatives for strtold +being available and working when compiled with gcc-14. + +Patch (apply with `patch -p1'): + +*** a/configure.ac Fri Aug 11 14:52:31 2023 +--- b/configure.ac Tue Nov 21 12:00:25 2023 +*************** +*** 899,903 **** + [AC_LANG_PROGRAM( + [[#include ]], +! [[long double r; char *foo, bar; r = strtold(foo, &bar);]] + )], + [bash_cv_strtold_broken=no],[bash_cv_strtold_broken=yes]) +--- 900,904 ---- + [AC_LANG_PROGRAM( + [[#include ]], +! [[long double r; char *foo, *bar; r = strtold(foo, &bar);]] + )], + [bash_cv_strtold_broken=no],[bash_cv_strtold_broken=yes]) + +*** a/configure Fri Aug 18 16:27:53 2023 +--- b/configure Tue Nov 21 12:00:30 2023 +*************** +*** 15923,15927 **** + main (void) + { +! long double r; char *foo, bar; r = strtold(foo, &bar); + + ; +--- 15932,15936 ---- + main (void) + { +! long double r; char *foo, *bar; r = strtold(foo, &bar); + + ; + +*** a/builtins/printf.def Fri Jun 24 10:09:50 2022 +--- b/builtins/printf.def Tue Aug 13 10:36:55 2024 +*************** +*** 710,714 **** + + p = getfloatmax (); +! f = mklong (start, "L", 1); + PF (f, p); + } +--- 710,714 ---- + + p = getfloatmax (); +! f = mklong (start, FLOATMAX_CONV, USE_LONG_DOUBLE); + PF (f, p); + } + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 32 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 33 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-034.patch b/bash/Patches/bash52-034.patch new file mode 100644 index 00000000..746b19c0 --- /dev/null +++ b/bash/Patches/bash52-034.patch @@ -0,0 +1,143 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-034 + +Bug-Reported-by: Wiley Young +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-05/msg00146.html + +Bug-Description: + +If we parse a compound assignment during an alias expansion, it's possible +to have the current input string popped out from underneath the parse. In +this case, we should not restore the input we were using when we began to +parse the compound assignment. + +Patch (apply with `patch -p1'): + +*** a/parse.y Fri May 26 16:57:03 2023 +--- b/parse.y Thu Jun 1 16:30:19 2023 +*************** +*** 6854,6860 **** + { + WORD_LIST *wl, *rl; +! int tok, orig_line_number, assignok; + sh_parser_state_t ps; + char *ret; + + orig_line_number = line_number; +--- 6858,6865 ---- + { + WORD_LIST *wl, *rl; +! int tok, orig_line_number, assignok, ea, restore_pushed_strings; + sh_parser_state_t ps; + char *ret; ++ STRING_SAVER *ss; + + orig_line_number = line_number; +*************** +*** 6879,6882 **** +--- 6884,6893 ---- + esacs_needed_count = expecting_in_token = 0; + ++ /* We're not pushing any new input here, we're reading from the current input ++ source. If that's an alias, we have to be prepared for the alias to get ++ popped out from underneath us. */ ++ ss = (ea = expanding_alias ()) ? pushed_string_list : (STRING_SAVER *)NULL; ++ restore_pushed_strings = 0; ++ + while ((tok = read_token (READ)) != ')') + { +*************** +*** 6902,6906 **** +--- 6913,6926 ---- + } + ++ /* Check whether or not an alias got popped out from underneath us and ++ fix up after restore_parser_state. */ ++ if (ea && ss && ss != pushed_string_list) ++ { ++ restore_pushed_strings = 1; ++ ss = pushed_string_list; ++ } + restore_parser_state (&ps); ++ if (restore_pushed_strings) ++ pushed_string_list = ss; + + if (wl == &parse_string_error) +*** a/y.tab.c Mon Sep 23 10:02:46 2024 +--- b/y.tab.c Mon Sep 23 10:02:49 2024 +*************** +*** 8804,8812 **** + int *retlenp; + { + WORD_LIST *wl, *rl; +! int tok, orig_line_number, assignok; + sh_parser_state_t ps; + char *ret; + + orig_line_number = line_number; + save_parser_state (&ps); +--- 8804,8813 ---- + int *retlenp; + { + WORD_LIST *wl, *rl; +! int tok, orig_line_number, assignok, ea, restore_pushed_strings; + sh_parser_state_t ps; + char *ret; ++ STRING_SAVER *ss; + + orig_line_number = line_number; + save_parser_state (&ps); +*************** +*** 8829,8834 **** +--- 8830,8841 ---- + + esacs_needed_count = expecting_in_token = 0; + ++ /* We're not pushing any new input here, we're reading from the current input ++ source. If that's an alias, we have to be prepared for the alias to get ++ popped out from underneath us. */ ++ ss = (ea = expanding_alias ()) ? pushed_string_list : (STRING_SAVER *)NULL; ++ restore_pushed_strings = 0; ++ + while ((tok = read_token (READ)) != ')') + { + if (tok == '\n') /* Allow newlines in compound assignments */ +*************** +*** 8852,8858 **** +--- 8859,8874 ---- + wl = make_word_list (yylval.word, wl); + } + ++ /* Check whether or not an alias got popped out from underneath us and ++ fix up after restore_parser_state. */ ++ if (ea && ss && ss != pushed_string_list) ++ { ++ restore_pushed_strings = 1; ++ ss = pushed_string_list; ++ } + restore_parser_state (&ps); ++ if (restore_pushed_strings) ++ pushed_string_list = ss; + + if (wl == &parse_string_error) + { + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 33 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 34 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-035.patch b/bash/Patches/bash52-035.patch new file mode 100644 index 00000000..09a3d456 --- /dev/null +++ b/bash/Patches/bash52-035.patch @@ -0,0 +1,129 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-035 + +Bug-Reported-by: Henry Bent +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-11/msg00044.html + +Bug-Description: + +There are systems that supply one of select or pselect, but not both. + +Patch (apply with `patch -p1'): + +https://lists.gnu.org/archive/html/bug-bash/2022-11/msg00058.html + +*** a/lib/readline/input.c 2022-04-08 15:43:24.000000000 -0400 +--- b/lib/readline/input.c 2022-11-16 09:10:41.000000000 -0500 +*************** +*** 152,156 **** +--- 152,158 ---- + int _rl_timeout_init (void); + int _rl_timeout_sigalrm_handler (void); ++ #if defined (RL_TIMEOUT_USE_SELECT) + int _rl_timeout_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *, const sigset_t *); ++ #endif + + static void _rl_timeout_handle (void); +*************** +*** 249,253 **** + int chars_avail, k; + char input; +! #if defined(HAVE_SELECT) + fd_set readfds, exceptfds; + struct timeval timeout; +--- 251,255 ---- + int chars_avail, k; + char input; +! #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) + fd_set readfds, exceptfds; + struct timeval timeout; +*************** +*** 806,810 **** + unsigned char c; + int fd; +! #if defined (HAVE_PSELECT) + sigset_t empty_set; + fd_set readfds; +--- 808,812 ---- + unsigned char c; + int fd; +! #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) + sigset_t empty_set; + fd_set readfds; +*** a/lib/sh/input_avail.c 2021-05-24 11:16:33.000000000 -0400 +--- b/lib/sh/input_avail.c 2022-11-16 09:12:48.000000000 -0500 +*************** +*** 34,40 **** + #endif /* HAVE_SYS_FILE_H */ + +! #if defined (HAVE_PSELECT) +! # include +! #endif + + #if defined (HAVE_UNISTD_H) +--- 34,38 ---- + #endif /* HAVE_SYS_FILE_H */ + +! #include + + #if defined (HAVE_UNISTD_H) +*************** +*** 108,115 **** + { + int result, chars_avail; +- #if defined(HAVE_SELECT) +- fd_set readfds, exceptfds; +- #endif + #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) + sigset_t set, oset; + #endif +--- 106,111 ---- + { + int result, chars_avail; + #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) ++ fd_set readfds, exceptfds; + sigset_t set, oset; + #endif +*************** +*** 122,132 **** + chars_avail = 0; + +! #if defined (HAVE_SELECT) + FD_ZERO (&readfds); + FD_ZERO (&exceptfds); + FD_SET (fd, &readfds); + FD_SET (fd, &exceptfds); +- #endif +- #if defined (HAVE_SELECT) || defined (HAVE_PSELECT) + sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set); + # ifdef SIGCHLD +--- 115,123 ---- + chars_avail = 0; + +! #if defined (HAVE_PSELECT) || defined (HAVE_SELECT) + FD_ZERO (&readfds); + FD_ZERO (&exceptfds); + FD_SET (fd, &readfds); + FD_SET (fd, &exceptfds); + sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set); + # ifdef SIGCHLD + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 34 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 35 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-036.patch b/bash/Patches/bash52-036.patch new file mode 100644 index 00000000..541c31d6 --- /dev/null +++ b/bash/Patches/bash52-036.patch @@ -0,0 +1,237 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-036 + +Bug-Reported-by: Grisha Levit +Bug-Reference-ID: +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-04/msg00082.html + +Bug-Description: + +When readline is accumulating bytes until it reads a complete multibyte +character, reading a byte that makes the multibyte character invalid can +result in discarding the bytes in the partial character. + +Patch (apply with `patch -p1'): + +*** a/lib/readline/text.c Mon May 1 09:37:52 2023 +--- b/lib/readline/text.c Mon May 29 12:22:29 2023 +*************** +*** 86,90 **** + rl_insert_text (const char *string) + { +! register int i, l; + + l = (string && *string) ? strlen (string) : 0; +--- 86,91 ---- + rl_insert_text (const char *string) + { +! register int i; +! size_t l; + + l = (string && *string) ? strlen (string) : 0; +*************** +*** 705,709 **** + /* Insert the character C at the current location, moving point forward. + If C introduces a multibyte sequence, we read the whole sequence and +! then insert the multibyte char into the line buffer. */ + int + _rl_insert_char (int count, int c) +--- 706,714 ---- + /* Insert the character C at the current location, moving point forward. + If C introduces a multibyte sequence, we read the whole sequence and +! then insert the multibyte char into the line buffer. +! If C == 0, we immediately insert any pending partial multibyte character, +! assuming that we have read a character that doesn't map to self-insert. +! This doesn't completely handle characters that are part of a multibyte +! character but map to editing functions. */ + int + _rl_insert_char (int count, int c) +*************** +*** 719,727 **** + #endif + + if (count <= 0) + return 0; + +! #if defined (HANDLE_MULTIBYTE) +! if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + incoming[0] = c; +--- 724,749 ---- + #endif + ++ #if !defined (HANDLE_MULTIBYTE) + if (count <= 0) + return 0; ++ #else ++ if (count < 0) ++ return 0; ++ if (count == 0) ++ { ++ if (pending_bytes_length == 0) ++ return 0; ++ if (stored_count <= 0) ++ stored_count = count; ++ else ++ count = stored_count; + +! memcpy (incoming, pending_bytes, pending_bytes_length); +! incoming[pending_bytes_length] = '\0'; +! incoming_length = pending_bytes_length; +! pending_bytes_length = 0; +! memset (&ps, 0, sizeof (mbstate_t)); +! } +! else if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + incoming[0] = c; +*************** +*** 731,734 **** +--- 753,759 ---- + else if (_rl_utf8locale && (c & 0x80) == 0) + { ++ if (pending_bytes_length) ++ _rl_insert_char (0, 0); ++ + incoming[0] = c; + incoming[1] = '\0'; +*************** +*** 765,769 **** + incoming_length = 1; + pending_bytes_length--; +! memmove (pending_bytes, pending_bytes + 1, pending_bytes_length); + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ +--- 790,795 ---- + incoming_length = 1; + pending_bytes_length--; +! if (pending_bytes_length) +! memmove (pending_bytes, pending_bytes + 1, pending_bytes_length); + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ +*************** +*** 828,832 **** +--- 854,862 ---- + xfree (string); + ++ #if defined (HANDLE_MULTIBYTE) ++ return (pending_bytes_length != 0); ++ #else + return 0; ++ #endif + } + +*************** +*** 861,864 **** +--- 891,896 ---- + incoming_length = 0; + stored_count = 0; ++ ++ return (pending_bytes_length != 0); + #else /* !HANDLE_MULTIBYTE */ + char str[TEXT_COUNT_MAX+1]; +*************** +*** 874,880 **** + count -= decreaser; + } +- #endif /* !HANDLE_MULTIBYTE */ + + return 0; + } + +--- 906,912 ---- + count -= decreaser; + } + + return 0; ++ #endif /* !HANDLE_MULTIBYTE */ + } + +*************** +*** 904,910 **** + stored_count = 0; + } +! #endif +! + return 0; + } + +--- 936,944 ---- + stored_count = 0; + } +! +! return (pending_bytes_length != 0); +! #else + return 0; ++ #endif + } + +*************** +*** 984,987 **** +--- 1018,1026 ---- + } + ++ /* If we didn't insert n and there are pending bytes, we need to insert ++ them if _rl_insert_char didn't do that on its own. */ ++ if (r == 1 && rl_insert_mode == RL_IM_INSERT) ++ r = _rl_insert_char (0, 0); /* flush partial multibyte char */ ++ + if (n != (unsigned short)-2) /* -2 = sentinel value for having inserted N */ + { +*************** +*** 1055,1058 **** +--- 1094,1099 ---- + rl_quoted_insert (int count, int key) + { ++ int r; ++ + /* Let's see...should the callback interface futz with signal handling? */ + #if defined (HANDLE_SIGNALS) +*************** +*** 1073,1085 **** + if (count < 0) + { +- int r; +- + do + r = _rl_insert_next (1); + while (r == 0 && ++count < 0); +- return r; + } + +! return _rl_insert_next (count); + } + +--- 1114,1128 ---- + if (count < 0) + { + do + r = _rl_insert_next (1); + while (r == 0 && ++count < 0); + } ++ else ++ r = _rl_insert_next (count); + +! if (r == 1) +! _rl_insert_char (0, 0); /* insert partial multibyte character */ +! +! return r; + } + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 35 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 36 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/bash52-037.patch b/bash/Patches/bash52-037.patch new file mode 100644 index 00000000..8d1b9e9c --- /dev/null +++ b/bash/Patches/bash52-037.patch @@ -0,0 +1,71 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 5.2 +Patch-ID: bash52-037 + +Bug-Reported-by: Martin Castillo +Bug-Reference-ID: <2d42153b-cf65-caba-dff1-cd3bc6268c7e@uni-bremen.de> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-readline/2023-01/msg00000.html + +Bug-Description: + +Fix the case where text to be completed from the line buffer (quoted) is +compared to the common prefix of the possible matches (unquoted) and the +quoting makes the former appear to be longer than the latter. Readline +assumes the match doesn't add any characters to the word and doesn't display +multiple matches. + +Patch (apply with `patch -p1'): + +*** a/lib/readline/complete.c Tue Apr 5 10:47:06 2022 +--- b/lib/readline/complete.c Sat Jan 7 14:19:45 2023 +*************** +*** 2032,2038 **** + text = rl_copy_text (start, end); + matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char); + /* nontrivial_lcd is set if the common prefix adds something to the word + being completed. */ +! nontrivial_lcd = matches && compare_match (text, matches[0]) != 0; + if (what_to_do == '!' || what_to_do == '@') + tlen = strlen (text); +--- 2038,2060 ---- + text = rl_copy_text (start, end); + matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char); ++ /* If TEXT contains quote characters, it will be dequoted as part of ++ generating the matches, and the matches will not contain any quote ++ characters. We need to dequote TEXT before performing the comparison. ++ Since compare_match performs the dequoting, and we only want to do it ++ once, we don't call compare_matches after dequoting TEXT; we call ++ strcmp directly. */ + /* nontrivial_lcd is set if the common prefix adds something to the word + being completed. */ +! if (rl_filename_completion_desired && rl_filename_quoting_desired && +! rl_completion_found_quote && rl_filename_dequoting_function) +! { +! char *t; +! t = (*rl_filename_dequoting_function) (text, rl_completion_quote_character); +! xfree (text); +! text = t; +! nontrivial_lcd = matches && strcmp (text, matches[0]) != 0; +! } +! else +! nontrivial_lcd = matches && strcmp (text, matches[0]) != 0; + if (what_to_do == '!' || what_to_do == '@') + tlen = strlen (text); + +*** a/patchlevel.h 2020-06-22 14:51:03.000000000 -0400 +--- b/patchlevel.h 2020-10-01 11:01:28.000000000 -0400 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 36 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 37 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash/Patches/disable-function-import.diff b/bash/Patches/disable-function-import.diff index 251acccb..f1ce3e7a 100644 --- a/bash/Patches/disable-function-import.diff +++ b/bash/Patches/disable-function-import.diff @@ -1,7 +1,7 @@ -diff -ur bash-4.1.orig/shell.c bash-4.1/shell.c ---- bash-4.1.orig/shell.c 2009-11-19 15:05:54.000000000 +0000 -+++ bash-4.1/shell.c 2014-09-26 17:32:15.075625442 +0000 -@@ -229,6 +229,6 @@ +diff -ruN a/shell.c b/shell.c +--- a/shell.c 2022-03-04 22:13:00.000000000 +0000 ++++ b/shell.c 2024-11-21 14:58:02.408512324 +0000 +@@ -236,7 +236,7 @@ #else int posixly_correct = 0; /* Non-zero means posix.2 superset. */ #endif @@ -9,7 +9,8 @@ diff -ur bash-4.1.orig/shell.c bash-4.1/shell.c +int import_functions = 0; /* Import functions from environment */ /* Some long-winded argument names. These are obviously new. */ #define Int 1 -@@ -248,6 +248,7 @@ + #define Charp 2 +@@ -257,6 +257,7 @@ { "help", Int, &want_initial_help, (char **)0x0 }, { "init-file", Charp, (int *)0x0, &bashrc_file }, { "login", Int, &make_login_shell, (char **)0x0 }, @@ -17,20 +18,19 @@ diff -ur bash-4.1.orig/shell.c bash-4.1/shell.c { "noediting", Int, &no_line_editing, (char **)0x0 }, { "noprofile", Int, &no_profile, (char **)0x0 }, { "norc", Int, &no_rc, (char **)0x0 }, -diff -ur bash-4.1.orig/variables.c bash-4.1/variables.c ---- bash-4.1.orig/variables.c 2014-09-26 17:30:13.517119943 +0000 -+++ bash-4.1/variables.c 2014-09-26 17:33:07.686094771 +0000 -@@ -109,7 +109,8 @@ +diff -ruN a/variables.c b/variables.c +--- a/variables.c 2022-07-18 21:31:35.000000000 +0000 ++++ b/variables.c 2024-11-21 14:58:46.140981394 +0000 +@@ -113,6 +113,7 @@ + /* Variables used here and defined in other files. */ extern time_t shell_start_time; - extern int assigning_in_environment; - extern int executing_builtin; - extern int funcnest_max; + extern struct timeval shellstart; +extern int import_functions; - #if defined (READLINE) - extern int no_line_editing; -@@ -354,7 +354,7 @@ - + /* The list of shell variables that the user has created at the global + scope, or that came from the environment. */ +@@ -394,7 +395,7 @@ + #if defined (FUNCTION_IMPORT) /* If exported function, define it now. Don't import functions from the environment in privileged mode. */ - if (privmode == 0 && read_but_dont_execute == 0 && diff --git a/bash/Patches/readline.patch b/bash/Patches/readline.patch new file mode 100644 index 00000000..ae34383b --- /dev/null +++ b/bash/Patches/readline.patch @@ -0,0 +1,22 @@ +--- a/lib/readline/rlprivate.h 2022-08-12 01:35:16.000000000 +0000 ++++ b/lib/readline/rlprivate.h 2024-11-21 15:04:52.301688525 +0000 +@@ -407,7 +419,7 @@ + #ifdef _MINIX + extern void _rl_output_character_function (int); + #else +-extern int _rl_output_character_function (int); ++extern int _rl_output_character_function (char); + #endif + extern void _rl_cr (void); + extern void _rl_output_some_chars (const char *, int); +--- a/lib/readline/terminal.c 2022-04-05 17:44:17.000000000 +0000 ++++ b/lib/readline/terminal.c 2024-11-21 15:05:16.236642766 +0000 +@@ -699,7 +703,7 @@ + } + #else /* !_MINIX */ + int +-_rl_output_character_function (int c) ++_rl_output_character_function (char c) + { + return putc (c, _rl_out_stream); + } diff --git a/bash/Patches/solaris-000.config.h.in.patch b/bash/Patches/solaris-000.config.h.in.patch new file mode 100644 index 00000000..96940c57 --- /dev/null +++ b/bash/Patches/solaris-000.config.h.in.patch @@ -0,0 +1,14 @@ +# config-top.h should be included by default in config.h +# otherwise some of the macros aren't visible. +# Solaris-specific patch. Not for upstream. +--- a/config.h.in 2009-08-18 20:34:36.000000000 -0700 ++++ b/config.h.in 2010-09-01 10:21:00.756734104 -0700 +@@ -21,6 +21,8 @@ + #ifndef _CONFIG_H_ + #define _CONFIG_H_ + ++#include "config-top.h" ++ + /* Configuration feature settings controllable by autoconf. */ + + /* Define JOB_CONTROL if your operating system supports diff --git a/bash/Patches/solaris-001.config-top.h.patch b/bash/Patches/solaris-001.config-top.h.patch new file mode 100644 index 00000000..48904545 --- /dev/null +++ b/bash/Patches/solaris-001.config-top.h.patch @@ -0,0 +1,43 @@ +# Define defaults for Solaris. +# Solaris-specific patch. +# +# Not for upstream. + +--- a/config-top.h 2019-02-02 11:56:23.350780231 +0000 ++++ b/config-top.h 2019-02-02 12:04:29.548649985 +0000 +@@ -63,7 +63,7 @@ + /* The default value of the PATH variable. */ + #ifndef DEFAULT_PATH_VALUE + #define DEFAULT_PATH_VALUE \ +- "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:." ++ "/usr/gnu/bin:/bin:/usr/bin:/sbin:/usr/sbin:." + #endif + + /* If you want to unconditionally set a value for PATH in every restricted +@@ -74,7 +74,7 @@ + the Posix.2 confstr () function, or CS_PATH define are not present. */ + #ifndef STANDARD_UTILS_PATH + #define STANDARD_UTILS_PATH \ +- "/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc" ++ "/usr/gnu/bin:/bin:/usr/bin:/sbin:/usr/sbin:/etc:/etc/bash" + #endif + + /* Default primary and secondary prompt strings. */ +@@ -87,14 +87,14 @@ + #define DEFAULT_BASHRC "~/.bashrc" + + /* 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 1 + + /* 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 diff --git a/bash/Patches/solaris-002.Makefile.in.patch b/bash/Patches/solaris-002.Makefile.in.patch new file mode 100644 index 00000000..4ae55695 --- /dev/null +++ b/bash/Patches/solaris-002.Makefile.in.patch @@ -0,0 +1,57 @@ +--- a/Makefile.in 2020-12-04 15:51:19.000000000 +0000 ++++ b/Makefile.in 2020-12-08 18:38:17.576538831 +0000 +@@ -137,14 +137,15 @@ + + LOCALE_DEFS = -DLOCALEDIR='"$(localedir)"' -DPACKAGE='"$(PACKAGE)"' + +-LOCAL_LIBS = @LOCAL_LIBS@ +-LIBS = $(BUILTINS_LIB) $(LIBRARIES) @LIBS@ ++LOCAL_LIBS += -lcurses ++LIBS = $(BUILTINS_LIB) $(LIBRARIES) @LIBS@ @LOCAL_LIBS@ + LIBS_FOR_BUILD = + + STATIC_LD = @STATIC_LD@ + LOCAL_LDFLAGS = @LOCAL_LDFLAGS@ + +-SYSTEM_FLAGS = -DPROGRAM='"$(Program)"' -DCONF_HOSTTYPE='"$(Machine)"' -DCONF_OSTYPE='"$(OS)"' -DCONF_MACHTYPE='"$(MACHTYPE)"' -DCONF_VENDOR='"$(VENDOR)"' $(LOCALE_DEFS) ++SYSTEM_FLAGS = -DPROGRAM='"$(Program)"' -DCONF_HOSTTYPE='"$(Machine)"' -DCONF_OSTYPE='"$(OS)"' -DCONF_MACHTYPE='"$(MACHTYPE)"' -DCONF_VENDOR='"$(VENDOR)"' $(LOCALE_DEFS) $(CFLAGS) ++ + + BASE_CCFLAGS = $(SYSTEM_FLAGS) $(LOCAL_DEFS) \ + $(DEFS) $(LOCAL_CFLAGS) $(INCLUDES) +@@ -580,7 +581,7 @@ + + $(Program): .build $(OBJECTS) $(BUILTINS_DEP) $(LIBDEP) + $(RM) $@ +- $(PURIFY) $(CC) $(BUILTINS_LDFLAGS) $(LIBRARY_LDFLAGS) $(LDFLAGS) -o $(Program) $(OBJECTS) $(LIBS) ++ $(PURIFY) $(CC) $(CFLAGS) $(BUILTINS_LDFLAGS) $(LIBRARY_LDFLAGS) $(LDFLAGS) -o $(Program) $(OBJECTS) $(LIBS) + ls -l $(Program) + -$(SIZE) $(Program) + +@@ -594,7 +595,7 @@ + @echo + + bashbug: $(SDIR)/bashbug.sh $(VERSPROG) +- @sed -e "s%!PATCHLEVEL!%$(PatchLevel)%" \ ++ @sed -e "s^!PATCHLEVEL!^$(PatchLevel)^" \ + $(SDIR)/bashbug.sh > $@ + @chmod a+rx bashbug + +@@ -619,7 +620,7 @@ + @-test -d tests || mkdir tests + @cp $(TESTS_SUPPORT) tests + @( cd $(srcdir)/tests && \ +- BUILD_DIR=$(BUILD_DIR) PATH=$(BUILD_DIR)/tests:$$PATH THIS_SH=$(THIS_SH) $(SHELL) ${TESTSCRIPT} ) ++ BUILD_DIR=$(BUILD_DIR) PATH=/usr/gnu/bin:$(BUILD_DIR)/tests:$$PATH THIS_SH=$(THIS_SH) $(SHELL) ${TESTSCRIPT} ) + + profiling-tests: ${PROGRAM} + @test "X$$PROFILE_FLAGS" == "X" && { echo "profiling-tests: must be built with profiling enabled" >&2; exit 1; } +@@ -958,7 +959,7 @@ + @-test -d tests || mkdir tests + @cp $(TESTS_SUPPORT) tests + @( cd $(srcdir)/tests && \ +- BUILD_DIR=$(BUILD_DIR) PATH=$(BUILD_DIR)/tests:$$PATH THIS_SH=$(THIS_SH) $(SHELL) ${TESTSCRIPT} ) ++ BUILD_DIR=$(BUILD_DIR) PATH=/usr/gnu/bin:$(BUILD_DIR)/tests:$$PATH THIS_SH=$(THIS_SH) $(SHELL) ${TESTSCRIPT} ) + + symlinks: + $(SHELL) $(SUPPORT_SRC)fixlinks -s $(srcdir) diff --git a/bash/Patches/solaris-003.glob.c.patch b/bash/Patches/solaris-003.glob.c.patch new file mode 100644 index 00000000..05d53041 --- /dev/null +++ b/bash/Patches/solaris-003.glob.c.patch @@ -0,0 +1,16 @@ +# Solaris-specific patch. alloca(3c) is not visible without +# including . +# Not for upstream. +--- a/lib/glob/glob.c 2009-11-14 15:39:30.000000000 -0800 ++++ b/lib/glob/glob.c 2010-09-01 10:28:10.161379481 -0700 +@@ -34,6 +34,10 @@ + # include + #endif + ++#if defined (HAVE_ALLOCA) && defined (HAVE_ALLOCA_H) ++# include ++#endif ++ + #include "bashansi.h" + #include "posixdir.h" + #include "posixstat.h" diff --git a/bash/Patches/solaris-004.snprintf.c.patch b/bash/Patches/solaris-004.snprintf.c.patch new file mode 100644 index 00000000..fde2313c --- /dev/null +++ b/bash/Patches/solaris-004.snprintf.c.patch @@ -0,0 +1,14 @@ +# We need to include for bash's own implementation +# of snprintf. +# Solaris-specific patch. Not for upstream. +--- a/lib/sh/snprintf.c 2010-05-30 15:34:52.000000000 -0700 ++++ b/lib/sh/snprintf.c 2011-11-29 09:31:46.751983149 -0800 +@@ -120,6 +120,8 @@ + # include + #endif + ++#include ++ + #include "stdc.h" + #include + diff --git a/bash/Patches/solaris-007.rlprivate.h.patch b/bash/Patches/solaris-007.rlprivate.h.patch new file mode 100644 index 00000000..52c3e455 --- /dev/null +++ b/bash/Patches/solaris-007.rlprivate.h.patch @@ -0,0 +1,25 @@ +# bash's own private copy of libreadline. +# It needs some header file help for handling Unicode and/or +# multi-byte encodings. +# This is Solaris-specific. +--- a/lib/readline/rlprivate.h 2009-01-22 21:56:49.000000000 -0500 ++++ b/lib/readline/rlprivate.h 2009-08-16 10:55:56.178609000 -0400 +@@ -23,6 +23,18 @@ + #if !defined (_RL_PRIVATE_H_) + #define _RL_PRIVATE_H_ + ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++#if defined(HANDLE_MULTIBYTE) ++ ++#include ++#include ++#include ++ ++#endif /* HANDLE_MULTIBYTE */ ++ + #include "rlconf.h" /* for VISIBLE_STATS */ + #include "rlstdc.h" + #include "posixjmp.h" /* defines procenv_t */ diff --git a/bash/Patches/solaris-008.xmbsrtowcs.c.patch b/bash/Patches/solaris-008.xmbsrtowcs.c.patch new file mode 100644 index 00000000..ee82ebb4 --- /dev/null +++ b/bash/Patches/solaris-008.xmbsrtowcs.c.patch @@ -0,0 +1,14 @@ +# Setting the freed pointer to NULL after free'ing +# prevents it from being double-free'd. +# Solaris-specific patch. +--- a/lib/glob/xmbsrtowcs.c 2010-05-30 15:36:27.000000000 -0700 ++++ b/lib/glob/xmbsrtowcs.c 2011-11-29 09:34:23.471481937 -0800 +@@ -36,7 +36,7 @@ + #if HANDLE_MULTIBYTE + + #ifndef FREE +-# define FREE(x) do { if (x) free (x); } while (0) ++# define FREE(x) do { if (x) free (x); x = 0; } while (0) + #endif + + #if ! HAVE_STRCHRNUL diff --git a/bash/Patches/solaris-009.configure.patch b/bash/Patches/solaris-009.configure.patch new file mode 100644 index 00000000..917bd5ec --- /dev/null +++ b/bash/Patches/solaris-009.configure.patch @@ -0,0 +1,49 @@ +--- a/configure.ac 2017-05-08 03:23:15.044220076 +0200 ++++ b/configure.ac 2017-05-08 03:23:59.219546840 +0200 +@@ -57,6 +57,12 @@ + opt_curses=no + opt_with_installed_readline=no + ++ac_cv_func_tgetent=yes ++ac_cv_lib_termcap_tgetent=no ++ac_cv_lib_curses_tgetent=no ++ac_cv_lib_ncurses_tgetent=yes ++bash_cv_termcap_lib=libcurses ++ + #htmldir= + + dnl some systems should be configured without the bash malloc by default +@@ -499,10 +499,10 @@ if test "$opt_static_link" = yes; then + prefer_shared=no + # if we're using gcc, add `-static' to LDFLAGS, except on Solaris >= 2 + if test "$GCC" = "yes"; then +- STATIC_LD="-static" ++ STATIC_LD="" + case "$host_os" in + solaris2*|linux*) ;; +- *) LDFLAGS="$LDFLAGS -static" ;; # XXX experimental ++ *) LDFLAGS="$LDFLAGS" ;; # XXX experimental + esac + fi + fi +@@ -508,7 +514,7 @@ + CC_FOR_BUILD=${CC_FOR_BUILD-"gcc"} + CPPFLAGS_FOR_BUILD=${CPPFLAGS_FOR_BUILD-""} + LDFLAGS_FOR_BUILD=${LDFLAGS_FOR_BUILD-""} +- CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD="-g"} ++ CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD=""} +- BASE_CFLAGS_FOR_BUILD=${BASE_CFLAGS_FOR_BUILD="-g"} ++ BASE_CFLAGS_FOR_BUILD=${BASE_CFLAGS_FOR_BUILD=""} + LIBS_FOR_BUILD=${LIBS_FOR_BUILD-""} + fi + +@@ -1088,7 +1094,8 @@ + solaris2.5*) LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;; + solaris2.8*) LOCAL_CFLAGS=-DSOLARIS ;; + solaris2.9*) LOCAL_CFLAGS=-DSOLARIS ;; +-solaris2.10*) LOCAL_CFLAGS=-DSOLARIS ;; ++solaris2.10*) LOCAL_CFLAGS="-DSOLARIS -lsocket -lnsl -lgen" ;; ++solaris2.11*) LOCAL_CFLAGS="-DSOLARIS -lsocket -lnsl -lgen -lcurses" ;; + solaris2*) LOCAL_CFLAGS=-DSOLARIS ;; + lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; + linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading diff --git a/bash/Patches/solaris-010.input.c.patch b/bash/Patches/solaris-010.input.c.patch new file mode 100644 index 00000000..31a7b9ce --- /dev/null +++ b/bash/Patches/solaris-010.input.c.patch @@ -0,0 +1,16 @@ +# libreadline needs to include (FIONREAD) on Solaris. +# Solaris-specific patch. +# Not for upstream. +--- a/lib/readline/input.c 2009-04-19 10:12:03.000000000 -0700 ++++ b/lib/readline/input.c 2010-09-01 10:46:23.386144948 -0700 +@@ -51,6 +51,10 @@ + # include + #endif + ++#if defined(SOLARIS) ++# include ++#endif ++ + #include + #include + diff --git a/bash/Patches/solaris-011.input_avail.c.patch b/bash/Patches/solaris-011.input_avail.c.patch new file mode 100644 index 00000000..b5a652fb --- /dev/null +++ b/bash/Patches/solaris-011.input_avail.c.patch @@ -0,0 +1,16 @@ +# bash itself needs to include (FIONREAD) on Solaris. +# Solaris-specific patch. +# Not for upstream. +--- a/lib/sh/input_avail.c 2009-04-19 10:01:14.000000000 -0700 ++++ b/lib/sh/input_avail.c 2010-09-01 10:47:30.418016819 -0700 +@@ -45,6 +45,10 @@ + # include + #endif + ++#if defined(SOLARIS) ++# include /* Solaris FIONREAD */ ++#endif ++ + #include + #include + diff --git a/bash/Patches/solaris-012.inputrc.location.patch b/bash/Patches/solaris-012.inputrc.location.patch new file mode 100644 index 00000000..690d95a0 --- /dev/null +++ b/bash/Patches/solaris-012.inputrc.location.patch @@ -0,0 +1,104 @@ +Solaris-specific system paths. Our bash configuration lives in /etc/bash/inputrc. + +--- a/doc/bash.info 2020-11-18 21:13:06.000000000 +0000 ++++ b/doc/bash.info 2020-12-08 12:17:05.628090856 +0000 +@@ -7586,7 +7586,7 @@ + directory. The name of this file is taken from the value of the shell + variable 'INPUTRC'. If that variable is unset, the default is + '~/.inputrc'. If that file does not exist or cannot be read, the +-ultimate default is '/etc/inputrc'. The 'bind' builtin command can also ++ultimate default is '/etc/bash/inputrc'. The 'bind' builtin command can also + be used to set Readline keybindings and variables. *Note Bash + Builtins::. + +@@ -8135,8 +8135,8 @@ + '$include' + This directive takes a single filename as an argument and reads + commands and bindings from that file. For example, the following +- directive reads from '/etc/inputrc': +- $include /etc/inputrc ++ directive reads from '/etc/bash/inputrc': ++ $include /etc/bash/inputrc + +  + File: bash.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File +@@ -8155,8 +8155,8 @@ + # Lines beginning with '#' are comments. + # + # First, include any system-wide bindings and variable +- # assignments from /etc/Inputrc +- $include /etc/Inputrc ++ # assignments from /etc/bash/Inputrc ++ $include /etc/bash/Inputrc + + # + # Set various bindings for emacs mode. +--- a/doc/bashref.info 2020-11-18 21:12:25.000000000 +0000 ++++ b/doc/bashref.info 2020-12-08 12:16:14.823974296 +0000 +@@ -7586,7 +7586,7 @@ + directory. The name of this file is taken from the value of the shell + variable 'INPUTRC'. If that variable is unset, the default is + '~/.inputrc'. If that file does not exist or cannot be read, the +-ultimate default is '/etc/inputrc'. The 'bind' builtin command can also ++ultimate default is '/etc/bash/inputrc'. The 'bind' builtin command can also + be used to set Readline keybindings and variables. *Note Bash + Builtins::. + +@@ -8135,8 +8135,8 @@ + '$include' + This directive takes a single filename as an argument and reads + commands and bindings from that file. For example, the following +- directive reads from '/etc/inputrc': +- $include /etc/inputrc ++ directive reads from '/etc/bash/inputrc': ++ $include /etc/bash/inputrc + +  + File: bashref.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File +@@ -8155,8 +8155,8 @@ + # Lines beginning with '#' are comments. + # + # First, include any system-wide bindings and variable +- # assignments from /etc/Inputrc +- $include /etc/Inputrc ++ # assignments from /etc/bash/Inputrc ++ $include /etc/bash/Inputrc + + # + # Set various bindings for emacs mode. +--- a/doc/bash.1 2020-11-18 21:03:59.000000000 +0000 ++++ b/doc/bash.1 2020-12-08 12:21:43.110560302 +0000 +@@ -5508,7 +5508,7 @@ + variable. If that variable is unset, the default is + .IR ~/.inputrc . + If that file does not exist or cannot be read, the ultimate default is +-.IR /etc/inputrc . ++.IR /etc/bash/inputrc . + When a program which uses the readline library starts up, the + initialization file is read, and the key bindings and variables + are set. +@@ -6114,11 +6114,11 @@ + .IP \fB$include\fP + This directive takes a single filename as an argument and reads commands + and bindings from that file. For example, the following directive +-would read \fI/etc/inputrc\fP: ++would read \fI/etc/bash/inputrc\fP: + .sp 1 + .RS + .nf +-\fB$include\fP \^ \fI/etc/inputrc\fP ++\fB$include\fP \^ \fI/etc/bash/inputrc\fP + .fi + .RE + .SS Searching +--- a/lib/readline/rlconf.h 2017-02-21 16:25:30.000000000 +0000 ++++ b/lib/readline/rlconf.h 2020-12-08 12:19:52.079293614 +0000 +@@ -43,7 +43,7 @@ + #define DEFAULT_INPUTRC "~/.inputrc" + + /* The ultimate last-ditch filename for an init file -- system-wide. */ +-#define SYS_INPUTRC "/etc/inputrc" ++#define SYS_INPUTRC "/etc/bash/inputrc" + + /* If defined, expand tabs to spaces. */ + #define DISPLAY_TABS diff --git a/bash/Patches/solaris-015.rbash.man.patch b/bash/Patches/solaris-015.rbash.man.patch new file mode 100644 index 00000000..46a44800 --- /dev/null +++ b/bash/Patches/solaris-015.rbash.man.patch @@ -0,0 +1,13 @@ +# Solaris-specific tweaks to the rbash(1) man page. +# Also, say the correct bash version and release date. +# Not for upstream. +--- a/doc/rbash.1 2008-08-12 06:24:51.000000000 -0700 ++++ b/doc/rbash.1 2010-09-01 10:52:04.397206373 -0700 +@@ -3,8 +3,8 @@ + rbash \- restricted bash, see \fBbash\fR(1) + .SH RESTRICTED SHELL + .nr zY 1 +-.so bash.1 ++.so /usr/share/man/man1/bash.1 + .SH SEE ALSO + bash(1) diff --git a/bash/Patches/solaris-017.printf2.sub.patch b/bash/Patches/solaris-017.printf2.sub.patch new file mode 100644 index 00000000..04027fa4 --- /dev/null +++ b/bash/Patches/solaris-017.printf2.sub.patch @@ -0,0 +1,18 @@ +diff -Nru bash-5.2.orig/tests/printf2.sub bash-5.2/tests/printf2.sub +--- a/tests/printf2.sub 2022-09-26 19:44:37.995231398 +0000 ++++ b/tests/printf2.sub 2022-09-26 19:45:11.358414301 +0000 +@@ -1,12 +1,14 @@ + unset LC_ALL LC_CTYPE + + export LANG=C ++export LC_ALL=C + case $(printf %d\\n \'A) in + 65) ;; + *) echo "printf2.sub: character conversion failed" >&2 ;; + esac + + export LANG=en_US.UTF-8 ++export LC_ALL=en_US.UTF-8 + case $(printf %d\\n \'À) in + 192) exit 0;; + *) echo "printf2.sub: multibyte character conversion failed" >&2 ; exit 2 ;; diff --git a/bash/Patches/solaris-018.posixexp2.tests.patch b/bash/Patches/solaris-018.posixexp2.tests.patch new file mode 100644 index 00000000..38d7d7d2 --- /dev/null +++ b/bash/Patches/solaris-018.posixexp2.tests.patch @@ -0,0 +1,26 @@ +# solaris is compiled with --enable-xpg-echo-default=yes which makes some +# tests fail. Should we use printf '%s\n' "..." instead? +# +# Reported on bug-bash@gnu.org + +--- a/tests/exp5.sub 2016-12-05 22:42:48.000000000 +0000 ++++ b/tests/exp5.sub 2019-02-02 12:31:51.417537626 +0000 +@@ -1,6 +1,6 @@ + # expansions involving patterns + var='[hello' +-echo "${var//[/}" ++echo -E "${var//[/}" + + red='\[\e[0;31m\]' + printf "%s\n" "${red//\\[\\e/}" +@@ -10,8 +10,8 @@ foo="${red//\\[\\e/}" + # foo == [0;31m\] + printf "%s\n" "${foo//[0;31m\\/}" + +-echo "${var//[]/}" +-echo "${red//[]/}" ++echo -E "${var//[]/}" ++echo -E "${red//[]/}" + + v=hello + foo='[:alpha:]' diff --git a/bash/Patches/solaris-019.eaccess.c.patch b/bash/Patches/solaris-019.eaccess.c.patch new file mode 100644 index 00000000..3e81e1a3 --- /dev/null +++ b/bash/Patches/solaris-019.eaccess.c.patch @@ -0,0 +1,40 @@ +# Fix for CVE-2012-3410. +# Solaris-specific. There are no threads in bash, therefore +# no concurrency issues on accessing a static buffer. +# Not for upstream, their fix is too Linux-specific +--- a/lib/sh/eaccess.c 2012-10-09 12:45:17.924274300 -0700 ++++ b/lib/sh/eaccess.c 2012-10-09 12:44:21.930979200 -0700 +@@ -40,6 +40,10 @@ + #if !defined (_POSIX_VERSION) && defined (HAVE_SYS_FILE_H) + # include + #endif /* !_POSIX_VERSION */ ++ ++#include /* memset(3C) */ ++#include /* _XOPEN_PATH_MAX */ ++ + #include "posixstat.h" + #include "filecntl.h" + +@@ -82,7 +86,7 @@ + const char *path; + struct stat *finfo; + { +- static char *pbuf = 0; ++ static char pbuf[_XOPEN_PATH_MAX + 1]; + + if (*path == '\0') + { +@@ -108,9 +112,11 @@ + trailing slash. Make sure /dev/fd/xx really uses DEV_FD_PREFIX/xx. + On most systems, with the notable exception of linux, this is + effectively a no-op. */ +- pbuf = xrealloc (pbuf, sizeof (DEV_FD_PREFIX) + strlen (path + 8)); ++ /* The way CVE-2012-3410 was fixed is wrong */ ++ (void) memset (pbuf, '\0', sizeof(pbuf)); + strcpy (pbuf, DEV_FD_PREFIX); +- strcat (pbuf, path + 8); ++ strncat (pbuf, path + 8, ++ (size_t) (sizeof(pbuf) - sizeof(DEV_FD_PREFIX))); + return (stat (pbuf, finfo)); + #endif /* !HAVE_DEV_FD */ + } diff --git a/bash/Patches/solaris-020.xcase.c.patch b/bash/Patches/solaris-020.xcase.c.patch new file mode 100644 index 00000000..fb246cdf --- /dev/null +++ b/bash/Patches/solaris-020.xcase.c.patch @@ -0,0 +1,15 @@ +# Let's use ANSI C, perhaps? +# Solaris-specific. Not for upstream. +--- a/support/xcase.c 2015-04-02 10:22:38.727863382 -0700 ++++ b/support/xcase.c 2015-04-02 10:23:44.651812788 -0700 +@@ -40,9 +40,7 @@ + #define UPPER 2 + + int +-main(ac, av) +-int ac; +-char **av; ++main(int ac, char **av) + { + int c, x; + int op; diff --git a/bash/Patches/solaris-021.builtins.makefile.in.patch b/bash/Patches/solaris-021.builtins.makefile.in.patch new file mode 100644 index 00000000..0f76f396 --- /dev/null +++ b/bash/Patches/solaris-021.builtins.makefile.in.patch @@ -0,0 +1,14 @@ +# Append $(CFLAGS_FOR_BUILD) to $(CCFLAGS_FOR_BUILD), +# so that we get everything we want. +# Solaris-specific. Not for upstream. +--- a/builtins/Makefile.in 2010-12-21 05:37:18.000000000 -0800 ++++ b/builtins/Makefile.in 2013-03-19 10:25:27.019593825 -0700 +@@ -92,7 +92,7 @@ + + CCFLAGS = $(BASE_CCFLAGS) $(CPPFLAGS) $(CFLAGS) + +-CCFLAGS_FOR_BUILD = $(BASE_CCFLAGS) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) ++CCFLAGS_FOR_BUILD = $(CFLAGS) $(BASE_CCFLAGS) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) + + GCC_LINT_FLAGS = -Wall -Wshadow -Wpointer-arith -Wcast-qual \ + -Wcast-align -Wstrict-prototypes -Wconversion \ diff --git a/bash/Patches/solaris-023.eaccess.c.patch b/bash/Patches/solaris-023.eaccess.c.patch new file mode 100644 index 00000000..6642da1f --- /dev/null +++ b/bash/Patches/solaris-023.eaccess.c.patch @@ -0,0 +1,21 @@ +# Solaris-specific. The famous access(2) bug that will return +# X_OK even if the execute bit isn't set. +# So, we want to use stat(2) instead, which returns the actual +# permission bits. +# +# I do know nothing about the mentioned bug, keeping the patch just to be sure. +# +# Not suitable for upstream + +--- a/lib/sh/eaccess.c 2015-04-02 10:24:43.401129429 -0700 ++++ b/lib/sh/eaccess.c 2015-04-02 10:28:57.704781076 -0700 +@@ -211,7 +211,8 @@ + if (path_is_devfd (path)) + return (sh_stataccess (path, mode)); + +-#if (defined (HAVE_FACCESSAT) && defined (AT_EACCESS)) || defined (HAVE_EACCESS) ++#if ((defined (HAVE_FACCESSAT) && defined (AT_EACCESS)) || \ ++ defined (HAVE_EACCESS)) && !defined(SOLARIS) + # if defined (HAVE_FACCESSAT) && defined (AT_EACCESS) + ret = faccessat (AT_FDCWD, path, mode, AT_EACCESS); + # else /* HAVE_EACCESS */ /* FreeBSD */ diff --git a/bash/Patches/solaris-025.libreadline.terminal.c.patch b/bash/Patches/solaris-025.libreadline.terminal.c.patch new file mode 100644 index 00000000..928213b0 --- /dev/null +++ b/bash/Patches/solaris-025.libreadline.terminal.c.patch @@ -0,0 +1,18 @@ +# If bash uses ncurses, then its own copy of libreadline should +# use ncurses too. +# Solaris-specific. On Linux, the header file is named +# . +# We should submit this upstream. +--- a/lib/readline/terminal.c 2013-09-18 06:12:01.000000000 -0700 ++++ b/lib/readline/terminal.c 2015-04-02 11:02:07.348094364 -0700 +@@ -48,6 +48,10 @@ + + #include + ++#if defined(SOLARIS) ++# include ++#endif ++ + /* System-specific feature definitions and include files. */ + #include "rldefs.h" + diff --git a/bash/Patches/solaris-026.cd_in_rcfile.patch b/bash/Patches/solaris-026.cd_in_rcfile.patch new file mode 100644 index 00000000..cb8722b1 --- /dev/null +++ b/bash/Patches/solaris-026.cd_in_rcfile.patch @@ -0,0 +1,26 @@ +# There seems to be problem with bash +# +# $ bash -c 'bash -i i; bash -i i' +# bash -c 'bash -i i; bash -i i' +# bash: i: No such file or directory +# +# [1]+ Stopped bash -c 'bash -i i; bash -i i' +# +# I found out because the tests were stopped in the middle. It was caused by +# having 'cd /somewhere' in my ~/.bashrc. The tests were being stopped in +# read-test, exactly in read2.sub when 'read -t 2 a < /dev/tty' was executed. +# This workaround stops the tests to be stopped in the middle. +# +# reported to bug-bash@gnu.org + +--- a/tests/execscript 2016-12-08 00:40:18.000000000 +0000 ++++ b/tests/execscript.new 2019-02-02 12:39:16.486640339 +0000 +@@ -108,7 +108,7 @@ ${THIS_SH} ./exec6.sub + # checks for properly deciding what constitutes an executable file + ${THIS_SH} ./exec7.sub + +-${THIS_SH} -i ${PWD}/exec8.sub ++${THIS_SH} --rcfile /dev/null -i ${PWD}/exec8.sub + + ${THIS_SH} ./exec9.sub + diff --git a/bash/Patches/solaris-026.libreadline.display.c.patch b/bash/Patches/solaris-026.libreadline.display.c.patch new file mode 100644 index 00000000..26e07fc4 --- /dev/null +++ b/bash/Patches/solaris-026.libreadline.display.c.patch @@ -0,0 +1,18 @@ +# If bash uses ncurses, then its own copy of libreadline should +# use ncurses too. +# Solaris-specific. On Linux, the header file is named +# . +# We should submit this upstream. +--- a/lib/readline/display.c 2015-04-02 11:04:32.395423459 -0700 ++++ b/lib/readline/display.c 2015-04-02 11:05:13.614898815 -0700 +@@ -41,6 +41,10 @@ + + #include + ++#if defined(SOLARIS) ++# include ++#endif ++ + #ifdef __MSDOS__ + # include + #endif diff --git a/bash/Patches/solaris-027.bad_file_number_text.patch b/bash/Patches/solaris-027.bad_file_number_text.patch new file mode 100644 index 00000000..24dccb8e --- /dev/null +++ b/bash/Patches/solaris-027.bad_file_number_text.patch @@ -0,0 +1,27 @@ +# Solaris says 'Bad file number' instead of 'Bad file descriptor' on Linux. +# Make sure the test finds what it expects +# +# Not suitable for upstream + +--- a/tests/redir.right 2016-11-28 04:38:00.494117081 -0800 ++++ b/tests/redir.right 2016-11-28 04:36:49.995612525 -0800 +@@ -64,7 +64,7 @@ f + typeset -f f + + # make sure it was closed +-read -u 5 foo 2>&1 | grep -q 'invalid file descriptor' ++read -u 5 foo 2>&1 | grep -q 'invalid file number' + echo after read + + exec 5<&0 +--- a/tests/redir5.sub 2018-10-08 17:56:14.000000000 +0000 ++++ b/tests/redir5.sub 2019-02-02 13:09:26.849690646 +0000 +@@ -17,7 +17,7 @@ f + typeset -f f + + # make sure it was closed +-read -u 5 foo 2>&1 | grep -q 'invalid file descriptor' ++read -u 5 foo 2>&1 | grep -q 'invalid file number' + echo after read + + exec 5<&0 diff --git a/bash/Patches/solaris-027.tests.exp.right.patch b/bash/Patches/solaris-027.tests.exp.right.patch new file mode 100644 index 00000000..2ebfd9b7 --- /dev/null +++ b/bash/Patches/solaris-027.tests.exp.right.patch @@ -0,0 +1,14 @@ +# We want the escape/control characters in there, and not +# a backlash. +# Solaris-sepcific. Not for upstream. +--- a/tests/exp.right 2013-01-23 12:37:16.000000000 -0800 ++++ b/tests/exp.right 2015-04-07 09:55:42.226643308 -0700 +@@ -174,7 +174,7 @@ + [0;31m\] + ] + [hello +-\[\e[0;31m\] ++\[\] + + hello + eo diff --git a/bash/Patches/solaris-029.undef_SHELL.patch b/bash/Patches/solaris-029.undef_SHELL.patch new file mode 100644 index 00000000..94da4d6f --- /dev/null +++ b/bash/Patches/solaris-029.undef_SHELL.patch @@ -0,0 +1,23 @@ +# When SHELL is unset the test fails with +# +# 150,151c150,151 +# < ./redir11.sub: line 26: echo: write error: Bad file number +# < ./redir11.sub: line 27: echo: write error: Bad file number +# --- +# > ./redir11.sub: line 26: $(a=4 foo): Bad file number +# > ./redir11.sub: line 27: $(a=4 foo): Bad file number +# +# Reported to bug-bash@gnu.org, but they can't reproduce. Needs more work on +# our side. + +--- a/tests/redir.tests 2016-12-01 11:20:04.910983199 +0000 ++++ b/tests/redir.tests 2016-12-01 11:19:34.114069067 +0000 +@@ -1,7 +1,7 @@ + : ${TMPDIR:=/tmp} + + export LC_ALL=C +-export LANG=C ++export LANG=C; export SHELL= + + # catch-all for remaining untested redirection stuff + set +o posix diff --git a/bash/bash-4.3.30.tar.gz b/bash/bash-4.3.30.tar.gz deleted file mode 100644 index 472ac401..00000000 Binary files a/bash/bash-4.3.30.tar.gz and /dev/null differ diff --git a/bash/bash-5.2.tar.gz b/bash/bash-5.2.tar.gz new file mode 100644 index 00000000..98bac1ed Binary files /dev/null and b/bash/bash-5.2.tar.gz differ