X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/224c70764cab4e0e39a26aaf3ad3016552f62f55..fbd86d4cc20b02a10edcca92fb7ae0a143e63cc4:/gen/FreeBSD/glob.c.patch diff --git a/gen/FreeBSD/glob.c.patch b/gen/FreeBSD/glob.c.patch index 904b155..9a05ae4 100644 --- a/gen/FreeBSD/glob.c.patch +++ b/gen/FreeBSD/glob.c.patch @@ -1,103 +1,132 @@ ---- glob.c.orig 2004-11-25 11:38:01.000000000 -0800 -+++ glob.c 2006-07-04 12:47:05.000000000 -0700 -@@ -40,6 +40,8 @@ +--- glob.c.orig 2011-01-25 17:41:37.000000000 -0800 ++++ glob.c 2011-01-26 11:50:09.000000000 -0800 +@@ -36,6 +36,8 @@ static char sccsid[] = "@(#)glob.c 8.3 ( #include - __FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.22 2004/07/29 03:48:52 tjr Exp $"); + __FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.28 2010/05/12 17:44:00 gordon Exp $"); +#include "xlocale_private.h" + /* * glob(3) -- a superset of the one defined in POSIX 1003.2. * -@@ -142,29 +144,42 @@ - #define M_SET META('[') - #define ismeta(c) (((c)&M_QUOTE) != 0) +@@ -89,6 +91,19 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/glo -+static int g_lstat(Char *, struct stat *, glob_t *, locale_t); -+static int g_stat(Char *, struct stat *, glob_t *, locale_t); + #include "collate.h" + ++#define GLOB_LIMIT_STRING 65536 /* number of readdirs */ ++#define GLOB_LIMIT_STAT 128 /* number of stat system calls */ ++#define GLOB_LIMIT_READDIR 16384 /* total buffer size of path strings */ ++#define GLOB_LIMIT_PATH 1024 /* number of path elements */ ++#define GLOB_LIMIT_BRACE 128 /* Number of brace calls */ + -+#define g_Ctoc __gl_g_Ctoc -+#define glob0 __gl_glob0 -+#define glob2_32 __gl_glob0_32 -+#define glob2_64 __gl_glob0_64 -+#define glob3 __gl_glob3 -+#define globexp1 __gl_globexp1 -+#define globextend __gl_globextend -+__private_extern__ int g_Ctoc(const Char *, char *, u_int, locale_t); -+__private_extern__ int glob0(const Char *, glob_t *, int *, locale_t); -+__private_extern__ int glob2_32(Char *, Char *, Char *, Char *, glob_t *, int *, locale_t); -+__private_extern__ int glob2_64(Char *, Char *, Char *, Char *, glob_t *, int *, locale_t); -+__private_extern__ int glob3(Char *, Char *, Char *, Char *, Char *, glob_t *, int *, locale_t); -+__private_extern__ int globexp1(const Char *, glob_t *, int *, locale_t); -+__private_extern__ int globextend(const Char *, glob_t *, int *, locale_t); ++struct glob_limit { ++ size_t l_string; ++ size_t l_stat; ++ size_t l_readdir; ++ size_t l_brace; ++}; + -+#ifndef BUILDING_VARIANT -+#define glob2(a,b,c,d,e,f,g) (((e)->gl_flags & GLOB_INODE64) ? glob2_64((a),(b),(c),(d),(e),(f),(g)) : glob2_32((a),(b),(c),(d),(e),(f),(g))) + #define DOLLAR '$' + #define DOT '.' + #define EOS '\0' +@@ -139,62 +154,64 @@ typedef char Char; + #define ismeta(c) (((c)&M_QUOTE) != 0) - static int compare(const void *, const void *); --static int g_Ctoc(const Char *, char *, u_int); + +-static int compare(const void *, const void *); +-static int g_Ctoc(const Char *, char *, size_t); -static int g_lstat(Char *, struct stat *, glob_t *); -static DIR *g_opendir(Char *, glob_t *); +-static const Char *g_strchr(const Char *, wchar_t); ++#define compare __gl_compare ++#define g_Ctoc __gl_g_Ctoc ++#define g_strchr __gl_g_strchr ++#define globextend __gl_globextend ++#define globtilde __gl_globtilde ++#define match __gl_match ++__private_extern__ int compare(const void *, const void *); ++__private_extern__ int g_Ctoc(const Char *, char *, size_t, locale_t); ++__private_extern__ const Char *g_strchr(const Char *, wchar_t); ++__private_extern__ int globextend(const Char *, glob_t *, struct glob_limit *, locale_t); ++__private_extern__ const Char * ++ globtilde(const Char *, Char *, size_t, glob_t *); ++__private_extern__ int match(Char *, Char *, Char *, locale_t); ++ ++ ++static int g_lstat(Char *, struct stat *, glob_t *, locale_t); +static DIR *g_opendir(Char *, glob_t *, locale_t); - static Char *g_strchr(Char *, wchar_t); #ifdef notdef static Char *g_strcat(Char *, const Char *); #endif -static int g_stat(Char *, struct stat *, glob_t *); --static int glob0(const Char *, glob_t *, int *); --static int glob1(Char *, glob_t *, int *); --static int glob2(Char *, Char *, Char *, Char *, glob_t *, int *); --static int glob3(Char *, Char *, Char *, Char *, Char *, glob_t *, int *); --static int globextend(const Char *, glob_t *, int *); -+static int glob1(Char *, glob_t *, int *, locale_t); - static const Char * - globtilde(const Char *, Char *, size_t, glob_t *); --static int globexp1(const Char *, glob_t *, int *); --static int globexp2(const Char *, const Char *, glob_t *, int *, int *); +-static int glob0(const Char *, glob_t *, size_t *); +-static int glob1(Char *, glob_t *, size_t *); +-static int glob2(Char *, Char *, Char *, Char *, glob_t *, size_t *); +-static int glob3(Char *, Char *, Char *, Char *, Char *, glob_t *, size_t *); +-static int globextend(const Char *, glob_t *, size_t *); +-static const Char * +- globtilde(const Char *, Char *, size_t, glob_t *); +-static int globexp1(const Char *, glob_t *, size_t *); +-static int globexp2(const Char *, const Char *, glob_t *, int *, size_t *); -static int match(Char *, Char *, Char *); -+static int globexp2(const Char *, const Char *, glob_t *, int *, int *, locale_t); -+static int match(Char *, Char *, Char *, locale_t); ++static int g_stat(Char *, struct stat *, glob_t *, locale_t); ++static int glob0(const Char *, glob_t *, struct glob_limit *, locale_t); ++static int glob1(Char *, glob_t *, struct glob_limit *, locale_t); ++static int glob2(Char *, Char *, Char *, Char *, glob_t *, struct glob_limit *, locale_t); ++static int glob3(Char *, Char *, Char *, Char *, Char *, glob_t *, struct glob_limit *, locale_t); ++static int globexp1(const Char *, glob_t *, struct glob_limit *, locale_t); ++static int globexp2(const Char *, const Char *, glob_t *, int *, struct glob_limit *, locale_t); #ifdef DEBUG static void qprintf(const char *, Char *); #endif -+#endif /* !BUILDING_VARIANT */ - int - glob(pattern, flags, errfunc, pglob) -@@ -178,6 +193,8 @@ +-int +-glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) ++static int ++__glob(const char *pattern, glob_t *pglob) + { + const char *patnext; +- size_t limit; ++ struct glob_limit limit = { 0, 0, 0, 0 }; + Char *bufnext, *bufend, patbuf[MAXPATHLEN], prot; mbstate_t mbs; wchar_t wc; size_t clen; + locale_t loc = __current_locale(); + int mb_cur_max = MB_CUR_MAX_L(loc); - patnext = (u_char *) pattern; - if (!(flags & GLOB_APPEND)) { -@@ -192,7 +209,12 @@ - limit = ARG_MAX; - } else - limit = 0; -+#if __DARWIN_64_BIT_INO_T - pglob->gl_flags = flags & ~GLOB_MAGCHAR; -+ pglob->gl_flags |= GLOB_INODE64; -+#else /* !__DARWIN_64_BIT_INO_T */ -+ pglob->gl_flags = flags & ~(GLOB_MAGCHAR | GLOB_INODE64); -+#endif /* __DARWIN_64_BIT_INO_T */ - pglob->gl_errfunc = errfunc; + patnext = pattern; +- if (!(flags & GLOB_APPEND)) { ++ if (!(pglob->gl_flags & GLOB_APPEND)) { + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; +- if (!(flags & GLOB_DOOFFS)) ++ if (!(pglob->gl_flags & GLOB_DOOFFS)) + pglob->gl_offs = 0; + } +- if (flags & GLOB_LIMIT) { +- limit = pglob->gl_matchc; +- if (limit == 0) +- limit = ARG_MAX; +- } else +- limit = 0; +- pglob->gl_flags = flags & ~GLOB_MAGCHAR; +- pglob->gl_errfunc = errfunc; pglob->gl_matchc = 0; -@@ -200,8 +222,8 @@ + bufnext = patbuf; bufend = bufnext + MAXPATHLEN - 1; - if (flags & GLOB_NOESCAPE) { +- if (flags & GLOB_NOESCAPE) { ++ if (pglob->gl_flags & GLOB_NOESCAPE) { memset(&mbs, 0, sizeof(mbs)); - while (bufend - bufnext >= MB_CUR_MAX) { - clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs); + while (bufend - bufnext >= mb_cur_max) { -+ clen = mbrtowc_l(&wc, (const char *)patnext, MB_LEN_MAX, &mbs, loc); ++ clen = mbrtowc_l(&wc, patnext, MB_LEN_MAX, &mbs, loc); if (clen == (size_t)-1 || clen == (size_t)-2) return (GLOB_NOMATCH); else if (clen == 0) -@@ -212,7 +234,7 @@ +@@ -205,7 +222,7 @@ glob(const char *pattern, int flags, int } else { /* Protect the quoted characters. */ memset(&mbs, 0, sizeof(mbs)); @@ -106,50 +135,75 @@ if (*patnext == QUOTE) { if (*++patnext == EOS) { *bufnext++ = QUOTE | M_PROTECT; -@@ -221,7 +243,7 @@ +@@ -214,7 +231,7 @@ glob(const char *pattern, int flags, int prot = M_PROTECT; } else prot = 0; - clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs); -+ clen = mbrtowc_l(&wc, (const char *)patnext, MB_LEN_MAX, &mbs, loc); ++ clen = mbrtowc_l(&wc, patnext, MB_LEN_MAX, &mbs, loc); if (clen == (size_t)-1 || clen == (size_t)-2) return (GLOB_NOMATCH); else if (clen == 0) -@@ -233,34 +255,36 @@ +@@ -225,11 +242,34 @@ glob(const char *pattern, int flags, int + } *bufnext = EOS; - if (flags & GLOB_BRACE) +- if (flags & GLOB_BRACE) - return globexp1(patbuf, pglob, &limit); ++ if (pglob->gl_flags & GLOB_BRACE) + return globexp1(patbuf, pglob, &limit, loc); else - return glob0(patbuf, pglob, &limit); + return glob0(patbuf, pglob, &limit, loc); ++} ++ ++int ++glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) ++{ ++#ifdef __BLOCKS__ ++ pglob->gl_flags = flags & ~(GLOB_MAGCHAR | _GLOB_ERR_BLOCK); ++#else /* !__BLOCKS__ */ ++ pglob->gl_flags = flags & ~GLOB_MAGCHAR; ++#endif /* __BLOCKS__ */ ++ pglob->gl_errfunc = errfunc; ++ return __glob(pattern, pglob); ++} ++ ++#ifdef __BLOCKS__ ++int ++glob_b(const char *pattern, int flags, int (^errblk)(const char *, int), glob_t *pglob) ++{ ++ pglob->gl_flags = flags & ~GLOB_MAGCHAR; ++ pglob->gl_flags |= _GLOB_ERR_BLOCK; ++ pglob->gl_errblk = errblk; ++ return __glob(pattern, pglob); } ++#endif /* __BLOCKS__ */ -+#ifndef BUILDING_VARIANT /* * Expand recursively a glob {} pattern. When there is no more expansion - * invoke the standard globbing routine to glob the rest of the magic +@@ -237,20 +277,26 @@ glob(const char *pattern, int flags, int * characters */ --static int --globexp1(pattern, pglob, limit) -+__private_extern__ int -+globexp1(pattern, pglob, limit, loc) - const Char *pattern; - glob_t *pglob; - int *limit; -+ locale_t loc; + static int +-globexp1(const Char *pattern, glob_t *pglob, size_t *limit) ++globexp1(const Char *pattern, glob_t *pglob, struct glob_limit *limit, locale_t loc) { const Char* ptr = pattern; int rv; ++ if ((pglob->gl_flags & GLOB_LIMIT) && ++ limit->l_brace++ >= GLOB_LIMIT_BRACE) { ++ errno = 0; ++ return GLOB_NOSPACE; ++ } ++ /* Protect a single {}, for find(1), like csh */ if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS) - return glob0(pattern, pglob, limit); + return glob0(pattern, pglob, limit, loc); - while ((ptr = (const Char *) g_strchr((Char *) ptr, LBRACE)) != NULL) + while ((ptr = g_strchr(ptr, LBRACE)) != NULL) - if (!globexp2(ptr, pattern, pglob, &rv, limit)) + if (!globexp2(ptr, pattern, pglob, &rv, limit, loc)) return rv; @@ -159,20 +213,16 @@ } -@@ -270,10 +294,11 @@ +@@ -260,7 +306,7 @@ globexp1(const Char *pattern, glob_t *pg * If it fails then it tries to glob the rest of the pattern and returns. */ static int --globexp2(ptr, pattern, pglob, rv, limit) -+globexp2(ptr, pattern, pglob, rv, limit, loc) - const Char *ptr, *pattern; - glob_t *pglob; - int *rv, *limit; -+ locale_t loc; +-globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv, size_t *limit) ++globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv, struct glob_limit *limit, locale_t loc) { int i; Char *lm, *ls; -@@ -310,7 +335,7 @@ +@@ -297,7 +343,7 @@ globexp2(const Char *ptr, const Char *pa /* Non matching braces; just glob the pattern */ if (i != 0 || *pe == EOS) { @@ -181,7 +231,7 @@ return 0; } -@@ -357,7 +382,7 @@ +@@ -344,7 +390,7 @@ globexp2(const Char *ptr, const Char *pa #ifdef DEBUG qprintf("globexp2:", patbuf); #endif @@ -190,27 +240,37 @@ /* move after the comma, to the next string */ pl = pm + 1; -@@ -446,14 +471,16 @@ - * sorts the list (unless unsorted operation is requested). Returns 0 +@@ -360,10 +406,11 @@ globexp2(const Char *ptr, const Char *pa + + + ++#ifndef BUILDING_VARIANT + /* + * expand tilde from the passwd file. + */ +-static const Char * ++__private_extern__ const Char * + globtilde(const Char *pattern, Char *patbuf, size_t patbuf_len, glob_t *pglob) + { + struct passwd *pwd; +@@ -421,6 +468,7 @@ globtilde(const Char *pattern, Char *pat + + return patbuf; + } ++#endif /* BUILDING_VARIANT */ + + + /* +@@ -430,7 +478,7 @@ globtilde(const Char *pattern, Char *pat * if things went well, nonzero if errors occurred. */ --static int --glob0(pattern, pglob, limit) -+__private_extern__ int -+glob0(pattern, pglob, limit, loc) - const Char *pattern; - glob_t *pglob; - int *limit; -+ locale_t loc; + static int +-glob0(const Char *pattern, glob_t *pglob, size_t *limit) ++glob0(const Char *pattern, glob_t *pglob, struct glob_limit *limit, locale_t loc) { const Char *qpatnext; -- int c, err, oldpathc; -+ Char c; -+ int err, oldpathc; - Char *bufnext, patbuf[MAXPATHLEN]; - - qpatnext = globtilde(pattern, patbuf, MAXPATHLEN, pglob); -@@ -462,6 +489,10 @@ + int err; +@@ -443,6 +491,10 @@ glob0(const Char *pattern, glob_t *pglob /* We don't need to check for buffer overflow any more. */ while ((c = *qpatnext++) != EOS) { @@ -221,7 +281,7 @@ switch (c) { case LBRACKET: c = *qpatnext; -@@ -512,7 +543,7 @@ +@@ -493,7 +545,7 @@ glob0(const Char *pattern, glob_t *pglob qprintf("glob0:", patbuf); #endif @@ -230,7 +290,7 @@ return(err); /* -@@ -525,7 +556,7 @@ +@@ -506,7 +558,7 @@ glob0(const Char *pattern, glob_t *pglob if (((pglob->gl_flags & GLOB_NOCHECK) || ((pglob->gl_flags & GLOB_NOMAGIC) && !(pglob->gl_flags & GLOB_MAGCHAR)))) @@ -239,54 +299,45 @@ else return(GLOB_NOMATCH); } -@@ -539,14 +570,15 @@ - compare(p, q) - const void *p, *q; +@@ -516,14 +568,16 @@ glob0(const Char *pattern, glob_t *pglob + return(0); + } + +-static int ++#ifndef BUILDING_VARIANT ++__private_extern__ int + compare(const void *p, const void *q) { - return(strcmp(*(char **)p, *(char **)q)); + return(strcoll(*(char **)p, *(char **)q)); } ++#endif /* BUILDING_VARIANT */ static int --glob1(pattern, pglob, limit) -+glob1(pattern, pglob, limit, loc) - Char *pattern; - glob_t *pglob; - int *limit; -+ locale_t loc; +-glob1(Char *pattern, glob_t *pglob, size_t *limit) ++glob1(Char *pattern, glob_t *pglob, struct glob_limit *limit, locale_t loc) { Char pathbuf[MAXPATHLEN]; -@@ -554,19 +586,25 @@ +@@ -531,7 +585,7 @@ glob1(Char *pattern, glob_t *pglob, size if (*pattern == EOS) return(0); return(glob2(pathbuf, pathbuf, pathbuf + MAXPATHLEN - 1, - pattern, pglob, limit)); + pattern, pglob, limit, loc)); } -+#endif /* !BUILDING_VARIANT */ /* - * The functions glob2 and glob3 are mutually recursive; there is one level - * of recursion for each segment in the pattern that contains one or more - * meta characters. +@@ -541,7 +595,7 @@ glob1(Char *pattern, glob_t *pglob, size */ --static int --glob2(pathbuf, pathend, pathend_last, pattern, pglob, limit) -+__private_extern__ int -+#if __DARWIN_64_BIT_INO_T -+glob2_64(pathbuf, pathend, pathend_last, pattern, pglob, limit, loc) -+#else /* !__DARWIN_64_BIT_INO_T */ -+glob2_32(pathbuf, pathend, pathend_last, pattern, pglob, limit, loc) -+#endif /* __DARWIN_64_BIT_INO_T */ - Char *pathbuf, *pathend, *pathend_last, *pattern; - glob_t *pglob; - int *limit; -+ locale_t loc; + static int + glob2(Char *pathbuf, Char *pathend, Char *pathend_last, Char *pattern, +- glob_t *pglob, size_t *limit) ++ glob_t *pglob, struct glob_limit *limit, locale_t loc) { struct stat sb; Char *p, *q; -@@ -579,13 +617,13 @@ +@@ -554,13 +608,20 @@ glob2(Char *pathbuf, Char *pathend, Char for (anymeta = 0;;) { if (*pattern == EOS) { /* End of pattern? */ *pathend = EOS; @@ -294,6 +345,13 @@ + if (g_lstat(pathbuf, &sb, pglob, loc)) return(0); ++ if ((pglob->gl_flags & GLOB_LIMIT) && ++ limit->l_stat++ >= GLOB_LIMIT_STAT) { ++ errno = 0; ++ *pathend++ = SEP; ++ *pathend = EOS; ++ return GLOB_NOSPACE; ++ } if (((pglob->gl_flags & GLOB_MARK) && pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) || (S_ISLNK(sb.st_mode) && @@ -302,7 +360,7 @@ S_ISDIR(sb.st_mode)))) { if (pathend + 1 > pathend_last) return (GLOB_ABORTED); -@@ -593,7 +631,7 @@ +@@ -568,7 +629,7 @@ glob2(Char *pathbuf, Char *pathend, Char *pathend = EOS; } ++pglob->gl_matchc; @@ -311,7 +369,7 @@ } /* Find end of next segment, copy tentatively to pathend. */ -@@ -617,16 +655,18 @@ +@@ -592,7 +653,7 @@ glob2(Char *pathbuf, Char *pathend, Char } } else /* Need expansion, recurse. */ return(glob3(pathbuf, pathend, pathend_last, pattern, p, @@ -320,20 +378,16 @@ } /* NOTREACHED */ } - --static int --glob3(pathbuf, pathend, pathend_last, pattern, restpattern, pglob, limit) -+#ifndef BUILDING_VARIANT -+__private_extern__ int -+glob3(pathbuf, pathend, pathend_last, pattern, restpattern, pglob, limit, loc) - Char *pathbuf, *pathend, *pathend_last, *pattern, *restpattern; - glob_t *pglob; - int *limit; -+ locale_t loc; +@@ -600,7 +661,7 @@ glob2(Char *pathbuf, Char *pathend, Char + static int + glob3(Char *pathbuf, Char *pathend, Char *pathend_last, + Char *pattern, Char *restpattern, +- glob_t *pglob, size_t *limit) ++ glob_t *pglob, struct glob_limit *limit, locale_t loc) { struct dirent *dp; DIR *dirp; -@@ -646,15 +686,16 @@ +@@ -620,15 +681,22 @@ glob3(Char *pathbuf, Char *pathend, Char *pathend = EOS; errno = 0; @@ -346,6 +400,12 @@ return (GLOB_ABORTED); - if (pglob->gl_errfunc(buf, errno) || - pglob->gl_flags & GLOB_ERR) ++#ifdef __BLOCKS__ ++ if (pglob->gl_flags & _GLOB_ERR_BLOCK) { ++ if (pglob->gl_errblk(buf, errno)) ++ return (GLOB_ABORTED); ++ } else ++#endif /* __BLOCKS__ */ + if (pglob->gl_errfunc(buf, errno)) return (GLOB_ABORTED); } @@ -354,16 +414,31 @@ return(0); } -@@ -679,7 +720,7 @@ +@@ -646,6 +714,14 @@ glob3(Char *pathbuf, Char *pathend, Char + size_t clen; + mbstate_t mbs; + ++ if ((pglob->gl_flags & GLOB_LIMIT) && ++ limit->l_readdir++ >= GLOB_LIMIT_READDIR) { ++ errno = 0; ++ *pathend++ = SEP; ++ *pathend = EOS; ++ return GLOB_NOSPACE; ++ } ++ + /* Initial DOT must be matched literally. */ + if (dp->d_name[0] == DOT && *pattern != DOT) + continue; +@@ -653,7 +729,7 @@ glob3(Char *pathbuf, Char *pathend, Char dc = pathend; - sc = (u_char *) dp->d_name; + sc = dp->d_name; while (dc < pathend_last) { - clen = mbrtowc(&wc, sc, MB_LEN_MAX, &mbs); -+ clen = mbrtowc_l(&wc, (const char *)sc, MB_LEN_MAX, &mbs, loc); ++ clen = mbrtowc_l(&wc, sc, MB_LEN_MAX, &mbs, loc); if (clen == (size_t)-1 || clen == (size_t)-2) { wc = *sc; clen = 1; -@@ -689,12 +730,12 @@ +@@ -663,12 +739,12 @@ glob3(Char *pathbuf, Char *pathend, Char break; sc += clen; } @@ -378,45 +453,79 @@ if (err) break; } -@@ -721,11 +762,12 @@ +@@ -681,6 +757,7 @@ glob3(Char *pathbuf, Char *pathend, Char + } + + ++#ifndef BUILDING_VARIANT + /* + * Extend the gl_pathv member of a glob_t structure to accomodate a new item, + * add the new item, and update gl_pathc. +@@ -695,20 +772,18 @@ glob3(Char *pathbuf, Char *pathend, Char * Either gl_pathc is zero and gl_pathv is NULL; or gl_pathc > 0 and * gl_pathv points to (gl_offs + gl_pathc + 1) items. */ -static int --globextend(path, pglob, limit) +-globextend(const Char *path, glob_t *pglob, size_t *limit) +__private_extern__ int -+globextend(path, pglob, limit, loc) - const Char *path; - glob_t *pglob; - int *limit; -+ locale_t loc; ++globextend(const Char *path, glob_t *pglob, struct glob_limit *limit, locale_t loc) { char **pathv; - int i; -@@ -760,9 +802,9 @@ + size_t i, newsize, len; + char *copy; + const Char *p; + +- if (*limit && pglob->gl_pathc > *limit) { +- errno = 0; +- return (GLOB_NOSPACE); +- } +- + newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs); ++ if ((pglob->gl_flags & GLOB_LIMIT) && ++ newsize > GLOB_LIMIT_PATH * sizeof(*pathv)) ++ goto nospace; + pathv = pglob->gl_pathv ? + realloc((char *)pglob->gl_pathv, newsize) : + malloc(newsize); +@@ -730,24 +805,33 @@ globextend(const Char *path, glob_t *pgl for (p = path; *p++;) continue; - len = MB_CUR_MAX * (size_t)(p - path); /* XXX overallocation */ + len = MB_CUR_MAX_L(loc) * (size_t)(p - path); /* XXX overallocation */ ++ limit->l_string += len; if ((copy = malloc(len)) != NULL) { - if (g_Ctoc(path, copy, len)) { + if (g_Ctoc(path, copy, len, loc)) { free(copy); return (GLOB_NOSPACE); } -@@ -777,8 +819,9 @@ + pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; + } + pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; ++ ++ if ((pglob->gl_flags & GLOB_LIMIT) && ++ (newsize + limit->l_string) >= GLOB_LIMIT_STRING) ++ goto nospace; ++ + return(copy == NULL ? GLOB_NOSPACE : 0); ++nospace: ++ errno = 0; ++ return GLOB_NOSPACE; + } + + /* + * pattern matching function for filenames. Each occurrence of the * * pattern causes a recursion level. */ - static int --match(name, pat, patend) -+match(name, pat, patend, loc) - Char *name, *pat, *patend; -+ locale_t loc; +-static int +-match(Char *name, Char *pat, Char *patend) ++__private_extern__ int ++match(Char *name, Char *pat, Char *patend, locale_t loc) { int ok, negate_range; Char c, k; -@@ -790,7 +833,7 @@ +@@ -759,7 +843,7 @@ match(Char *name, Char *pat, Char *paten if (pat == patend) return(1); do @@ -425,7 +534,7 @@ return(1); while (*name++ != EOS); return(0); -@@ -806,10 +849,10 @@ +@@ -775,10 +859,10 @@ match(Char *name, Char *pat, Char *paten ++pat; while (((c = *pat++) & M_MASK) != M_END) if ((*pat & M_MASK) == M_RNG) { @@ -439,15 +548,15 @@ ) ok = 1; pat += 2; -@@ -846,16 +889,17 @@ +@@ -812,16 +896,17 @@ globfree(glob_t *pglob) + pglob->gl_pathv = NULL; + } } ++#endif /* !BUILDING_VARIANT */ static DIR * --g_opendir(str, pglob) -+g_opendir(str, pglob, loc) - Char *str; - glob_t *pglob; -+ locale_t loc; +-g_opendir(Char *str, glob_t *pglob) ++g_opendir(Char *str, glob_t *pglob, locale_t loc) { char buf[MAXPATHLEN]; @@ -459,19 +568,12 @@ return (NULL); } -@@ -864,16 +908,18 @@ - - return(opendir(buf)); +@@ -832,11 +917,11 @@ g_opendir(Char *str, glob_t *pglob) } -+#endif /* !BUILDING_VARIANT */ static int --g_lstat(fn, sb, pglob) -+g_lstat(fn, sb, pglob, loc) - Char *fn; - struct stat *sb; - glob_t *pglob; -+ locale_t loc; +-g_lstat(Char *fn, struct stat *sb, glob_t *pglob) ++g_lstat(Char *fn, struct stat *sb, glob_t *pglob, locale_t loc) { char buf[MAXPATHLEN]; @@ -480,16 +582,12 @@ errno = ENAMETOOLONG; return (-1); } -@@ -883,14 +929,15 @@ +@@ -846,11 +931,11 @@ g_lstat(Char *fn, struct stat *sb, glob_ } static int --g_stat(fn, sb, pglob) -+g_stat(fn, sb, pglob, loc) - Char *fn; - struct stat *sb; - glob_t *pglob; -+ locale_t loc; +-g_stat(Char *fn, struct stat *sb, glob_t *pglob) ++g_stat(Char *fn, struct stat *sb, glob_t *pglob, locale_t loc) { char buf[MAXPATHLEN]; @@ -498,26 +596,24 @@ errno = ENAMETOOLONG; return (-1); } -@@ -899,6 +946,7 @@ +@@ -859,7 +944,8 @@ g_stat(Char *fn, struct stat *sb, glob_t return(stat(buf, sb)); } +-static const Char * +#ifndef BUILDING_VARIANT - static Char * - g_strchr(str, ch) - Char *str; -@@ -911,18 +959,20 @@ ++__private_extern__ const Char * + g_strchr(const Char *str, wchar_t ch) + { + +@@ -870,15 +956,16 @@ g_strchr(const Char *str, wchar_t ch) return (NULL); } -static int --g_Ctoc(str, buf, len) +-g_Ctoc(const Char *str, char *buf, size_t len) +__private_extern__ int -+g_Ctoc(str, buf, len, loc) - const Char *str; - char *buf; - u_int len; -+ locale_t loc; ++g_Ctoc(const Char *str, char *buf, size_t len, locale_t loc) { mbstate_t mbs; size_t clen; @@ -531,7 +627,7 @@ if (clen == (size_t)-1) return (1); if (*str == L'\0') -@@ -954,3 +1004,4 @@ +@@ -908,3 +995,4 @@ qprintf(const char *str, Char *s) (void)printf("\n"); } #endif