Module Name: src
Committed By: christos
Date: Tue Dec 18 01:39:56 UTC 2012
Modified Files:
src/lib/libc/gen: glob.c
Log Message:
Do as the man page says, and for GLOB_NOCHECK return the original pattern,
not a modified version with the backslash characters removed.
To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/lib/libc/gen/glob.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/gen/glob.c
diff -u src/lib/libc/gen/glob.c:1.31 src/lib/libc/gen/glob.c:1.32
--- src/lib/libc/gen/glob.c:1.31 Sun Oct 30 17:53:43 2011
+++ src/lib/libc/gen/glob.c Mon Dec 17 20:39:56 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: glob.c,v 1.31 2011/10/30 21:53:43 christos Exp $ */
+/* $NetBSD: glob.c,v 1.32 2012/12/18 01:39:56 christos Exp $ */
/*
* Copyright (c) 1989, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93";
#else
-__RCSID("$NetBSD: glob.c,v 1.31 2011/10/30 21:53:43 christos Exp $");
+__RCSID("$NetBSD: glob.c,v 1.32 2012/12/18 01:39:56 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -163,7 +163,7 @@ static int g_lstat(Char *, __gl_stat_t
static DIR *g_opendir(Char *, glob_t *);
static Char *g_strchr(const Char *, int);
static int g_stat(Char *, __gl_stat_t *, glob_t *);
-static int glob0(const Char *, glob_t *, struct glob_limit *);
+static int glob0(const char *, const Char *, glob_t *, struct glob_limit *);
static int glob1(Char *, glob_t *, struct glob_limit *);
static int glob2(Char *, Char *, Char *, const Char *, glob_t *,
struct glob_limit *);
@@ -171,8 +171,8 @@ static int glob3(Char *, Char *, Char *
const Char *, glob_t *, struct glob_limit *);
static int globextend(const Char *, glob_t *, struct glob_limit *);
static const Char *globtilde(const Char *, Char *, size_t, glob_t *);
-static int globexp1(const Char *, glob_t *, struct glob_limit *);
-static int globexp2(const Char *, const Char *, glob_t *, int *,
+static int globexp1(const char *, const Char *, glob_t *, struct glob_limit *);
+static int globexp2(const char *, const Char *, const Char *, glob_t *, int *,
struct glob_limit *);
static int match(const Char *, const Char *, const Char *);
#ifdef DEBUG
@@ -222,9 +222,9 @@ glob(const char * __restrict pattern, in
*bufnext = EOS;
if (flags & GLOB_BRACE)
- return globexp1(patbuf, pglob, &limit);
+ return globexp1(pattern, patbuf, pglob, &limit);
else
- return glob0(patbuf, pglob, &limit);
+ return glob0(pattern, patbuf, pglob, &limit);
}
/*
@@ -233,7 +233,7 @@ glob(const char * __restrict pattern, in
* characters
*/
static int
-globexp1(const Char *pattern, glob_t *pglob, struct glob_limit *limit)
+globexp1(const char *orig, const Char *pattern, glob_t *pglob, struct glob_limit *limit)
{
const Char* ptr = pattern;
int rv;
@@ -249,13 +249,13 @@ globexp1(const Char *pattern, glob_t *pg
/* 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(orig, pattern, pglob, limit);
while ((ptr = (const Char *) g_strchr(ptr, LBRACE)) != NULL)
- if (!globexp2(ptr, pattern, pglob, &rv, limit))
+ if (!globexp2(orig, ptr, pattern, pglob, &rv, limit))
return rv;
- return glob0(pattern, pglob, limit);
+ return glob0(orig, pattern, pglob, limit);
}
@@ -265,7 +265,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(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv,
+globexp2(const char *orig, const Char *ptr, const Char *pattern, glob_t *pglob, int *rv,
struct glob_limit *limit)
{
int i;
@@ -311,7 +311,7 @@ globexp2(const Char *ptr, const Char *pa
* we use `pattern', not `patbuf' here so that that
* unbalanced braces are passed to the match
*/
- *rv = glob0(pattern, pglob, limit);
+ *rv = glob0(orig, pattern, pglob, limit);
return 0;
}
@@ -358,7 +358,7 @@ globexp2(const Char *ptr, const Char *pa
#ifdef DEBUG
qprintf("globexp2", patbuf);
#endif
- *rv = globexp1(patbuf, pglob, limit);
+ *rv = globexp1(orig, patbuf, pglob, limit);
/* move after the comma, to the next string */
pl = pm + 1;
@@ -471,7 +471,7 @@ globtilde(const Char *pattern, Char *pat
* to find no matches.
*/
static int
-glob0(const Char *pattern, glob_t *pglob, struct glob_limit *limit)
+glob0(const char *orig, const Char *pattern, glob_t *pglob, struct glob_limit *limit)
{
const Char *qpatnext;
int c, error;
@@ -556,7 +556,17 @@ glob0(const Char *pattern, glob_t *pglob
if ((pglob->gl_flags & GLOB_NOCHECK) ||
((pglob->gl_flags & (GLOB_NOMAGIC|GLOB_MAGCHAR))
== GLOB_NOMAGIC)) {
- return globextend(pattern, pglob, limit);
+ const u_char *patnext;
+ Char *bufend;
+ bufend = patbuf + MAXPATHLEN;
+ patnext = (const unsigned char *)orig;
+ bufnext = patbuf;
+ while (bufnext < bufend && (c = *patnext++) != EOS)
+ *bufnext++ = c;
+
+ *bufnext = EOS;
+
+ return globextend(patbuf, pglob, limit);
} else {
return GLOB_NOMATCH;
}