|
@@ -100,9 +100,11 @@ 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;
|
|
|
- if (p2 && de->d_name[0]=='.' && !de->d_name[1])
|
|
|
- continue;
|
|
|
- if (p2 && de->d_name[0]=='.' && de->d_name[1]=='.' && !de->d_name[2])
|
|
|
+ /* 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);
|