X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fregex%2Fglob.c;h=856719853897d29435e5b7c6122ffeff93f5bcd0;hb=187bcc3bf40bf187c5d76d206b04028fa8ca403b;hp=6c07e6b3b5f817f57af09cd9e0a74a0d85bb0fc7;hpb=400c5e5c8307a2ebe44ef1f203f5a15669f20347;p=musl diff --git a/src/regex/glob.c b/src/regex/glob.c index 6c07e6b3..85671985 100644 --- a/src/regex/glob.c +++ b/src/regex/glob.c @@ -7,8 +7,6 @@ #include #include #include -#include -#include #include "libc.h" struct match @@ -102,6 +100,12 @@ static int match_in_dir(const char *d, const char *p, int flags, int (*errfunc)( continue; if (p2 && de->d_type && !S_ISDIR(de->d_type<<12) && !S_ISLNK(de->d_type<<12)) continue; + /* With GLOB_PERIOD, don't allow matching . or .. unless + * fnmatch would match them with FNM_PERIOD rules in effect. */ + if (p2 && (flags & GLOB_PERIOD) && de->d_name[0]=='.' + && (!de->d_name[1] || de->d_name[1]=='.' && !de->d_name[2]) + && fnmatch(p, de->d_name, fnm_flags | FNM_PERIOD)) + continue; if (*d) { memcpy(name, d, l); name[l] = '/'; @@ -171,8 +175,6 @@ int glob(const char *restrict pat, int flags, int (*errfunc)(const char *path, i d = ""; } - if (strlen(p) > PATH_MAX) return GLOB_NOSPACE; - if (!errfunc) errfunc = ignore_err; if (!(flags & GLOB_APPEND)) { @@ -181,7 +183,9 @@ int glob(const char *restrict pat, int flags, int (*errfunc)(const char *path, i g->gl_pathv = NULL; } - if (*p) error = match_in_dir(d, p, flags, errfunc, &tail); + if (strnlen(p, PATH_MAX+1) > PATH_MAX) return GLOB_NOSPACE; + + if (*pat) error = match_in_dir(d, p, flags, errfunc, &tail); if (error == GLOB_NOSPACE) { freelist(&head); return error;