svashisht / rpms / bash

Forked from rpms/bash 6 years ago
Clone
Roman Rakus 1680d49
			     BASH PATCH REPORT
Roman Rakus 1680d49
			     =================
Roman Rakus 1680d49
Roman Rakus 1680d49
Bash-Release:	4.2
Roman Rakus 1680d49
Patch-ID:	bash42-003
Roman Rakus 1680d49
Roman Rakus 1680d49
Bug-Reported-by:	Clark J. Wang <dearvoid@gmail.com>
Roman Rakus 1680d49
Bug-Reference-ID:	<AANLkTikZ_rVV-frR8Fh0PzhXnMKnm5XsUR-F3qtPPs5G@mail.gmail.com>
Roman Rakus 1680d49
Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00136.html
Roman Rakus 1680d49
Roman Rakus 1680d49
Bug-Description:
Roman Rakus 1680d49
Roman Rakus 1680d49
When using the pattern replacement and pattern removal word expansions, bash
Roman Rakus 1680d49
miscalculates the possible match length in the presence of an unescaped left
Roman Rakus 1680d49
bracket without a closing right bracket, resulting in a failure to match
Roman Rakus 1680d49
the pattern.
Roman Rakus 1680d49
Roman Rakus 1680d49
Patch (apply with `patch -p0'):
Roman Rakus 1680d49
Roman Rakus 1680d49
*** ../bash-4.2-patched/lib/glob/gmisc.c	2011-02-05 16:11:17.000000000 -0500
Roman Rakus 1680d49
--- lib/glob/gmisc.c	2011-02-18 23:53:42.000000000 -0500
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 78,83 ****
Roman Rakus 1680d49
       size_t wmax;
Roman Rakus 1680d49
  {
Roman Rakus 1680d49
!   wchar_t wc, *wbrack;
Roman Rakus 1680d49
!   int matlen, t, in_cclass, in_collsym, in_equiv;
Roman Rakus 1680d49
  
Roman Rakus 1680d49
    if (*wpat == 0)
Roman Rakus 1680d49
--- 78,83 ----
Roman Rakus 1680d49
       size_t wmax;
Roman Rakus 1680d49
  {
Roman Rakus 1680d49
!   wchar_t wc;
Roman Rakus 1680d49
!   int matlen, bracklen, t, in_cclass, in_collsym, in_equiv;
Roman Rakus 1680d49
  
Roman Rakus 1680d49
    if (*wpat == 0)
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 119,123 ****
Roman Rakus 1680d49
  	case L'[':
Roman Rakus 1680d49
  	  /* scan for ending `]', skipping over embedded [:...:] */
Roman Rakus 1680d49
! 	  wbrack = wpat;
Roman Rakus 1680d49
  	  wc = *wpat++;
Roman Rakus 1680d49
  	  do
Roman Rakus 1680d49
--- 119,123 ----
Roman Rakus 1680d49
  	case L'[':
Roman Rakus 1680d49
  	  /* scan for ending `]', skipping over embedded [:...:] */
Roman Rakus 1680d49
! 	  bracklen = 1;
Roman Rakus 1680d49
  	  wc = *wpat++;
Roman Rakus 1680d49
  	  do
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 125,140 ****
Roman Rakus 1680d49
  	      if (wc == 0)
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
! 	          matlen += wpat - wbrack - 1;	/* incremented below */
Roman Rakus 1680d49
! 	          break;
Roman Rakus 1680d49
  	        }
Roman Rakus 1680d49
  	      else if (wc == L'\\')
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
! 		  wc = *wpat++;
Roman Rakus 1680d49
! 		  if (*wpat == 0)
Roman Rakus 1680d49
! 		    break;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
  	      else if (wc == L'[' && *wpat == L':')	/* character class */
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
  		  in_cclass = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
--- 125,148 ----
Roman Rakus 1680d49
  	      if (wc == 0)
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
! 		  wpat--;			/* back up to NUL */
Roman Rakus 1680d49
! 	          matlen += bracklen;
Roman Rakus 1680d49
! 	          goto bad_bracket;
Roman Rakus 1680d49
  	        }
Roman Rakus 1680d49
  	      else if (wc == L'\\')
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
! 		  /* *wpat == backslash-escaped character */
Roman Rakus 1680d49
! 		  bracklen++;
Roman Rakus 1680d49
! 		  /* If the backslash or backslash-escape ends the string,
Roman Rakus 1680d49
! 		     bail.  The ++wpat skips over the backslash escape */
Roman Rakus 1680d49
! 		  if (*wpat == 0 || *++wpat == 0)
Roman Rakus 1680d49
! 		    {
Roman Rakus 1680d49
! 		      matlen += bracklen;
Roman Rakus 1680d49
! 		      goto bad_bracket;
Roman Rakus 1680d49
! 		    }
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
  	      else if (wc == L'[' && *wpat == L':')	/* character class */
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  in_cclass = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 142,145 ****
Roman Rakus 1680d49
--- 150,154 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  in_cclass = 0;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 147,152 ****
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
  		  if (*wpat == L']')	/* right bracket can appear as collating symbol */
Roman Rakus 1680d49
! 		    wpat++;
Roman Rakus 1680d49
  		  in_collsym = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
--- 156,165 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  if (*wpat == L']')	/* right bracket can appear as collating symbol */
Roman Rakus 1680d49
! 		    {
Roman Rakus 1680d49
! 		      wpat++;
Roman Rakus 1680d49
! 		      bracklen++;
Roman Rakus 1680d49
! 		    }
Roman Rakus 1680d49
  		  in_collsym = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 154,157 ****
Roman Rakus 1680d49
--- 167,171 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  in_collsym = 0;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 159,164 ****
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
  		  if (*wpat == L']')	/* right bracket can appear as equivalence class */
Roman Rakus 1680d49
! 		    wpat++;
Roman Rakus 1680d49
  		  in_equiv = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
--- 173,182 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  if (*wpat == L']')	/* right bracket can appear as equivalence class */
Roman Rakus 1680d49
! 		    {
Roman Rakus 1680d49
! 		      wpat++;
Roman Rakus 1680d49
! 		      bracklen++;
Roman Rakus 1680d49
! 		    }
Roman Rakus 1680d49
  		  in_equiv = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 166,174 ****
Roman Rakus 1680d49
--- 184,196 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  wpat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  in_equiv = 0;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
+ 	      else
Roman Rakus 1680d49
+ 		bracklen++;
Roman Rakus 1680d49
  	    }
Roman Rakus 1680d49
  	  while ((wc = *wpat++) != L']');
Roman Rakus 1680d49
  	  matlen++;		/* bracket expression can only match one char */
Roman Rakus 1680d49
+ bad_bracket:
Roman Rakus 1680d49
  	  break;
Roman Rakus 1680d49
  	}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 214,219 ****
Roman Rakus 1680d49
       size_t max;
Roman Rakus 1680d49
  {
Roman Rakus 1680d49
!   char c, *brack;
Roman Rakus 1680d49
!   int matlen, t, in_cclass, in_collsym, in_equiv;
Roman Rakus 1680d49
  
Roman Rakus 1680d49
    if (*pat == 0)
Roman Rakus 1680d49
--- 236,241 ----
Roman Rakus 1680d49
       size_t max;
Roman Rakus 1680d49
  {
Roman Rakus 1680d49
!   char c;
Roman Rakus 1680d49
!   int matlen, bracklen, t, in_cclass, in_collsym, in_equiv;
Roman Rakus 1680d49
  
Roman Rakus 1680d49
    if (*pat == 0)
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 255,259 ****
Roman Rakus 1680d49
  	case '[':
Roman Rakus 1680d49
  	  /* scan for ending `]', skipping over embedded [:...:] */
Roman Rakus 1680d49
! 	  brack = pat;
Roman Rakus 1680d49
  	  c = *pat++;
Roman Rakus 1680d49
  	  do
Roman Rakus 1680d49
--- 277,281 ----
Roman Rakus 1680d49
  	case '[':
Roman Rakus 1680d49
  	  /* scan for ending `]', skipping over embedded [:...:] */
Roman Rakus 1680d49
! 	  bracklen = 1;
Roman Rakus 1680d49
  	  c = *pat++;
Roman Rakus 1680d49
  	  do
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 261,276 ****
Roman Rakus 1680d49
  	      if (c == 0)
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
! 	          matlen += pat - brack - 1;	/* incremented below */
Roman Rakus 1680d49
! 	          break;
Roman Rakus 1680d49
  	        }
Roman Rakus 1680d49
  	      else if (c == '\\')
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
! 		  c = *pat++;
Roman Rakus 1680d49
! 		  if (*pat == 0)
Roman Rakus 1680d49
! 		    break;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
  	      else if (c == '[' && *pat == ':')	/* character class */
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
  		  in_cclass = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
--- 283,306 ----
Roman Rakus 1680d49
  	      if (c == 0)
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
! 		  pat--;			/* back up to NUL */
Roman Rakus 1680d49
! 		  matlen += bracklen;
Roman Rakus 1680d49
! 		  goto bad_bracket;
Roman Rakus 1680d49
  	        }
Roman Rakus 1680d49
  	      else if (c == '\\')
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
! 		  /* *pat == backslash-escaped character */
Roman Rakus 1680d49
! 		  bracklen++;
Roman Rakus 1680d49
! 		  /* If the backslash or backslash-escape ends the string,
Roman Rakus 1680d49
! 		     bail.  The ++pat skips over the backslash escape */
Roman Rakus 1680d49
! 		  if (*pat == 0 || *++pat == 0)
Roman Rakus 1680d49
! 		    {
Roman Rakus 1680d49
! 		      matlen += bracklen;
Roman Rakus 1680d49
! 		      goto bad_bracket;
Roman Rakus 1680d49
! 		    }
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
  	      else if (c == '[' && *pat == ':')	/* character class */
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  in_cclass = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 278,281 ****
Roman Rakus 1680d49
--- 308,312 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  in_cclass = 0;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 283,288 ****
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
  		  if (*pat == ']')	/* right bracket can appear as collating symbol */
Roman Rakus 1680d49
! 		    pat++;
Roman Rakus 1680d49
  		  in_collsym = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
--- 314,323 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  if (*pat == ']')	/* right bracket can appear as collating symbol */
Roman Rakus 1680d49
! 		    {
Roman Rakus 1680d49
! 		      pat++;
Roman Rakus 1680d49
! 		      bracklen++;
Roman Rakus 1680d49
! 		    }
Roman Rakus 1680d49
  		  in_collsym = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 290,293 ****
Roman Rakus 1680d49
--- 325,329 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  in_collsym = 0;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 295,300 ****
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
  		  if (*pat == ']')	/* right bracket can appear as equivalence class */
Roman Rakus 1680d49
! 		    pat++;
Roman Rakus 1680d49
  		  in_equiv = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
--- 331,340 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  if (*pat == ']')	/* right bracket can appear as equivalence class */
Roman Rakus 1680d49
! 		    {
Roman Rakus 1680d49
! 		      pat++;
Roman Rakus 1680d49
! 		      bracklen++;
Roman Rakus 1680d49
! 		    }
Roman Rakus 1680d49
  		  in_equiv = 1;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 302,310 ****
Roman Rakus 1680d49
--- 342,354 ----
Roman Rakus 1680d49
  		{
Roman Rakus 1680d49
  		  pat++;
Roman Rakus 1680d49
+ 		  bracklen++;
Roman Rakus 1680d49
  		  in_equiv = 0;
Roman Rakus 1680d49
  		}
Roman Rakus 1680d49
+ 	      else
Roman Rakus 1680d49
+ 		bracklen++;
Roman Rakus 1680d49
  	    }
Roman Rakus 1680d49
  	  while ((c = *pat++) != ']');
Roman Rakus 1680d49
  	  matlen++;		/* bracket expression can only match one char */
Roman Rakus 1680d49
+ bad_bracket:
Roman Rakus 1680d49
  	  break;
Roman Rakus 1680d49
  	}
Roman Rakus 1680d49
*** ../bash-4.2-patched/patchlevel.h	Sat Jun 12 20:14:48 2010
Roman Rakus 1680d49
--- patchlevel.h	Thu Feb 24 21:41:34 2011
Roman Rakus 1680d49
***************
Roman Rakus 1680d49
*** 26,30 ****
Roman Rakus 1680d49
     looks for to find the patch level (for the sccs version string). */
Roman Rakus 1680d49
  
Roman Rakus 1680d49
! #define PATCHLEVEL 2
Roman Rakus 1680d49
  
Roman Rakus 1680d49
  #endif /* _PATCHLEVEL_H_ */
Roman Rakus 1680d49
--- 26,30 ----
Roman Rakus 1680d49
     looks for to find the patch level (for the sccs version string). */
Roman Rakus 1680d49
  
Roman Rakus 1680d49
! #define PATCHLEVEL 3
Roman Rakus 1680d49
  
Roman Rakus 1680d49
  #endif /* _PATCHLEVEL_H_ */