208 lines
6.2 KiB
Plaintext
208 lines
6.2 KiB
Plaintext
BASH PATCH REPORT
|
|
=================
|
|
|
|
Bash-Release: 3.2
|
|
Patch-ID: bash32-010
|
|
|
|
Bug-Reported-by: Ryan Waldron <rew@erebor.com>
|
|
Bug-Reference-ID: <20070119065603.546D011E9C@kansas.erebor.com>
|
|
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-01/msg00059.html
|
|
|
|
Bug-Description:
|
|
|
|
The glibc implementation of regcomp/regexec does not allow backslashes to
|
|
escape "ordinary" pattern characters when matching. Bash used backslashes
|
|
to quote all characters when the pattern argument to the [[ special
|
|
command's =~ operator was quoted. This caused the match to fail on Linux
|
|
and other systems using GNU libc.
|
|
|
|
Patch:
|
|
|
|
*** ../bash-3.2.9/pathexp.h Sat Feb 19 17:23:18 2005
|
|
--- bash-3.2/pathexp.h Wed Jan 31 22:53:16 2007
|
|
***************
|
|
*** 1,5 ****
|
|
/* pathexp.h -- The shell interface to the globbing library. */
|
|
|
|
! /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Bash, the Bourne Again SHell.
|
|
--- 1,5 ----
|
|
/* pathexp.h -- The shell interface to the globbing library. */
|
|
|
|
! /* Copyright (C) 1987-2007 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Bash, the Bourne Again SHell.
|
|
***************
|
|
*** 33,36 ****
|
|
--- 33,37 ----
|
|
#define QGLOB_CVTNULL 0x01 /* convert QUOTED_NULL strings to '\0' */
|
|
#define QGLOB_FILENAME 0x02 /* do correct quoting for matching filenames */
|
|
+ #define QGLOB_REGEXP 0x04 /* quote an ERE for regcomp/regexec */
|
|
|
|
#if defined (EXTENDED_GLOB)
|
|
*** ../bash-3.2.9/pathexp.c Mon May 6 13:43:05 2002
|
|
--- bash-3.2/pathexp.c Mon Feb 26 16:59:23 2007
|
|
***************
|
|
*** 1,5 ****
|
|
/* pathexp.c -- The shell interface to the globbing library. */
|
|
|
|
! /* Copyright (C) 1995-2002 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Bash, the Bourne Again SHell.
|
|
--- 1,5 ----
|
|
/* pathexp.c -- The shell interface to the globbing library. */
|
|
|
|
! /* Copyright (C) 1995-2007 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Bash, the Bourne Again SHell.
|
|
***************
|
|
*** 111,114 ****
|
|
--- 111,141 ----
|
|
}
|
|
|
|
+ /* Return 1 if C is a character that is `special' in a POSIX ERE and needs to
|
|
+ be quoted to match itself. */
|
|
+ static inline int
|
|
+ ere_char (c)
|
|
+ int c;
|
|
+ {
|
|
+ switch (c)
|
|
+ {
|
|
+ case '.':
|
|
+ case '[':
|
|
+ case '\\':
|
|
+ case '(':
|
|
+ case ')':
|
|
+ case '*':
|
|
+ case '+':
|
|
+ case '?':
|
|
+ case '{':
|
|
+ case '|':
|
|
+ case '^':
|
|
+ case '$':
|
|
+ return 1;
|
|
+ default:
|
|
+ return 0;
|
|
+ }
|
|
+ return (0);
|
|
+ }
|
|
+
|
|
/* PATHNAME can contain characters prefixed by CTLESC; this indicates
|
|
that the character is to be quoted. We quote it here in the style
|
|
***************
|
|
*** 143,146 ****
|
|
--- 170,175 ----
|
|
if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/')
|
|
continue;
|
|
+ if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0)
|
|
+ continue;
|
|
temp[j++] = '\\';
|
|
i++;
|
|
*** ../bash-3.2.9/subst.c Tue Nov 7 16:14:41 2006
|
|
--- bash-3.2/subst.c Wed Jan 31 23:09:58 2007
|
|
***************
|
|
*** 5,9 ****
|
|
beauty, but, hey, you're alright.'' */
|
|
|
|
! /* Copyright (C) 1987-2006 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Bash, the Bourne Again SHell.
|
|
--- 5,9 ----
|
|
beauty, but, hey, you're alright.'' */
|
|
|
|
! /* Copyright (C) 1987-2007 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Bash, the Bourne Again SHell.
|
|
***************
|
|
*** 2647,2655 ****
|
|
/* This needs better error handling. */
|
|
/* Expand W for use as an argument to a unary or binary operator in a
|
|
! [[...]] expression. If SPECIAL is nonzero, this is the rhs argument
|
|
to the != or == operator, and should be treated as a pattern. In
|
|
! this case, we quote the string specially for the globbing code. The
|
|
! caller is responsible for removing the backslashes if the unquoted
|
|
! words is needed later. */
|
|
char *
|
|
cond_expand_word (w, special)
|
|
--- 2647,2656 ----
|
|
/* This needs better error handling. */
|
|
/* Expand W for use as an argument to a unary or binary operator in a
|
|
! [[...]] expression. If SPECIAL is 1, this is the rhs argument
|
|
to the != or == operator, and should be treated as a pattern. In
|
|
! this case, we quote the string specially for the globbing code. If
|
|
! SPECIAL is 2, this is an rhs argument for the =~ operator, and should
|
|
! be quoted appropriately for regcomp/regexec. The caller is responsible
|
|
! for removing the backslashes if the unquoted word is needed later. */
|
|
char *
|
|
cond_expand_word (w, special)
|
|
***************
|
|
*** 2659,2662 ****
|
|
--- 2660,2664 ----
|
|
char *r, *p;
|
|
WORD_LIST *l;
|
|
+ int qflags;
|
|
|
|
if (w->word == 0 || w->word[0] == '\0')
|
|
***************
|
|
*** 2673,2678 ****
|
|
else
|
|
{
|
|
p = string_list (l);
|
|
! r = quote_string_for_globbing (p, QGLOB_CVTNULL);
|
|
free (p);
|
|
}
|
|
--- 2675,2683 ----
|
|
else
|
|
{
|
|
+ qflags = QGLOB_CVTNULL;
|
|
+ if (special == 2)
|
|
+ qflags |= QGLOB_REGEXP;
|
|
p = string_list (l);
|
|
! r = quote_string_for_globbing (p, qflags);
|
|
free (p);
|
|
}
|
|
*** ../bash-3.2.9/execute_cmd.c Sat Aug 26 00:23:17 2006
|
|
--- bash-3.2/execute_cmd.c Wed Jan 31 23:12:06 2007
|
|
***************
|
|
*** 1,5 ****
|
|
/* execute_cmd.c -- Execute a COMMAND structure. */
|
|
|
|
! /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Bash, the Bourne Again SHell.
|
|
--- 1,5 ----
|
|
/* execute_cmd.c -- Execute a COMMAND structure. */
|
|
|
|
! /* Copyright (C) 1987-2007 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Bash, the Bourne Again SHell.
|
|
***************
|
|
*** 2547,2551 ****
|
|
if (arg1 == 0)
|
|
arg1 = nullstr;
|
|
! arg2 = cond_expand_word (cond->right->op, patmatch||rmatch);
|
|
if (arg2 == 0)
|
|
arg2 = nullstr;
|
|
--- 2547,2551 ----
|
|
if (arg1 == 0)
|
|
arg1 = nullstr;
|
|
! arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0));
|
|
if (arg2 == 0)
|
|
arg2 = nullstr;
|
|
*** ../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 9
|
|
|
|
#endif /* _PATCHLEVEL_H_ */
|
|
--- 26,30 ----
|
|
looks for to find the patch level (for the sccs version string). */
|
|
|
|
! #define PATCHLEVEL 10
|
|
|
|
#endif /* _PATCHLEVEL_H_ */
|