aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-06-18 19:04:25 +0000
committerCorinna Vinschen <corinna@vinschen.de>2005-06-18 19:04:25 +0000
commitfa2d9fc5282c677e6dbbe5e2bb85541b194ed6c4 (patch)
treee14a9548f714d11b9a2b247f4bec12ba23037849
parentdae4a4c93c88deee4d38fb88b6c66e5c87a8e828 (diff)
downloadnewlib-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/ChangeLog11
-rw-r--r--winsup/cygwin/glob.c50
-rw-r--r--winsup/cygwin/include/cygwin/version.h3
-rw-r--r--winsup/cygwin/include/glob.h1
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. */