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