aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChet Ramey <chet.ramey@case.edu>2014-03-28 11:54:45 -0400
committerChet Ramey <chet.ramey@case.edu>2014-03-28 11:54:45 -0400
commit7137b2df58b6506ccae6efa9a13be467e87efc4f (patch)
tree45775d04b8668a8688e7273e600a05933dfbe778
parent01657c6474ca4f90df0fbb47001e2e744aaaddb0 (diff)
downloadandroid_external_bash-7137b2df58b6506ccae6efa9a13be467e87efc4f.tar.gz
android_external_bash-7137b2df58b6506ccae6efa9a13be467e87efc4f.tar.bz2
android_external_bash-7137b2df58b6506ccae6efa9a13be467e87efc4f.zip
Bash-4.3 patch 8
-rw-r--r--lib/glob/glob.c59
-rw-r--r--lib/glob/gmisc.c1
-rw-r--r--patchlevel.h2
3 files changed, 36 insertions, 26 deletions
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_ */