diff options
author | Patrick J Volkerding <volkerdi@slackware.com> | 2009-08-26 10:00:38 -0500 |
---|---|---|
committer | Eric Hameleers <alien@slackware.com> | 2018-05-31 22:41:17 +0200 |
commit | 5a12e7c134274dba706667107d10d231517d3e05 (patch) | |
tree | 55718d5acb710fde798d9f38d0bbaf594ed4b296 /testing/source/bash/bash-4.0-patches/bash40-007 | |
download | current-5a12e7c134274dba706667107d10d231517d3e05.tar.gz current-5a12e7c134274dba706667107d10d231517d3e05.tar.xz |
Slackware 13.0slackware-13.0
Wed Aug 26 10:00:38 CDT 2009
Slackware 13.0 x86_64 is released as stable! Thanks to everyone who
helped make this release possible -- see the RELEASE_NOTES for the
credits. The ISOs are off to the replicator. This time it will be a
6 CD-ROM 32-bit set and a dual-sided 32-bit/64-bit x86/x86_64 DVD.
We're taking pre-orders now at store.slackware.com. Please consider
picking up a copy to help support the project. Once again, thanks to
the entire Slackware community for all the help testing and fixing
things and offering suggestions during this development cycle.
As always, have fun and enjoy! -P.
Diffstat (limited to 'testing/source/bash/bash-4.0-patches/bash40-007')
-rw-r--r-- | testing/source/bash/bash-4.0-patches/bash40-007 | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/testing/source/bash/bash-4.0-patches/bash40-007 b/testing/source/bash/bash-4.0-patches/bash40-007 new file mode 100644 index 000000000..29071e129 --- /dev/null +++ b/testing/source/bash/bash-4.0-patches/bash40-007 @@ -0,0 +1,263 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.0 +Patch-ID: bash40-007 + +Bug-Reported-by: AnMaster <anmaster@tele2.se> +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_ */ |