From: Chet Ramey Date: Fri, 28 Mar 2014 15:54:45 +0000 (-0400) Subject: Bash-4.3 patch 8 X-Git-Tag: upstream/4.3.25~17 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;ds=sidebyside;h=7137b2df58b6506ccae6efa9a13be467e87efc4f;hp=01657c6474ca4f90df0fbb47001e2e744aaaddb0;p=platform%2Fupstream%2Fbash.git Bash-4.3 patch 8 --- diff --git a/lib/glob/glob.c b/lib/glob/glob.c index f549436..60ac79e 100644 --- a/lib/glob/glob.c +++ b/lib/glob/glob.c @@ -179,42 +179,50 @@ extglob_skipname (pat, dname, flags) char *pat, *dname; int flags; { - char *pp, *pe, *t; - int n, r; + char *pp, *pe, *t, *se; + int n, r, negate; + negate = *pat == '!'; pp = pat + 2; - pe = pp + strlen (pp) - 1; /*(*/ - if (*pe != ')') - return 0; - if ((t = strchr (pp, '|')) == 0) /* easy case first */ + 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 */ return r; pp = t; } /*(*/ - if (pp == pe) /* glob_patscan might find end of pattern */ + /* glob_patscan might find end of pattern */ + if (pp == se) return r; - *pe = '\0'; -# if defined (HANDLE_MULTIBYTE) - r = mbskipname (pp, dname, flags); /*(*/ -# else - r = skipname (pp, dname, flags); /*(*/ -# endif - *pe = ')'; - return r; + /* but if it doesn't then we didn't match a leading dot */ + return 0; } #endif @@ -277,20 +285,23 @@ wextglob_skipname (pat, dname, flags) int flags; { #if EXTENDED_GLOB - wchar_t *pp, *pe, *t, n; - int r; + wchar_t *pp, *pe, *t, n, *se; + int r, negate; + negate = *pat == L'!'; pp = pat + 2; - pe = pp + wcslen (pp) - 1; /*(*/ - if (*pe != L')') - return 0; - if ((t = wcschr (pp, L'|')) == 0) + se = pp + wcslen (pp) - 1; /*(*/ + pe = glob_patscan_wc (pp, se, 0); + + if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0) { *pe = L'\0'; r = wchkname (pp, dname); /*(*/ *pe = L')'; return r; } + + /* check every subpattern */ while (t = glob_patscan_wc (pp, pe, '|')) { n = t[-1]; @@ -305,10 +316,8 @@ wextglob_skipname (pat, dname, flags) if (pp == pe) /* glob_patscan_wc might find end of pattern */ return r; - *pe = L'\0'; - r = wchkname (pp, dname); /*(*/ - *pe = L')'; - return r; + /* but if it doesn't then we didn't match a leading dot */ + return 0; #else return (wchkname (pat, dname)); #endif diff --git a/lib/glob/gmisc.c b/lib/glob/gmisc.c index 17e4265..4bd37f6 100644 --- a/lib/glob/gmisc.c +++ b/lib/glob/gmisc.c @@ -210,6 +210,7 @@ extglob_pattern_p (pat) case '+': case '!': case '@': + case '?': return (pat[1] == LPAREN); default: return 0; diff --git a/patchlevel.h b/patchlevel.h index fc8c97f..4099c48 100644 --- a/patchlevel.h +++ b/patchlevel.h @@ -25,6 +25,6 @@ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh looks for to find the patch level (for the sccs version string). */ -#define PATCHLEVEL 7 +#define PATCHLEVEL 8 #endif /* _PATCHLEVEL_H_ */