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