fix regression in glob with literal . or .. path component
[musl] / src / regex / glob.c
index 2d4d562..8567198 100644 (file)
@@ -100,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] = '/';