123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- BASH PATCH REPORT
- =================
- Bash-Release: 3.2
- Patch-ID: bash32-003
- Bug-Reported-by: John Gatewood Ham <zappaman@buraphalinux.org>
- Bug-Reference-ID: <Pine.LNX.4.64.0610121334140.15558@www.buraphalinux.org>
- Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00045.html
- Bug-Description:
- When using the conditional command's `=~' operator to match regular
- expressions, the parser did not skip over shell metacharacters in the
- regular expression, leading to syntax errors.
- Patch:
- *** bash-3.2-patched/parse.y Tue Oct 17 11:45:20 2006
- --- bash-3.2/parse.y Sat Oct 14 14:56:16 2006
- ***************
- *** 1029,1034 ****
- --- 1029,1035 ----
- #define PST_CMDTOKEN 0x1000 /* command token OK - unused */
- #define PST_COMPASSIGN 0x2000 /* parsing x=(...) compound assignment */
- #define PST_ASSIGNOK 0x4000 /* assignment statement ok in this context */
- + #define PST_REGEXP 0x8000 /* parsing an ERE/BRE as a single word */
-
- /* Initial size to allocate for tokens, and the
- amount to grow them by. */
- ***************
- *** 2591,2596 ****
- --- 2592,2600 ----
- return (character);
- }
-
- + if (parser_state & PST_REGEXP)
- + goto tokword;
- +
- /* Shell meta-characters. */
- if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0))
- {
- ***************
- *** 2698,2703 ****
- --- 2702,2708 ----
- if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
- return (character);
-
- + tokword:
- /* Okay, if we got this far, we have to read a word. Read one,
- and then check it against the known ones. */
- result = read_token_word (character);
- ***************
- *** 3202,3209 ****
- if (tok == WORD && test_binop (yylval.word->word))
- op = yylval.word;
- #if defined (COND_REGEXP)
- ! else if (tok == WORD && STREQ (yylval.word->word,"=~"))
- ! op = yylval.word;
- #endif
- else if (tok == '<' || tok == '>')
- op = make_word_from_token (tok); /* ( */
- --- 3207,3217 ----
- if (tok == WORD && test_binop (yylval.word->word))
- op = yylval.word;
- #if defined (COND_REGEXP)
- ! else if (tok == WORD && STREQ (yylval.word->word, "=~"))
- ! {
- ! op = yylval.word;
- ! parser_state |= PST_REGEXP;
- ! }
- #endif
- else if (tok == '<' || tok == '>')
- op = make_word_from_token (tok); /* ( */
- ***************
- *** 3234,3239 ****
- --- 3242,3248 ----
-
- /* rhs */
- tok = read_token (READ);
- + parser_state &= ~PST_REGEXP;
- if (tok == WORD)
- {
- tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
- ***************
- *** 3419,3427 ****
- goto next_character;
- }
-
- #ifdef EXTENDED_GLOB
- /* Parse a ksh-style extended pattern matching specification. */
- ! if (extended_glob && PATTERN_CHAR (character))
- {
- peek_char = shell_getc (1);
- if MBTEST(peek_char == '(') /* ) */
- --- 3428,3461 ----
- goto next_character;
- }
-
- + #ifdef COND_REGEXP
- + /* When parsing a regexp as a single word inside a conditional command,
- + we need to special-case characters special to both the shell and
- + regular expressions. Right now, that is only '(' and '|'. */ /*)*/
- + if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|')) /*)*/
- + {
- + if (character == '|')
- + goto got_character;
- +
- + push_delimiter (dstack, character);
- + ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
- + pop_delimiter (dstack);
- + if (ttok == &matched_pair_error)
- + return -1; /* Bail immediately. */
- + RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
- + token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
- + token[token_index++] = character;
- + strcpy (token + token_index, ttok);
- + token_index += ttoklen;
- + FREE (ttok);
- + dollar_present = all_digit_token = 0;
- + goto next_character;
- + }
- + #endif /* COND_REGEXP */
- +
- #ifdef EXTENDED_GLOB
- /* Parse a ksh-style extended pattern matching specification. */
- ! if MBTEST(extended_glob && PATTERN_CHAR (character))
- {
- peek_char = shell_getc (1);
- if MBTEST(peek_char == '(') /* ) */
- *** bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006
- --- bash-3.2/patchlevel.h Mon Oct 16 14:22:54 2006
- ***************
- *** 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_ */
|