diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-06-18 19:04:25 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-06-18 19:04:25 +0000 |
commit | fa2d9fc5282c677e6dbbe5e2bb85541b194ed6c4 (patch) | |
tree | e14a9548f714d11b9a2b247f4bec12ba23037849 | |
parent | dae4a4c93c88deee4d38fb88b6c66e5c87a8e828 (diff) | |
download | newlib-fa2d9fc5282c677e6dbbe5e2bb85541b194ed6c4.zip newlib-fa2d9fc5282c677e6dbbe5e2bb85541b194ed6c4.tar.gz newlib-fa2d9fc5282c677e6dbbe5e2bb85541b194ed6c4.tar.bz2 |
* glob.c: (glob0): New local variable `limit`. Use in calls to glob1
and globextend.
(glob1): Add `limit' parameter.
(glob2): Ditto.
(glob3): Ditto.
(globextend): Ditto. Implement GLOB_LIMIT handling.
* include/glob.h (GLOB_LIMIT): New define.
* include/cygwin/version.h: Bump API minor number.
-rw-r--r-- | winsup/cygwin/ChangeLog | 11 | ||||
-rw-r--r-- | winsup/cygwin/glob.c | 50 | ||||
-rw-r--r-- | winsup/cygwin/include/cygwin/version.h | 3 | ||||
-rw-r--r-- | winsup/cygwin/include/glob.h | 1 |
4 files changed, 48 insertions, 17 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 5d94cff..73b8a63 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,14 @@ +2005-06-18 Corinna Vinschen <corinna@vinschen.de> + + * glob.c: (glob0): New local variable `limit`. Use in calls to glob1 + and globextend. + (glob1): Add `limit' parameter. + (glob2): Ditto. + (glob3): Ditto. + (globextend): Ditto. Implement GLOB_LIMIT handling. + * include/glob.h (GLOB_LIMIT): New define. + * include/cygwin/version.h: Bump API minor number. + 2005-06-17 Christopher Faylor <cgf@timesys.com> * wincap.h (wincaps::detect_win16_exe): Declare. diff --git a/winsup/cygwin/glob.c b/winsup/cygwin/glob.c index 1db8685..08eecbe 100644 --- a/winsup/cygwin/glob.c +++ b/winsup/cygwin/glob.c @@ -83,6 +83,10 @@ #include "perprocess.h" #include "cygwin/version.h" +#ifndef ARG_MAX +#define ARG_MAX 32000 /* See CreateProcess */ +#endif + #ifdef __weak_alias #ifdef __LIBC12_SOURCE__ __weak_alias(glob,_glob); @@ -160,10 +164,10 @@ static Char *g_strcat __P((Char *, const Char *)); #endif static int g_stat __P((Char *, struct STAT *, glob_t *)); static int glob0 __P((const Char *, glob_t *)); -static int glob1 __P((Char *, glob_t *)); -static int glob2 __P((Char *, Char *, Char *, glob_t *)); -static int glob3 __P((Char *, Char *, Char *, Char *, glob_t *)); -static int globextend __P((const Char *, glob_t *)); +static int glob1 __P((Char *, glob_t *, size_t *)); +static int glob2 __P((Char *, Char *, Char *, glob_t *, size_t *)); +static int glob3 __P((Char *, Char *, Char *, Char *, glob_t *, size_t *)); +static int globextend __P((const Char *, glob_t *, size_t *)); static const Char * globtilde __P((const Char *, Char *, glob_t *)); static int globexp1 __P((const Char *, glob_t *)); static int globexp2 __P((const Char *, const Char *, glob_t *, int *)); @@ -428,6 +432,7 @@ glob0(pattern, pglob) const Char *qpatnext; int c, err, oldpathc; Char *bufnext, patbuf[MAXPATHLEN+1]; + size_t limit = 0; qpatnext = globtilde(pattern, patbuf, pglob); oldpathc = pglob->gl_pathc; @@ -485,7 +490,7 @@ glob0(pattern, pglob) qprintf("glob0:", patbuf); #endif - if ((err = glob1(patbuf, pglob)) != 0) + if ((err = glob1(patbuf, pglob, &limit)) != 0) return(err); /* @@ -498,7 +503,7 @@ glob0(pattern, pglob) ((pglob->gl_flags & GLOB_NOCHECK) || ((pglob->gl_flags & GLOB_NOMAGIC) && !(pglob->gl_flags & GLOB_MAGCHAR)))) - return(globextend(pattern, pglob)); + return(globextend(pattern, pglob, &limit)); else if (!(pglob->gl_flags & GLOB_NOSORT)) qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc, pglob->gl_pathc - oldpathc, sizeof(char *), compare); @@ -513,16 +518,17 @@ compare(p, q) } static int -glob1(pattern, pglob) +glob1(pattern, pglob, limit) Char *pattern; glob_t *pglob; + size_t *limit; { Char pathbuf[MAXPATHLEN+1]; /* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */ if (*pattern == EOS) return(0); - return(glob2(pathbuf, pathbuf, pattern, pglob)); + return(glob2(pathbuf, pathbuf, pattern, pglob, limit)); } /* @@ -531,9 +537,10 @@ glob1(pattern, pglob) * meta characters. */ static int -glob2(pathbuf, pathend, pattern, pglob) +glob2(pathbuf, pathend, pattern, pglob, limit) Char *pathbuf, *pathend, *pattern; glob_t *pglob; + size_t *limit; { struct STAT sb; Char *p, *q; @@ -558,7 +565,7 @@ glob2(pathbuf, pathend, pattern, pglob) *pathend = EOS; } ++pglob->gl_matchc; - return(globextend(pathbuf, pglob)); + return(globextend(pathbuf, pglob, limit)); } /* Find end of next segment, copy tentatively to pathend. */ @@ -576,15 +583,17 @@ glob2(pathbuf, pathend, pattern, pglob) while (*pattern == SEP) *pathend++ = *pattern++; } else /* Need expansion, recurse. */ - return(glob3(pathbuf, pathend, pattern, p, pglob)); + return(glob3(pathbuf, pathend, pattern, p, pglob, + limit)); } /* NOTREACHED */ } static int -glob3(pathbuf, pathend, pattern, restpattern, pglob) +glob3(pathbuf, pathend, pattern, restpattern, pglob, limit) Char *pathbuf, *pathend, *pattern, *restpattern; glob_t *pglob; + size_t *limit; { register struct dirent *dp; DIR *dirp; @@ -634,7 +643,7 @@ glob3(pathbuf, pathend, pattern, restpattern, pglob) *pathend = EOS; continue; } - err = glob2(pathbuf, --dc, restpattern, pglob); + err = glob2(pathbuf, --dc, restpattern, pglob, limit); if (err) break; } @@ -662,13 +671,14 @@ glob3(pathbuf, pathend, pattern, restpattern, pglob) * gl_pathv points to (gl_offs + gl_pathc + 1) items. */ static int -globextend(path, pglob) +globextend(path, pglob, limit) const Char *path; glob_t *pglob; + size_t *limit; { register char **pathv; register int i; - u_int newsize; + size_t newsize, len; char *copy; const Char *p; @@ -689,11 +699,19 @@ globextend(path, pglob) for (p = path; *p++;) continue; - if ((copy = malloc(p - path)) != NULL) { + len = (size_t)(p - path); + *limit += len; + if ((copy = malloc(len)) != NULL) { g_Ctoc(path, copy); pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; } pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; + + if ((pglob->gl_flags & GLOB_LIMIT) && (newsize + *limit) >= ARG_MAX) { + errno = 0; + return(GLOB_NOSPACE); + } + return(copy == NULL ? GLOB_NOSPACE : 0); } diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 88d95da..dcf9a61 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -258,12 +258,13 @@ details. */ 129: Export mkdtemp. 130: Export strtoimax, strtoumax, llabs, imaxabs, lldiv, imaxdiv. 131: Export inet_ntop, inet_pton. + 132: Add GLOB_LIMIT flag to glob. */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 131 +#define CYGWIN_VERSION_API_MINOR 132 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/include/glob.h b/winsup/cygwin/include/glob.h index 6a393f0..bfcf306 100644 --- a/winsup/cygwin/include/glob.h +++ b/winsup/cygwin/include/glob.h @@ -90,6 +90,7 @@ typedef struct { #define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */ #define GLOB_QUOTE 0x0400 /* Quote special chars with \. */ #define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ +#define GLOB_LIMIT 0x1000 /* Limit memory used by matches to ARG_MAX */ #endif #define GLOB_NOSPACE (-1) /* Malloc call failed. */ |