Ondrej Oprala 1b8a75
			     BASH PATCH REPORT
Ondrej Oprala 1b8a75
			     =================
Ondrej Oprala 1b8a75
Ondrej Oprala 1b8a75
Bash-Release:	4.3
Ondrej Oprala 1b8a75
Patch-ID:	bash43-016
Ondrej Oprala 1b8a75
Ondrej Oprala 1b8a75
Bug-Reported-by:	Pierre Gaston <pierre.gaston@gmail.com>
Ondrej Oprala 1b8a75
Bug-Reference-ID:	<CAPSX3sTCD61k1VQLJ5r-LWzEt+e7Xc-fxXmwn2u8EA5gJJej8Q@mail.gmail.com>
Ondrej Oprala 1b8a75
Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00100.html
Ondrej Oprala 1b8a75
Ondrej Oprala 1b8a75
Bug-Description:
Ondrej Oprala 1b8a75
Ondrej Oprala 1b8a75
An extended glob pattern containing a slash (`/') causes the globbing code
Ondrej Oprala 1b8a75
to misinterpret it as a directory separator.
Ondrej Oprala 1b8a75
Ondrej Oprala 1b8a75
Patch (apply with `patch -p0'):
Ondrej Oprala 1b8a75
*** ../bash-4.3-patched/lib/glob/glob.c	2014-03-28 10:54:23.000000000 -0400
Ondrej Oprala 1b8a75
--- lib/glob/glob.c	2014-05-02 10:24:28.000000000 -0400
Ondrej Oprala 1b8a75
***************
Ondrej Oprala 1b8a75
*** 124,127 ****
Ondrej Oprala 1b8a75
--- 124,129 ----
Ondrej Oprala 1b8a75
  extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
Ondrej Oprala 1b8a75
  
Ondrej Oprala 1b8a75
+ extern char *glob_dirscan __P((char *, int));
Ondrej Oprala 1b8a75
+ 
Ondrej Oprala 1b8a75
  /* Compile `glob_loop.c' for single-byte characters. */
Ondrej Oprala 1b8a75
  #define CHAR	unsigned char
Ondrej Oprala 1b8a75
***************
Ondrej Oprala 1b8a75
*** 188,191 ****
Ondrej Oprala 1b8a75
--- 190,196 ----
Ondrej Oprala 1b8a75
    pe = glob_patscan (pp, se, 0);	/* end of extglob pattern (( */
Ondrej Oprala 1b8a75
    /* we should check for invalid extglob pattern here */
Ondrej Oprala 1b8a75
+   if (pe == 0)
Ondrej Oprala 1b8a75
+     return 0;
Ondrej Oprala 1b8a75
+ 
Ondrej Oprala 1b8a75
    /* if pe != se we have more of the pattern at the end of the extglob
Ondrej Oprala 1b8a75
       pattern. Check the easy case first ( */
Ondrej Oprala 1b8a75
***************
Ondrej Oprala 1b8a75
*** 1016,1020 ****
Ondrej Oprala 1b8a75
    char **result;
Ondrej Oprala 1b8a75
    unsigned int result_size;
Ondrej Oprala 1b8a75
!   char *directory_name, *filename, *dname;
Ondrej Oprala 1b8a75
    unsigned int directory_len;
Ondrej Oprala 1b8a75
    int free_dirname;			/* flag */
Ondrej Oprala 1b8a75
--- 1021,1025 ----
Ondrej Oprala 1b8a75
    char **result;
Ondrej Oprala 1b8a75
    unsigned int result_size;
Ondrej Oprala 1b8a75
!   char *directory_name, *filename, *dname, *fn;
Ondrej Oprala 1b8a75
    unsigned int directory_len;
Ondrej Oprala 1b8a75
    int free_dirname;			/* flag */
Ondrej Oprala 1b8a75
***************
Ondrej Oprala 1b8a75
*** 1032,1035 ****
Ondrej Oprala 1b8a75
--- 1037,1052 ----
Ondrej Oprala 1b8a75
    /* Find the filename.  */
Ondrej Oprala 1b8a75
    filename = strrchr (pathname, '/');
Ondrej Oprala 1b8a75
+ #if defined (EXTENDED_GLOB)
Ondrej Oprala 1b8a75
+   if (filename && extended_glob)
Ondrej Oprala 1b8a75
+     {
Ondrej Oprala 1b8a75
+       fn = glob_dirscan (pathname, '/');
Ondrej Oprala 1b8a75
+ #if DEBUG_MATCHING
Ondrej Oprala 1b8a75
+       if (fn != filename)
Ondrej Oprala 1b8a75
+ 	fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename);
Ondrej Oprala 1b8a75
+ #endif
Ondrej Oprala 1b8a75
+       filename = fn;
Ondrej Oprala 1b8a75
+     }
Ondrej Oprala 1b8a75
+ #endif
Ondrej Oprala 1b8a75
+ 
Ondrej Oprala 1b8a75
    if (filename == NULL)
Ondrej Oprala 1b8a75
      {
Ondrej Oprala 1b8a75
*** ../bash-4.3-patched/lib/glob/gmisc.c	2014-03-28 10:54:23.000000000 -0400
Ondrej Oprala 1b8a75
--- lib/glob/gmisc.c	2014-05-02 09:35:57.000000000 -0400
Ondrej Oprala 1b8a75
***************
Ondrej Oprala 1b8a75
*** 43,46 ****
Ondrej Oprala 1b8a75
--- 43,48 ----
Ondrej Oprala 1b8a75
  #define WRPAREN         L')'
Ondrej Oprala 1b8a75
  
Ondrej Oprala 1b8a75
+ extern char *glob_patscan __P((char *, char *, int));
Ondrej Oprala 1b8a75
+ 
Ondrej Oprala 1b8a75
  /* Return 1 of the first character of WSTRING could match the first
Ondrej Oprala 1b8a75
     character of pattern WPAT.  Wide character version. */
Ondrej Oprala 1b8a75
***************
Ondrej Oprala 1b8a75
*** 376,377 ****
Ondrej Oprala 1b8a75
--- 378,410 ----
Ondrej Oprala 1b8a75
    return matlen;
Ondrej Oprala 1b8a75
  }
Ondrej Oprala 1b8a75
+ 
Ondrej Oprala 1b8a75
+ /* Skip characters in PAT and return the final occurrence of DIRSEP.  This
Ondrej Oprala 1b8a75
+    is only called when extended_glob is set, so we have to skip over extglob
Ondrej Oprala 1b8a75
+    patterns x(...) */
Ondrej Oprala 1b8a75
+ char *
Ondrej Oprala 1b8a75
+ glob_dirscan (pat, dirsep)
Ondrej Oprala 1b8a75
+      char *pat;
Ondrej Oprala 1b8a75
+      int dirsep;
Ondrej Oprala 1b8a75
+ {
Ondrej Oprala 1b8a75
+   char *p, *d, *pe, *se;
Ondrej Oprala 1b8a75
+ 
Ondrej Oprala 1b8a75
+   d = pe = se = 0;
Ondrej Oprala 1b8a75
+   for (p = pat; p && *p; p++)
Ondrej Oprala 1b8a75
+     {
Ondrej Oprala 1b8a75
+       if (extglob_pattern_p (p))
Ondrej Oprala 1b8a75
+ 	{
Ondrej Oprala 1b8a75
+ 	  if (se == 0)
Ondrej Oprala 1b8a75
+ 	    se = p + strlen (p) - 1;
Ondrej Oprala 1b8a75
+ 	  pe = glob_patscan (p + 2, se, 0);
Ondrej Oprala 1b8a75
+ 	  if (pe == 0)
Ondrej Oprala 1b8a75
+ 	    continue;
Ondrej Oprala 1b8a75
+ 	  else if (*pe == 0)
Ondrej Oprala 1b8a75
+ 	    break;
Ondrej Oprala 1b8a75
+ 	  p = pe - 1;	/* will do increment above */
Ondrej Oprala 1b8a75
+ 	  continue;
Ondrej Oprala 1b8a75
+ 	}
Ondrej Oprala 1b8a75
+       if (*p ==  dirsep)
Ondrej Oprala 1b8a75
+ 	d = p;
Ondrej Oprala 1b8a75
+     }
Ondrej Oprala 1b8a75
+   return d;
Ondrej Oprala 1b8a75
+ }
Ondrej Oprala 1b8a75
Ondrej Oprala 1b8a75
*** ../bash-4.3/patchlevel.h	2012-12-29 10:47:57.000000000 -0500
Ondrej Oprala 1b8a75
--- patchlevel.h	2014-03-20 20:01:28.000000000 -0400
Ondrej Oprala 1b8a75
***************
Ondrej Oprala 1b8a75
*** 26,30 ****
Ondrej Oprala 1b8a75
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 1b8a75
  
Ondrej Oprala 1b8a75
! #define PATCHLEVEL 15
Ondrej Oprala 1b8a75
  
Ondrej Oprala 1b8a75
  #endif /* _PATCHLEVEL_H_ */
Ondrej Oprala 1b8a75
--- 26,30 ----
Ondrej Oprala 1b8a75
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 1b8a75
  
Ondrej Oprala 1b8a75
! #define PATCHLEVEL 16
Ondrej Oprala 1b8a75
  
Ondrej Oprala 1b8a75
  #endif /* _PATCHLEVEL_H_ */