summaryrefslogtreecommitdiffstats
path: root/testing/source/bash/bash-4.0-patches/bash40-007
diff options
context:
space:
mode:
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
commit5a12e7c134274dba706667107d10d231517d3e05 (patch)
tree55718d5acb710fde798d9f38d0bbaf594ed4b296 /testing/source/bash/bash-4.0-patches/bash40-007
downloadcurrent-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-007263
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_ */