108-upstream-bash43-008.patch (3779B)
1 BASH PATCH REPORT 2 ================= 3 4 Bash-Release: 4.3 5 Patch-ID: bash43-008 6 7 Bug-Reported-by: Stephane Chazelas <stephane.chazelas@gmail.com> 8 Bug-Reference-ID: <20140318135901.GB22158@chaz.gmail.com> 9 Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00098.html 10 11 Bug-Description: 12 13 Some extended glob patterns incorrectly matched filenames with a leading 14 dot, regardless of the setting of the `dotglob' option. 15 16 Patch (apply with `patch -p0'): 17 18 --- a/lib/glob/gmisc.c 19 +++ b/lib/glob/gmisc.c 20 @@ -210,6 +210,7 @@ extglob_pattern_p (pat) 21 case '+': 22 case '!': 23 case '@': 24 + case '?': 25 return (pat[1] == LPAREN); 26 default: 27 return 0; 28 --- a/lib/glob/glob.c 29 +++ b/lib/glob/glob.c 30 @@ -179,42 +179,50 @@ extglob_skipname (pat, dname, flags) 31 char *pat, *dname; 32 int flags; 33 { 34 - char *pp, *pe, *t; 35 - int n, r; 36 + char *pp, *pe, *t, *se; 37 + int n, r, negate; 38 39 + negate = *pat == '!'; 40 pp = pat + 2; 41 - pe = pp + strlen (pp) - 1; /*(*/ 42 - if (*pe != ')') 43 - return 0; 44 - if ((t = strchr (pp, '|')) == 0) /* easy case first */ 45 + se = pp + strlen (pp) - 1; /* end of string */ 46 + pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */ 47 + /* we should check for invalid extglob pattern here */ 48 + /* if pe != se we have more of the pattern at the end of the extglob 49 + pattern. Check the easy case first ( */ 50 + if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0) 51 { 52 *pe = '\0'; 53 +#if defined (HANDLE_MULTIBYTE) 54 + r = mbskipname (pp, dname, flags); 55 +#else 56 r = skipname (pp, dname, flags); /*(*/ 57 +#endif 58 *pe = ')'; 59 return r; 60 } 61 + 62 + /* check every subpattern */ 63 while (t = glob_patscan (pp, pe, '|')) 64 { 65 n = t[-1]; 66 t[-1] = '\0'; 67 +#if defined (HANDLE_MULTIBYTE) 68 + r = mbskipname (pp, dname, flags); 69 +#else 70 r = skipname (pp, dname, flags); 71 +#endif 72 t[-1] = n; 73 if (r == 0) /* if any pattern says not skip, we don't skip */ 74 return r; 75 pp = t; 76 } /*(*/ 77 78 - if (pp == pe) /* glob_patscan might find end of pattern */ 79 + /* glob_patscan might find end of pattern */ 80 + if (pp == se) 81 return r; 82 83 - *pe = '\0'; 84 -# if defined (HANDLE_MULTIBYTE) 85 - r = mbskipname (pp, dname, flags); /*(*/ 86 -# else 87 - r = skipname (pp, dname, flags); /*(*/ 88 -# endif 89 - *pe = ')'; 90 - return r; 91 + /* but if it doesn't then we didn't match a leading dot */ 92 + return 0; 93 } 94 #endif 95 96 @@ -277,20 +285,23 @@ wextglob_skipname (pat, dname, flags) 97 int flags; 98 { 99 #if EXTENDED_GLOB 100 - wchar_t *pp, *pe, *t, n; 101 - int r; 102 + wchar_t *pp, *pe, *t, n, *se; 103 + int r, negate; 104 105 + negate = *pat == L'!'; 106 pp = pat + 2; 107 - pe = pp + wcslen (pp) - 1; /*(*/ 108 - if (*pe != L')') 109 - return 0; 110 - if ((t = wcschr (pp, L'|')) == 0) 111 + se = pp + wcslen (pp) - 1; /*(*/ 112 + pe = glob_patscan_wc (pp, se, 0); 113 + 114 + if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0) 115 { 116 *pe = L'\0'; 117 r = wchkname (pp, dname); /*(*/ 118 *pe = L')'; 119 return r; 120 } 121 + 122 + /* check every subpattern */ 123 while (t = glob_patscan_wc (pp, pe, '|')) 124 { 125 n = t[-1]; 126 @@ -305,10 +316,8 @@ wextglob_skipname (pat, dname, flags) 127 if (pp == pe) /* glob_patscan_wc might find end of pattern */ 128 return r; 129 130 - *pe = L'\0'; 131 - r = wchkname (pp, dname); /*(*/ 132 - *pe = L')'; 133 - return r; 134 + /* but if it doesn't then we didn't match a leading dot */ 135 + return 0; 136 #else 137 return (wchkname (pat, dname)); 138 #endif 139 --- a/patchlevel.h 140 +++ b/patchlevel.h 141 @@ -25,6 +25,6 @@ 142 regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh 143 looks for to find the patch level (for the sccs version string). */ 144 145 -#define PATCHLEVEL 7 146 +#define PATCHLEVEL 8 147 148 #endif /* _PATCHLEVEL_H_ */