From 2455014cdcd726bcb243b984ff3b957b889f3b06 Mon Sep 17 00:00:00 2001 From: Roman Rakus Date: Wed, 11 Mar 2009 16:59:21 +0000 Subject: [PATCH] Patch level 10 --- bash.spec | 29 +++++- bash40-001 | 162 +++++++++++++++++++++++++++++++++ bash40-002 | 43 +++++++++ bash40-003 | 70 ++++++++++++++ bash40-004 | 47 ++++++++++ bash40-005 | 63 +++++++++++++ bash40-006 | 43 +++++++++ bash40-007 | 263 +++++++++++++++++++++++++++++++++++++++++++++++++++++ bash40-008 | 49 ++++++++++ bash40-009 | 61 +++++++++++++ bash40-010 | 63 +++++++++++++ 11 files changed, 890 insertions(+), 3 deletions(-) create mode 100644 bash40-001 create mode 100644 bash40-002 create mode 100644 bash40-003 create mode 100644 bash40-004 create mode 100644 bash40-005 create mode 100644 bash40-006 create mode 100644 bash40-007 create mode 100644 bash40-008 create mode 100644 bash40-009 create mode 100644 bash40-010 diff --git a/bash.spec b/bash.spec index 280fc14..af08f40 100644 --- a/bash.spec +++ b/bash.spec @@ -3,7 +3,7 @@ Version: 4.0 Name: bash Summary: The GNU Bourne Again shell version %{version} -Release: 2%{?dist} +Release: 3%{?dist} Group: System Environment/Shells License: GPLv2+ Url: http://www.gnu.org/software/bash @@ -17,6 +17,17 @@ Source2: dot-bash_profile Source3: dot-bash_logout # Official upstream patches +Patch001: bash40-001 +Patch002: bash40-002 +Patch003: bash40-003 +Patch004: bash40-004 +Patch005: bash40-005 +Patch006: bash40-006 +Patch007: bash40-007 +Patch008: bash40-008 +Patch009: bash40-009 +Patch010: bash40-010 + # not any :) # Other patches @@ -38,7 +49,6 @@ Patch115: bash-infotags.patch Patch116: bash-requires.patch Patch117: bash-setlocale.patch Patch118: bash-tty-tests.patch -Patch119: pcomplete-save-parser-state.patch #Patch119: bash-ulimit-m.patch #Patch120: bash-4.0-no_debug_output.patch #Patch121: bash-4.0-shell_pipelines_handling.patch @@ -64,6 +74,17 @@ compliance over previous versions. %setup -q -n bash-%{version} # Official upstream patches +%patch001 -p0 -b .001 +%patch002 -p0 -b .002 +%patch003 -p0 -b .003 +%patch004 -p0 -b .004 +%patch005 -p0 -b .005 +%patch006 -p0 -b .006 +%patch007 -p0 -b .007 +%patch008 -p0 -b .008 +%patch009 -p0 -b .009 +%patch010 -p0 -b .010 + # Other patches %patch101 -p1 -b .security %patch102 -p1 -b .paths @@ -83,7 +104,6 @@ compliance over previous versions. %patch116 -p1 -b .requires %patch117 -p1 -b .setlocale %patch118 -p1 -b .tty_tests -%patch119 -p1 -b .parser-state #%patch119 -p1 -b .ulimit-m #%patch120 -p1 -b .no_debug_output #%patch121 -p1 -b .pipelines_handling @@ -245,6 +265,9 @@ fi #%doc doc/*.ps doc/*.0 doc/*.html doc/article.txt %changelog +* Wed Mar 11 2009 Roman Rakus - 4.0-3 +- Official upstream patch level 10 + * Wed Feb 25 2009 Roman Rakus - 4.0-2 - Save parser state in pcomplete. Resolves: #487257 diff --git a/bash40-001 b/bash40-001 new file mode 100644 index 0000000..5c6bb34 --- /dev/null +++ b/bash40-001 @@ -0,0 +1,162 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-001 + +Bug-Reported-by: Mike Frysinger +Bug-Reference-ID: <200902211821.42188.vapier@gentoo.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00147.html + +Bug-Description: + +Bash has problems parsing certain constructs inside Posix-style $(...) +command substitutions, mostly with backslash-quoting and reserved word +recognition. This is an issue because the contents are parsed at the +time the word containing the command substitution is read. + +Patch: + +*** ../bash-4.0/parse.y 2009-01-08 08:29:12.000000000 -0500 +--- parse.y 2009-03-06 20:32:35.000000000 -0500 +*************** +*** 2928,2931 **** +--- 2932,2936 ---- + #define LEX_HEREDELIM 0x100 /* reading here-doc delimiter */ + #define LEX_STRIPDOC 0x200 /* <<- strip tabs from here doc delim */ ++ #define LEX_INWORD 0x400 + + #define COMSUB_META(ch) ((ch) == ';' || (ch) == '&' || (ch) == '|') +*************** +*** 3180,3184 **** + int *lenp, flags; + { +! int count, ch, peekc, tflags, lex_rwlen, lex_firstind; + int nestlen, ttranslen, start_lineno; + char *ret, *nestret, *ttrans, *heredelim; +--- 3188,3192 ---- + int *lenp, flags; + { +! int count, ch, peekc, tflags, lex_rwlen, lex_wlen, lex_firstind; + int nestlen, ttranslen, start_lineno; + char *ret, *nestret, *ttrans, *heredelim; +*************** +*** 3201,3205 **** + + start_lineno = line_number; +! lex_rwlen = 0; + + heredelim = 0; +--- 3209,3213 ---- + + start_lineno = line_number; +! lex_rwlen = lex_wlen = 0; + + heredelim = 0; +*************** +*** 3268,3271 **** +--- 3276,3319 ---- + } + ++ if (tflags & LEX_PASSNEXT) /* last char was backslash */ ++ { ++ /*itrace("parse_comsub:%d: lex_passnext -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/ ++ tflags &= ~LEX_PASSNEXT; ++ if (qc != '\'' && ch == '\n') /* double-quoted \ disappears. */ ++ { ++ if (retind > 0) ++ retind--; /* swallow previously-added backslash */ ++ continue; ++ } ++ ++ RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); ++ if MBTEST(ch == CTLESC || ch == CTLNUL) ++ ret[retind++] = CTLESC; ++ ret[retind++] = ch; ++ continue; ++ } ++ ++ /* If this is a shell break character, we are not in a word. If not, ++ we either start or continue a word. */ ++ if MBTEST(shellbreak (ch)) ++ { ++ tflags &= ~LEX_INWORD; ++ /*itrace("parse_comsub:%d: lex_inword -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/ ++ } ++ else ++ { ++ if (tflags & LEX_INWORD) ++ { ++ lex_wlen++; ++ /*itrace("parse_comsub:%d: lex_inword == 1 ch = `%c' lex_wlen = %d (%d)", line_number, ch, lex_wlen, __LINE__);*/ ++ } ++ else ++ { ++ /*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/ ++ tflags |= LEX_INWORD; ++ lex_wlen = 0; ++ } ++ } ++ + /* Skip whitespace */ + if MBTEST(shellblank (ch) && lex_rwlen == 0) +*************** +*** 3400,3428 **** + } + else +! ch = peekc; /* fall through and continue XXX - this skips comments if peekc == '#' */ + } +! /* Not exactly right yet, should handle shell metacharacters, too. If +! any changes are made to this test, make analogous changes to subst.c: +! extract_delimited_string(). */ +! else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1]))) + tflags |= LEX_INCOMMENT; + +! if (tflags & LEX_PASSNEXT) /* last char was backslash */ +! { +! tflags &= ~LEX_PASSNEXT; +! if (qc != '\'' && ch == '\n') /* double-quoted \ disappears. */ +! { +! if (retind > 0) +! retind--; /* swallow previously-added backslash */ +! continue; +! } +! +! RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); +! if MBTEST(ch == CTLESC || ch == CTLNUL) +! ret[retind++] = CTLESC; +! ret[retind++] = ch; +! continue; +! } +! else if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */ + { + RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); +--- 3442,3454 ---- + } + else +! ch = peekc; /* fall through and continue XXX */ + } +! else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0))) +! { +! /*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/ + tflags |= LEX_INCOMMENT; ++ } + +! if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */ + { + RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-002 b/bash40-002 new file mode 100644 index 0000000..18bd25e --- /dev/null +++ b/bash40-002 @@ -0,0 +1,43 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-002 + +Bug-Reported-by: phil@Arcturus.universe +Bug-Reference-ID: <20090221143709.13878.qmail@Arcturus.universe> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00142.html + +Bug-Description: + +A line inadvertenly omitted from a submitted patch results in core dumps +when attempting filename completion while using the bash-completion +package. + +Patch: + +*** ../bash-4.0/pcomplete.c 2009-02-01 17:12:31.000000000 -0500 +--- pcomplete.c 2009-02-22 17:08:25.000000000 -0500 +*************** +*** 1033,1036 **** +--- 1033,1037 ---- + + pps = &ps; ++ save_parser_state (pps); + begin_unwind_frame ("gen-shell-function-matches"); + add_unwind_protect (restore_parser_state, (char *)pps); +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-003 b/bash40-003 new file mode 100644 index 0000000..cc941d5 --- /dev/null +++ b/bash40-003 @@ -0,0 +1,70 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-003 + +Bug-Reported-by: Bernd Eggink +Bug-Reference-ID: <49A323F5.60503@sudrala.de> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00177.html + +Bug-Description: + +Under certain circumstances, constructs containing command substitutions +prevent PS1 from being re-evaluated and updated before being displayed. + +Patch: + +*** ../bash-4.0/parse.y 2009-01-08 08:29:12.000000000 -0500 +--- parse.y 2009-02-25 15:58:25.000000000 -0500 +*************** +*** 1616,1623 **** + int *ret; + +! ret = (int *)xmalloc (3 * sizeof (int)); + ret[0] = last_read_token; + ret[1] = token_before_that; + ret[2] = two_tokens_ago; + return ret; + } +--- 1616,1624 ---- + int *ret; + +! ret = (int *)xmalloc (4 * sizeof (int)); + ret[0] = last_read_token; + ret[1] = token_before_that; + ret[2] = two_tokens_ago; ++ ret[3] = current_token; + return ret; + } +*************** +*** 1632,1635 **** +--- 1633,1637 ---- + token_before_that = ts[1]; + two_tokens_ago = ts[2]; ++ current_token = ts[3]; + } + +*************** +*** 2669,2672 **** +--- 2671,2675 ---- + word_desc_to_read = (WORD_DESC *)NULL; + ++ current_token = '\n'; /* XXX */ + last_read_token = '\n'; + token_to_read = '\n'; +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-004 b/bash40-004 new file mode 100644 index 0000000..6ab6c4e --- /dev/null +++ b/bash40-004 @@ -0,0 +1,47 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-004 + +Bug-Reported-by: Mike Frysinger +Bug-Reference-ID: <200902231720.30519.vapier@gentoo.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00176.html + +Bug-Description: + +In some cases, enabling the `checkjobs' shell option will cause the shell +to core dump when executing the `exit' builtin. + +Patch: + +*** ../bash-4.0/builtins/exit.def 2009-01-04 14:32:22.000000000 -0500 +--- builtins/exit.def 2009-02-23 22:56:58.000000000 -0500 +*************** +*** 114,118 **** + if (jobs[i] && STOPPED (i)) + stopmsg = JSTOPPED; +! else if (check_jobs_at_exit && stopmsg == 0 && RUNNING (i)) + stopmsg = JRUNNING; + +--- 114,118 ---- + if (jobs[i] && STOPPED (i)) + stopmsg = JSTOPPED; +! else if (check_jobs_at_exit && stopmsg == 0 && jobs[i] && RUNNING (i)) + stopmsg = JRUNNING; + +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-005 b/bash40-005 new file mode 100644 index 0000000..ccfde66 --- /dev/null +++ b/bash40-005 @@ -0,0 +1,63 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-005 + +Bug-Reported-by: Pierre Gaston +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00206.html + +Bug-Description: + +The `declare' builtin dumped core when attempting to assign associative +array indices containing some special characters, even when they were +quoted before being expanded. + +Patch: + +*** ../bash-4.0/builtins/declare.def 2009-01-04 14:32:22.000000000 -0500 +--- builtins/declare.def 2009-02-26 11:40:16.000000000 -0500 +*************** +*** 296,299 **** +--- 296,306 ---- + if (t = strchr (name, '[')) /* ] */ + { ++ /* If offset != 0 we have already validated any array reference */ ++ if (offset == 0 && valid_array_reference (name) == 0) ++ { ++ sh_invalidid (name); ++ assign_error++; ++ NEXT_VARIABLE (); ++ } + subscript_start = t; + *t = '\0'; +*************** +*** 485,489 **** + /* declare -a name[[n]] or declare name[n] makes name an indexed + array variable. */ +! else if ((making_array_special || (flags_on & att_array)) && array_p (var) == 0) + var = convert_var_to_array (var); + #endif /* ARRAY_VARS */ +--- 492,496 ---- + /* declare -a name[[n]] or declare name[n] makes name an indexed + array variable. */ +! else if ((making_array_special || (flags_on & att_array)) && array_p (var) == 0 && assoc_p (var) == 0) + var = convert_var_to_array (var); + #endif /* ARRAY_VARS */ +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-006 b/bash40-006 new file mode 100644 index 0000000..3d044c7 --- /dev/null +++ b/bash40-006 @@ -0,0 +1,43 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-006 + +Bug-Reported-by: Evgeniy Zhemchugov +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00202.html + +Bug-Description: + +Bash did not parse pipelines using the |& construct correctly if the +pipeline elements were not simple commands. + +Patch: + +*** ../bash-4.0/parse.y 2009-01-08 08:29:12.000000000 -0500 +--- parse.y 2009-02-25 17:25:56.000000000 -0500 +*************** +*** 4478,4481 **** +--- 4478,4482 ---- + case AND_AND: + case BANG: ++ case BAR_AND: + case DO: + case DONE: +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-007 b/bash40-007 new file mode 100644 index 0000000..29071e1 --- /dev/null +++ b/bash40-007 @@ -0,0 +1,263 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-007 + +Bug-Reported-by: AnMaster +Bug-Reference-ID: <49A41C18.80807@tele2.se> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00188.html + +Bug-Description: + +Bash had a number of problems parsing associative array subscripts containing +special characters. The subscripts are supposed to be read as if they are +enclosed between double quotes. + +Patch: + +*** ../bash-4.0/parse.y 2009-01-08 08:29:12.000000000 -0500 +--- parse.y 2009-02-25 17:25:56.000000000 -0500 +*************** +*** 2919,2922 **** +--- 2919,2923 ---- + #define P_COMMAND 0x08 /* parsing a command, so look for comments */ + #define P_BACKQUOTE 0x10 /* parsing a backquoted command substitution */ ++ #define P_ARRAYSUB 0x20 /* parsing a [...] array subscript for assignment */ + + /* Lexical state while parsing a grouping construct or $(...). */ +*************** +*** 3134,3137 **** +--- 3134,3139 ---- + FREE (nestret); + } ++ else if ((flags & P_ARRAYSUB) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ ++ goto parse_dollar_word; + } + /* Parse an old-style command substitution within double quotes as a +*************** +*** 3150,3153 **** +--- 3150,3154 ---- + /* check for $(), $[], or ${} inside quoted string. */ + { ++ parse_dollar_word: + if (open == ch) /* undo previous increment */ + count--; +*************** +*** 4277,4281 **** + (token_index == 0 && (parser_state&PST_COMPASSIGN)))) + { +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0); + if (ttok == &matched_pair_error) + return -1; /* Bail immediately. */ +--- 4277,4281 ---- + (token_index == 0 && (parser_state&PST_COMPASSIGN)))) + { +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARRAYSUB); + if (ttok == &matched_pair_error) + return -1; /* Bail immediately. */ +*** ../bash-4.0/arrayfunc.c 2009-01-04 14:32:21.000000000 -0500 +--- arrayfunc.c 2009-02-25 07:58:54.000000000 -0500 +*************** +*** 605,666 **** + } + +! /* This function assumes s[i] == '['; returns with s[ret] == ']' if +! an array subscript is correctly parsed. */ +! int +! skipsubscript (s, i) +! const char *s; +! int i; +! { +! int count, c; +! #if defined (HANDLE_MULTIBYTE) +! mbstate_t state, state_bak; +! size_t slength, mblength; +! #endif +! +! #if defined (HANDLE_MULTIBYTE) +! memset (&state, '\0', sizeof (mbstate_t)); +! slength = strlen (s + i); +! #endif +! +! count = 1; +! while (count) +! { +! /* Advance one (possibly multibyte) character in S starting at I. */ +! #if defined (HANDLE_MULTIBYTE) +! if (MB_CUR_MAX > 1) +! { +! state_bak = state; +! mblength = mbrlen (s + i, slength, &state); +! +! if (MB_INVALIDCH (mblength)) +! { +! state = state_bak; +! i++; +! slength--; +! } +! else if (MB_NULLWCH (mblength)) +! return i; +! else +! { +! i += mblength; +! slength -= mblength; +! } +! } +! else +! #endif +! ++i; +! +! c = s[i]; +! +! if (c == 0) +! break; +! else if (c == '[') +! count++; +! else if (c == ']') +! count--; +! } +! +! return i; +! } + + /* This function is called with SUB pointing to just after the beginning +--- 605,609 ---- + } + +! /* skipsubscript moved to subst.c to use private functions. 2009/02/24. */ + + /* This function is called with SUB pointing to just after the beginning +*** ../bash-4.0/subst.c 2009-01-28 14:34:12.000000000 -0500 +--- subst.c 2009-02-25 09:18:33.000000000 -0500 +*************** +*** 223,226 **** +--- 223,227 ---- + static char *extract_delimited_string __P((char *, int *, char *, char *, char *, int)); + static char *extract_dollar_brace_string __P((char *, int *, int, int)); ++ static int skip_matched_pair __P((const char *, int, int, int, int)); + + static char *pos_params __P((char *, int, int, int)); +*************** +*** 1375,1378 **** +--- 1376,1480 ---- + #define CQ_RETURN(x) do { no_longjmp_on_fatal_error = 0; return (x); } while (0) + ++ /* This function assumes s[i] == open; returns with s[ret] == close; used to ++ parse array subscripts. FLAGS currently unused. */ ++ static int ++ skip_matched_pair (string, start, open, close, flags) ++ const char *string; ++ int start, open, close, flags; ++ { ++ int i, pass_next, backq, si, c, count; ++ size_t slen; ++ char *temp, *ss; ++ DECLARE_MBSTATE; ++ ++ slen = strlen (string + start) + start; ++ no_longjmp_on_fatal_error = 1; ++ ++ i = start + 1; /* skip over leading bracket */ ++ count = 1; ++ pass_next = backq = 0; ++ ss = (char *)string; ++ while (c = string[i]) ++ { ++ if (pass_next) ++ { ++ pass_next = 0; ++ if (c == 0) ++ CQ_RETURN(i); ++ ADVANCE_CHAR (string, slen, i); ++ continue; ++ } ++ else if (c == '\\') ++ { ++ pass_next = 1; ++ i++; ++ continue; ++ } ++ else if (backq) ++ { ++ if (c == '`') ++ backq = 0; ++ ADVANCE_CHAR (string, slen, i); ++ continue; ++ } ++ else if (c == '`') ++ { ++ backq = 1; ++ i++; ++ continue; ++ } ++ else if (c == open) ++ { ++ count++; ++ i++; ++ continue; ++ } ++ else if (c == close) ++ { ++ count--; ++ if (count == 0) ++ break; ++ i++; ++ continue; ++ } ++ else if (c == '\'' || c == '"') ++ { ++ i = (c == '\'') ? skip_single_quoted (ss, slen, ++i) ++ : skip_double_quoted (ss, slen, ++i); ++ /* no increment, the skip functions increment past the closing quote. */ ++ } ++ else if (c == '$' && (string[i+1] == LPAREN || string[i+1] == LBRACE)) ++ { ++ si = i + 2; ++ if (string[si] == '\0') ++ CQ_RETURN(si); ++ ++ if (string[i+1] == LPAREN) ++ temp = extract_delimited_string (ss, &si, "$(", "(", ")", SX_NOALLOC|SX_COMMAND); /* ) */ ++ else ++ temp = extract_dollar_brace_string (ss, &si, 0, SX_NOALLOC); ++ i = si; ++ if (string[i] == '\0') /* don't increment i past EOS in loop */ ++ break; ++ i++; ++ continue; ++ } ++ else ++ ADVANCE_CHAR (string, slen, i); ++ } ++ ++ CQ_RETURN(i); ++ } ++ ++ #if defined (ARRAY_VARS) ++ int ++ skipsubscript (string, start) ++ const char *string; ++ int start; ++ { ++ return (skip_matched_pair (string, start, '[', ']', 0)); ++ } ++ #endif ++ + /* Skip characters in STRING until we find a character in DELIMS, and return + the index of that character. START is the index into string at which we +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-008 b/bash40-008 new file mode 100644 index 0000000..7a2576a --- /dev/null +++ b/bash40-008 @@ -0,0 +1,49 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-008 + +Bug-Reported-by: Mike Frysinger +Bug-Reference-ID: <200902261030.54062.vapier@gentoo.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00230.html + +Bug-Description: + +Patch: + +*** ../bash-4.0/parse.y 2009-01-08 08:29:12.000000000 -0500 +--- parse.y 2009-02-26 17:22:15.000000000 -0500 +*************** +*** 3443,3448 **** + else + shell_ungetc (peekc); +! tflags |= LEX_HEREDELIM; +! lex_firstind = -1; + continue; + } +--- 3443,3451 ---- + else + shell_ungetc (peekc); +! if (peekc != '<') +! { +! tflags |= LEX_HEREDELIM; +! lex_firstind = -1; +! } + continue; + } +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-009 b/bash40-009 new file mode 100644 index 0000000..f583919 --- /dev/null +++ b/bash40-009 @@ -0,0 +1,61 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-009 + +Bug-Reported-by: "Chris F.A. Johnson" +Bug-Reference-ID: <4d6b7$49a88cec$cef88ba3$16813@TEKSAVVY.COM> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00255.html + +Bug-Description: + +When the read builtin returned due to a timeout supplied with the -t option, +it did not restore any modified terminal attribtues. + +Patch: + +*** ../bash-4.0/builtins/read.def 2009-01-15 23:11:21.000000000 -0500 +--- builtins/read.def 2009-03-02 10:15:39.000000000 -0500 +*************** +*** 370,381 **** + if (code) + { +! #if 0 + run_unwind_frame ("read_builtin"); +- return (EXECUTION_FAILURE); +- #else + input_string[i] = '\0'; /* make sure it's terminated */ +! retval = 128+SIGALRM;; + goto assign_vars; +- #endif + } + old_alrm = set_signal_handler (SIGALRM, sigalrm); +--- 370,381 ---- + if (code) + { +! /* Tricky. The top of the unwind-protect stack is the free of +! input_string. We want to run all the rest and use input_string, +! so we have to remove it from the stack. */ +! remove_unwind_protect (); + run_unwind_frame ("read_builtin"); + input_string[i] = '\0'; /* make sure it's terminated */ +! retval = 128+SIGALRM; + goto assign_vars; + } + old_alrm = set_signal_handler (SIGALRM, sigalrm); +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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/bash40-010 b/bash40-010 new file mode 100644 index 0000000..3229c57 --- /dev/null +++ b/bash40-010 @@ -0,0 +1,63 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-010 + +Bug-Reported-by: Mike Frysinger +Bug-Reference-ID: <200903030122.56206.vapier@gentoo.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00023.html + +Bug-Description: + +Bash has problems parsing comments in case statements when they appear in +$(...) subshells. + +Patch: + +*** ../bash-4.0/parse.y 2009-03-07 15:18:35.000000000 -0500 +--- parse.y 2009-03-07 14:16:32.000000000 -0500 +*************** +*** 3413,3419 **** + tflags &= ~LEX_RESWDOK; + } +! else if (shellbreak (ch) == 0) + { +! tflags &= ~LEX_RESWDOK; + /*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/ + } +--- 3415,3433 ---- + tflags &= ~LEX_RESWDOK; + } +! else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0))) +! ; /* don't modify LEX_RESWDOK if we're starting a comment */ +! else if MBTEST((tflags & LEX_INCASE) && ch != '\n') +! /* If we can read a reserved word and we're in case, we're at the +! point where we can read a new pattern list or an esac. We +! handle the esac case above. If we read a newline, we want to +! leave LEX_RESWDOK alone. If we read anything else, we want to +! turn off LEX_RESWDOK, since we're going to read a pattern list. */ + { +! tflags &= ~LEX_RESWDOK; +! /*itrace("parse_comsub:%d: lex_incase == 1 found `%c', lex_reswordok -> 0", line_number, ch);*/ +! } +! else if MBTEST(shellbreak (ch) == 0) +! { +! tflags &= ~LEX_RESWDOK; + /*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/ + } +*** ../bash-4.0/patchlevel.h 2009-01-04 14:32:40.000000000 -0500 +--- patchlevel.h 2009-02-22 16:11:31.000000000 -0500 +*************** +*** 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_ */