svn commit: r303010 - head/lib/libc/gen
Andrey A. Chernov
ache at FreeBSD.org
Mon Jul 18 18:24:32 UTC 2016
Author: ache
Date: Mon Jul 18 18:24:31 2016
New Revision: 303010
URL: https://svnweb.freebsd.org/changeset/base/303010
Log:
1) Add all characters from ~ expansion as protected to be not interpreted
as pattern meta chars.
2) GLOB_ERR and gl_errfunc are supposed to work only for real directories
per POSIX, so don't act on missing or plain files, for ENOENT or ENOTDIR
(as TODO in the code suggested).
3) Remove the hack in the manpage describing how to skip ENOENT and ENOTDIR
in gl_errfunc, it is unneeded now.
4) Set errno to ENAMETOOLONG if g_Ctoc() expansion fails in g_opendir(),
as in other places in the code which are wrappers around system functions.
Modified:
head/lib/libc/gen/glob.3
head/lib/libc/gen/glob.c
Modified: head/lib/libc/gen/glob.3
==============================================================================
--- head/lib/libc/gen/glob.3 Mon Jul 18 16:58:47 2016 (r303009)
+++ head/lib/libc/gen/glob.3 Mon Jul 18 18:24:31 2016 (r303010)
@@ -275,24 +275,10 @@ is
.Pf non- Dv NULL ,
.Fn glob
calls
-.Fa \*(lp*errfunc\*(rp Ns ( Fa path , errno ) .
-This may be unintuitive: a pattern like
-.Ql */Makefile
-will try to
-.Xr stat 2
-.Ql foo/Makefile
-even if
-.Ql foo
-is not a directory, resulting in a
-call to
-.Fa errfunc .
-The error routine can suppress this action by testing for
-.Er ENOENT
-and
-.Er ENOTDIR ;
+.Fa \*(lp*errfunc\*(rp Ns ( Fa path , errno ) ,
however, the
.Dv GLOB_ERR
-flag will still cause an immediate
+flag will cause an immediate
return when this happens.
.Pp
If
Modified: head/lib/libc/gen/glob.c
==============================================================================
--- head/lib/libc/gen/glob.c Mon Jul 18 16:58:47 2016 (r303009)
+++ head/lib/libc/gen/glob.c Mon Jul 18 18:24:31 2016 (r303010)
@@ -478,7 +478,7 @@ globtilde(const Char *pattern, Char *pat
return (NULL);
dc = wbuf;
- for (b = patbuf; b < eb && *dc != EOS; *b++ = *dc++)
+ for (b = patbuf; b < eb && *dc != EOS; *b++ = *dc++ | M_PROTECT)
continue;
if (*dc != EOS)
return (NULL);
@@ -712,7 +712,8 @@ glob3(Char *pathbuf, Char *pathend, Char
*pathend = EOS;
if ((dirp = g_opendir(pathbuf, pglob)) == NULL) {
- /* TODO: don't call for ENOENT or ENOTDIR? */
+ if (errno == ENOENT || errno == ENOTDIR)
+ return (0);
if (pglob->gl_flags & GLOB_ERR)
return (GLOB_ABORTED);
if (pglob->gl_errfunc) {
@@ -937,8 +938,10 @@ g_opendir(Char *str, glob_t *pglob)
if (*str == EOS)
strcpy(buf, ".");
else {
- if (g_Ctoc(str, buf, sizeof(buf)))
+ if (g_Ctoc(str, buf, sizeof(buf))) {
+ errno = ENAMETOOLONG;
return (NULL);
+ }
}
if (pglob->gl_flags & GLOB_ALTDIRFUNC)
More information about the svn-src-all
mailing list