Ondrej Oprala 6f2bbd
			     BASH PATCH REPORT
Ondrej Oprala 6f2bbd
			     =================
Ondrej Oprala 6f2bbd
Ondrej Oprala 6f2bbd
Bash-Release:	4.3
Ondrej Oprala 6f2bbd
Patch-ID:	bash43-008
Ondrej Oprala 6f2bbd
Ondrej Oprala 6f2bbd
Bug-Reported-by:	Stephane Chazelas <stephane.chazelas@gmail.com>
Ondrej Oprala 6f2bbd
Bug-Reference-ID:	<20140318135901.GB22158@chaz.gmail.com>
Ondrej Oprala 6f2bbd
Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00098.html
Ondrej Oprala 6f2bbd
Ondrej Oprala 6f2bbd
Bug-Description:
Ondrej Oprala 6f2bbd
Ondrej Oprala 6f2bbd
Some extended glob patterns incorrectly matched filenames with a leading
Ondrej Oprala 6f2bbd
dot, regardless of the setting of the `dotglob' option.
Ondrej Oprala 6f2bbd
Ondrej Oprala 6f2bbd
Patch (apply with `patch -p0'):
Ondrej Oprala 6f2bbd
Ondrej Oprala 6f2bbd
*** ../bash-4.3/lib/glob/gmisc.c	2013-10-28 14:45:25.000000000 -0400
Ondrej Oprala 6f2bbd
--- lib/glob/gmisc.c	2014-03-19 09:16:08.000000000 -0400
Ondrej Oprala 6f2bbd
***************
Ondrej Oprala 6f2bbd
*** 211,214 ****
Ondrej Oprala 6f2bbd
--- 211,215 ----
Ondrej Oprala 6f2bbd
      case '!':
Ondrej Oprala 6f2bbd
      case '@':
Ondrej Oprala 6f2bbd
+     case '?':
Ondrej Oprala 6f2bbd
        return (pat[1] == LPAREN);
Ondrej Oprala 6f2bbd
      default:
Ondrej Oprala 6f2bbd
*** ../bash-4.3/lib/glob/glob.c	2014-01-31 21:43:51.000000000 -0500
Ondrej Oprala 6f2bbd
--- lib/glob/glob.c	2014-03-20 09:01:26.000000000 -0400
Ondrej Oprala 6f2bbd
***************
Ondrej Oprala 6f2bbd
*** 180,202 ****
Ondrej Oprala 6f2bbd
       int flags;
Ondrej Oprala 6f2bbd
  {
Ondrej Oprala 6f2bbd
!   char *pp, *pe, *t;
Ondrej Oprala 6f2bbd
!   int n, r;
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
    pp = pat + 2;
Ondrej Oprala 6f2bbd
!   pe = pp + strlen (pp) - 1;	/*(*/
Ondrej Oprala 6f2bbd
!   if (*pe != ')')
Ondrej Oprala 6f2bbd
!     return 0;
Ondrej Oprala 6f2bbd
!   if ((t = strchr (pp, '|')) == 0)	/* easy case first */
Ondrej Oprala 6f2bbd
      {
Ondrej Oprala 6f2bbd
        *pe = '\0';
Ondrej Oprala 6f2bbd
        r = skipname (pp, dname, flags);	/*(*/
Ondrej Oprala 6f2bbd
        *pe = ')';
Ondrej Oprala 6f2bbd
        return r;
Ondrej Oprala 6f2bbd
      }
Ondrej Oprala 6f2bbd
    while (t = glob_patscan (pp, pe, '|'))
Ondrej Oprala 6f2bbd
      {
Ondrej Oprala 6f2bbd
        n = t[-1];
Ondrej Oprala 6f2bbd
        t[-1] = '\0';
Ondrej Oprala 6f2bbd
        r = skipname (pp, dname, flags);
Ondrej Oprala 6f2bbd
        t[-1] = n;
Ondrej Oprala 6f2bbd
        if (r == 0)	/* if any pattern says not skip, we don't skip */
Ondrej Oprala 6f2bbd
--- 180,215 ----
Ondrej Oprala 6f2bbd
       int flags;
Ondrej Oprala 6f2bbd
  {
Ondrej Oprala 6f2bbd
!   char *pp, *pe, *t, *se;
Ondrej Oprala 6f2bbd
!   int n, r, negate;
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
+   negate = *pat == '!';
Ondrej Oprala 6f2bbd
    pp = pat + 2;
Ondrej Oprala 6f2bbd
!   se = pp + strlen (pp) - 1;		/* end of string */
Ondrej Oprala 6f2bbd
!   pe = glob_patscan (pp, se, 0);	/* end of extglob pattern (( */
Ondrej Oprala 6f2bbd
!   /* we should check for invalid extglob pattern here */
Ondrej Oprala 6f2bbd
!   /* if pe != se we have more of the pattern at the end of the extglob
Ondrej Oprala 6f2bbd
!      pattern. Check the easy case first ( */
Ondrej Oprala 6f2bbd
!   if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
Ondrej Oprala 6f2bbd
      {
Ondrej Oprala 6f2bbd
        *pe = '\0';
Ondrej Oprala 6f2bbd
+ #if defined (HANDLE_MULTIBYTE)
Ondrej Oprala 6f2bbd
+       r = mbskipname (pp, dname, flags);
Ondrej Oprala 6f2bbd
+ #else
Ondrej Oprala 6f2bbd
        r = skipname (pp, dname, flags);	/*(*/
Ondrej Oprala 6f2bbd
+ #endif
Ondrej Oprala 6f2bbd
        *pe = ')';
Ondrej Oprala 6f2bbd
        return r;
Ondrej Oprala 6f2bbd
      }
Ondrej Oprala 6f2bbd
+ 
Ondrej Oprala 6f2bbd
+   /* check every subpattern */
Ondrej Oprala 6f2bbd
    while (t = glob_patscan (pp, pe, '|'))
Ondrej Oprala 6f2bbd
      {
Ondrej Oprala 6f2bbd
        n = t[-1];
Ondrej Oprala 6f2bbd
        t[-1] = '\0';
Ondrej Oprala 6f2bbd
+ #if defined (HANDLE_MULTIBYTE)
Ondrej Oprala 6f2bbd
+       r = mbskipname (pp, dname, flags);
Ondrej Oprala 6f2bbd
+ #else
Ondrej Oprala 6f2bbd
        r = skipname (pp, dname, flags);
Ondrej Oprala 6f2bbd
+ #endif
Ondrej Oprala 6f2bbd
        t[-1] = n;
Ondrej Oprala 6f2bbd
        if (r == 0)	/* if any pattern says not skip, we don't skip */
Ondrej Oprala 6f2bbd
***************
Ondrej Oprala 6f2bbd
*** 205,219 ****
Ondrej Oprala 6f2bbd
      }	/*(*/
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
!   if (pp == pe)		/* glob_patscan might find end of pattern */
Ondrej Oprala 6f2bbd
      return r;
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
!   *pe = '\0';
Ondrej Oprala 6f2bbd
! #  if defined (HANDLE_MULTIBYTE)
Ondrej Oprala 6f2bbd
!   r = mbskipname (pp, dname, flags);	/*(*/
Ondrej Oprala 6f2bbd
! #  else
Ondrej Oprala 6f2bbd
!   r = skipname (pp, dname, flags);	/*(*/
Ondrej Oprala 6f2bbd
! #  endif
Ondrej Oprala 6f2bbd
!   *pe = ')';
Ondrej Oprala 6f2bbd
!   return r;
Ondrej Oprala 6f2bbd
  }
Ondrej Oprala 6f2bbd
  #endif
Ondrej Oprala 6f2bbd
--- 218,227 ----
Ondrej Oprala 6f2bbd
      }	/*(*/
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
!   /* glob_patscan might find end of pattern */
Ondrej Oprala 6f2bbd
!   if (pp == se)
Ondrej Oprala 6f2bbd
      return r;
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
!   /* but if it doesn't then we didn't match a leading dot */
Ondrej Oprala 6f2bbd
!   return 0;
Ondrej Oprala 6f2bbd
  }
Ondrej Oprala 6f2bbd
  #endif
Ondrej Oprala 6f2bbd
***************
Ondrej Oprala 6f2bbd
*** 278,289 ****
Ondrej Oprala 6f2bbd
  {
Ondrej Oprala 6f2bbd
  #if EXTENDED_GLOB
Ondrej Oprala 6f2bbd
!   wchar_t *pp, *pe, *t, n;
Ondrej Oprala 6f2bbd
!   int r;
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
    pp = pat + 2;
Ondrej Oprala 6f2bbd
!   pe = pp + wcslen (pp) - 1;	/*(*/
Ondrej Oprala 6f2bbd
!   if (*pe != L')')
Ondrej Oprala 6f2bbd
!     return 0;
Ondrej Oprala 6f2bbd
!   if ((t = wcschr (pp, L'|')) == 0)
Ondrej Oprala 6f2bbd
      {
Ondrej Oprala 6f2bbd
        *pe = L'\0';
Ondrej Oprala 6f2bbd
--- 286,298 ----
Ondrej Oprala 6f2bbd
  {
Ondrej Oprala 6f2bbd
  #if EXTENDED_GLOB
Ondrej Oprala 6f2bbd
!   wchar_t *pp, *pe, *t, n, *se;
Ondrej Oprala 6f2bbd
!   int r, negate;
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
+   negate = *pat == L'!';
Ondrej Oprala 6f2bbd
    pp = pat + 2;
Ondrej Oprala 6f2bbd
!   se = pp + wcslen (pp) - 1;	/*(*/
Ondrej Oprala 6f2bbd
!   pe = glob_patscan_wc (pp, se, 0);
Ondrej Oprala 6f2bbd
! 
Ondrej Oprala 6f2bbd
!   if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0)
Ondrej Oprala 6f2bbd
      {
Ondrej Oprala 6f2bbd
        *pe = L'\0';
Ondrej Oprala 6f2bbd
***************
Ondrej Oprala 6f2bbd
*** 292,295 ****
Ondrej Oprala 6f2bbd
--- 301,306 ----
Ondrej Oprala 6f2bbd
        return r;
Ondrej Oprala 6f2bbd
      }
Ondrej Oprala 6f2bbd
+ 
Ondrej Oprala 6f2bbd
+   /* check every subpattern */
Ondrej Oprala 6f2bbd
    while (t = glob_patscan_wc (pp, pe, '|'))
Ondrej Oprala 6f2bbd
      {
Ondrej Oprala 6f2bbd
***************
Ondrej Oprala 6f2bbd
*** 306,313 ****
Ondrej Oprala 6f2bbd
      return r;
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
!   *pe = L'\0';
Ondrej Oprala 6f2bbd
!   r = wchkname (pp, dname);	/*(*/
Ondrej Oprala 6f2bbd
!   *pe = L')';
Ondrej Oprala 6f2bbd
!   return r;
Ondrej Oprala 6f2bbd
  #else
Ondrej Oprala 6f2bbd
    return (wchkname (pat, dname));
Ondrej Oprala 6f2bbd
--- 317,322 ----
Ondrej Oprala 6f2bbd
      return r;
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
!   /* but if it doesn't then we didn't match a leading dot */
Ondrej Oprala 6f2bbd
!   return 0;
Ondrej Oprala 6f2bbd
  #else
Ondrej Oprala 6f2bbd
    return (wchkname (pat, dname));
Ondrej Oprala 6f2bbd
*** ../bash-4.3/patchlevel.h	2012-12-29 10:47:57.000000000 -0500
Ondrej Oprala 6f2bbd
--- patchlevel.h	2014-03-20 20:01:28.000000000 -0400
Ondrej Oprala 6f2bbd
***************
Ondrej Oprala 6f2bbd
*** 26,30 ****
Ondrej Oprala 6f2bbd
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
! #define PATCHLEVEL 7
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
  #endif /* _PATCHLEVEL_H_ */
Ondrej Oprala 6f2bbd
--- 26,30 ----
Ondrej Oprala 6f2bbd
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
! #define PATCHLEVEL 8
Ondrej Oprala 6f2bbd
  
Ondrej Oprala 6f2bbd
  #endif /* _PATCHLEVEL_H_ */