Update copyright dates with scripts/update-copyrights
[glibc.git] / posix / glob.c
blob6f24a8e1923961181dfe70638c408bda0118124f
1 /* Copyright (C) 1991-2021 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
18 #include <glob.h>
20 #include <errno.h>
21 #include <sys/types.h>
22 #include <sys/stat.h>
23 #include <stdbool.h>
24 #include <stddef.h>
25 #include <stdint.h>
26 #include <assert.h>
27 #include <unistd.h>
29 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
30 # define WINDOWS32
31 #endif
33 #ifndef WINDOWS32
34 # include <pwd.h>
35 #endif
37 #include <errno.h>
38 #include <dirent.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include <alloca.h>
43 #ifdef _LIBC
44 # undef strdup
45 # define strdup(str) __strdup (str)
46 # define sysconf(id) __sysconf (id)
47 # define closedir(dir) __closedir (dir)
48 # define opendir(name) __opendir (name)
49 # define readdir(str) __readdir64 (str)
50 # define getpwnam_r(name, bufp, buf, len, res) \
51 __getpwnam_r (name, bufp, buf, len, res)
52 # define struct_stat64 struct stat64
53 # define FLEXIBLE_ARRAY_MEMBER
54 # include <shlib-compat.h>
55 #else /* !_LIBC */
56 # define __glob glob
57 # define __getlogin_r(buf, len) getlogin_r (buf, len)
58 # define __lstat64(fname, buf) lstat (fname, buf)
59 # define __stat64(fname, buf) stat (fname, buf)
60 # define struct_stat64 struct stat
61 # ifndef __MVS__
62 # define __alloca alloca
63 # endif
64 # define __readdir readdir
65 # define COMPILE_GLOB64
66 #endif /* _LIBC */
68 #include <fnmatch.h>
70 #include <flexmember.h>
71 #include <glob_internal.h>
72 #include <scratch_buffer.h>
74 static const char *next_brace_sub (const char *begin, int flags) __THROWNL;
76 typedef uint_fast8_t dirent_type;
78 #if !defined _LIBC && !defined HAVE_STRUCT_DIRENT_D_TYPE
79 /* Any distinct values will do here.
80 Undef any existing macros out of the way. */
81 # undef DT_UNKNOWN
82 # undef DT_DIR
83 # undef DT_LNK
84 # define DT_UNKNOWN 0
85 # define DT_DIR 1
86 # define DT_LNK 2
87 #endif
89 /* A representation of a directory entry which does not depend on the
90 layout of struct dirent, or the size of ino_t. */
91 struct readdir_result
93 const char *name;
94 #if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
95 dirent_type type;
96 #endif
99 /* Initialize and return type member of struct readdir_result. */
100 static dirent_type
101 readdir_result_type (struct readdir_result d)
103 #if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
104 # define D_TYPE_TO_RESULT(source) (source)->d_type,
105 return d.type;
106 #else
107 # define D_TYPE_TO_RESULT(source)
108 return DT_UNKNOWN;
109 #endif
112 /* Construct an initializer for a struct readdir_result object from a
113 struct dirent *. No copy of the name is made. */
114 #define READDIR_RESULT_INITIALIZER(source) \
116 source->d_name, \
117 D_TYPE_TO_RESULT (source) \
120 /* Call gl_readdir on STREAM. This macro can be overridden to reduce
121 type safety if an old interface version needs to be supported. */
122 #ifndef GL_READDIR
123 # define GL_READDIR(pglob, stream) ((pglob)->gl_readdir (stream))
124 #endif
126 /* Extract name and type from directory entry. No copy of the name is
127 made. If SOURCE is NULL, result name is NULL. Keep in sync with
128 convert_dirent64 below. */
129 static struct readdir_result
130 convert_dirent (const struct dirent *source)
132 if (source == NULL)
134 struct readdir_result result = { NULL, };
135 return result;
137 struct readdir_result result = READDIR_RESULT_INITIALIZER (source);
138 return result;
141 #ifndef COMPILE_GLOB64
142 /* Like convert_dirent, but works on struct dirent64 instead. Keep in
143 sync with convert_dirent above. */
144 static struct readdir_result
145 convert_dirent64 (const struct dirent64 *source)
147 if (source == NULL)
149 struct readdir_result result = { NULL, };
150 return result;
152 struct readdir_result result = READDIR_RESULT_INITIALIZER (source);
153 return result;
155 #endif
157 #ifndef _LIBC
158 /* The results of opendir() in this file are not used with dirfd and fchdir,
159 and we do not leak fds to any single-threaded code that could use stdio,
160 therefore save some unnecessary recursion in fchdir.c and opendir_safer.c.
161 FIXME - if the kernel ever adds support for multi-thread safety for
162 avoiding standard fds, then we should use opendir_safer. */
163 # ifdef GNULIB_defined_opendir
164 # undef opendir
165 # endif
166 # ifdef GNULIB_defined_closedir
167 # undef closedir
168 # endif
170 /* Just use malloc. */
171 # define __libc_use_alloca(n) false
172 # define alloca_account(len, avar) ((void) (len), (void) (avar), (void *) 0)
173 # define extend_alloca_account(buf, len, newlen, avar) \
174 ((void) (buf), (void) (len), (void) (newlen), (void) (avar), (void *) 0)
175 #endif
177 static int
178 glob_lstat (glob_t *pglob, int flags, const char *fullname)
180 /* Use on glob-lstat-compat.c to provide a compat symbol which does not
181 use lstat / gl_lstat. */
182 #ifdef GLOB_NO_LSTAT
183 # define GL_LSTAT gl_stat
184 # define LSTAT64 __stat64
185 #else
186 # define GL_LSTAT gl_lstat
187 # define LSTAT64 __lstat64
188 #endif
190 union
192 struct stat st;
193 struct_stat64 st64;
194 } ust;
195 return (__glibc_unlikely (flags & GLOB_ALTDIRFUNC)
196 ? pglob->GL_LSTAT (fullname, &ust.st)
197 : LSTAT64 (fullname, &ust.st64));
200 /* Set *R = A + B. Return true if the answer is mathematically
201 incorrect due to overflow; in this case, *R is the low order
202 bits of the correct answer. */
204 static bool
205 size_add_wrapv (size_t a, size_t b, size_t *r)
207 #if 5 <= __GNUC__ && !defined __ICC
208 return __builtin_add_overflow (a, b, r);
209 #else
210 *r = a + b;
211 return *r < a;
212 #endif
215 static bool
216 glob_use_alloca (size_t alloca_used, size_t len)
218 size_t size;
219 return (!size_add_wrapv (alloca_used, len, &size)
220 && __libc_use_alloca (size));
223 static int glob_in_dir (const char *pattern, const char *directory,
224 int flags, int (*errfunc) (const char *, int),
225 glob_t *pglob, size_t alloca_used);
226 static int prefix_array (const char *prefix, char **array, size_t n) __THROWNL;
227 static int collated_compare (const void *, const void *) __THROWNL;
230 /* Return true if FILENAME is a directory or a symbolic link to a directory.
231 Use FLAGS and PGLOB to resolve the filename. */
232 static bool
233 is_dir (char const *filename, int flags, glob_t const *pglob)
235 struct stat st;
236 struct_stat64 st64;
237 return (__glibc_unlikely (flags & GLOB_ALTDIRFUNC)
238 ? pglob->gl_stat (filename, &st) == 0 && S_ISDIR (st.st_mode)
239 : __stat64 (filename, &st64) == 0 && S_ISDIR (st64.st_mode));
242 /* Find the end of the sub-pattern in a brace expression. */
243 static const char *
244 next_brace_sub (const char *cp, int flags)
246 size_t depth = 0;
247 while (*cp != '\0')
248 if ((flags & GLOB_NOESCAPE) == 0 && *cp == '\\')
250 if (*++cp == '\0')
251 break;
252 ++cp;
254 else
256 if ((*cp == '}' && depth-- == 0) || (*cp == ',' && depth == 0))
257 break;
259 if (*cp++ == '{')
260 depth++;
263 return *cp != '\0' ? cp : NULL;
266 #ifndef GLOB_ATTRIBUTE
267 # define GLOB_ATTRIBUTE
268 #endif
270 /* Do glob searching for PATTERN, placing results in PGLOB.
271 The bits defined above may be set in FLAGS.
272 If a directory cannot be opened or read and ERRFUNC is not nil,
273 it is called with the pathname that caused the error, and the
274 'errno' value from the failing call; if it returns non-zero
275 'glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
276 If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
277 Otherwise, 'glob' returns zero. */
279 GLOB_ATTRIBUTE
280 __glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
281 glob_t *pglob)
283 const char *filename;
284 char *dirname = NULL;
285 size_t dirlen;
286 int status;
287 size_t oldcount;
288 int meta;
289 int dirname_modified;
290 int malloc_dirname = 0;
291 glob_t dirs;
292 int retval = 0;
293 size_t alloca_used = 0;
295 if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
297 __set_errno (EINVAL);
298 return -1;
301 /* POSIX requires all slashes to be matched. This means that with
302 a trailing slash we must match only directories. */
303 if (pattern[0] && pattern[strlen (pattern) - 1] == '/')
304 flags |= GLOB_ONLYDIR;
306 if (!(flags & GLOB_DOOFFS))
307 /* Have to do this so 'globfree' knows where to start freeing. It
308 also makes all the code that uses gl_offs simpler. */
309 pglob->gl_offs = 0;
311 if (!(flags & GLOB_APPEND))
313 pglob->gl_pathc = 0;
314 if (!(flags & GLOB_DOOFFS))
315 pglob->gl_pathv = NULL;
316 else
318 size_t i;
320 if (pglob->gl_offs >= ~((size_t) 0) / sizeof (char *))
321 return GLOB_NOSPACE;
323 pglob->gl_pathv = (char **) malloc ((pglob->gl_offs + 1)
324 * sizeof (char *));
325 if (pglob->gl_pathv == NULL)
326 return GLOB_NOSPACE;
328 for (i = 0; i <= pglob->gl_offs; ++i)
329 pglob->gl_pathv[i] = NULL;
333 if (flags & GLOB_BRACE)
335 const char *begin;
337 if (flags & GLOB_NOESCAPE)
338 begin = strchr (pattern, '{');
339 else
341 begin = pattern;
342 while (1)
344 if (*begin == '\0')
346 begin = NULL;
347 break;
350 if (*begin == '\\' && begin[1] != '\0')
351 ++begin;
352 else if (*begin == '{')
353 break;
355 ++begin;
359 if (begin != NULL)
361 /* Allocate working buffer large enough for our work. Note that
362 we have at least an opening and closing brace. */
363 size_t firstc;
364 char *alt_start;
365 const char *p;
366 const char *next;
367 const char *rest;
368 size_t rest_len;
369 char *onealt;
370 size_t pattern_len = strlen (pattern) - 1;
371 int alloca_onealt = glob_use_alloca (alloca_used, pattern_len);
372 if (alloca_onealt)
373 onealt = alloca_account (pattern_len, alloca_used);
374 else
376 onealt = malloc (pattern_len);
377 if (onealt == NULL)
378 return GLOB_NOSPACE;
381 /* We know the prefix for all sub-patterns. */
382 alt_start = mempcpy (onealt, pattern, begin - pattern);
384 /* Find the first sub-pattern and at the same time find the
385 rest after the closing brace. */
386 next = next_brace_sub (begin + 1, flags);
387 if (next == NULL)
389 /* It is an invalid expression. */
390 illegal_brace:
391 if (__glibc_unlikely (!alloca_onealt))
392 free (onealt);
393 flags &= ~GLOB_BRACE;
394 goto no_brace;
397 /* Now find the end of the whole brace expression. */
398 rest = next;
399 while (*rest != '}')
401 rest = next_brace_sub (rest + 1, flags);
402 if (rest == NULL)
403 /* It is an illegal expression. */
404 goto illegal_brace;
406 /* Please note that we now can be sure the brace expression
407 is well-formed. */
408 rest_len = strlen (++rest) + 1;
410 /* We have a brace expression. BEGIN points to the opening {,
411 NEXT points past the terminator of the first element, and END
412 points past the final }. We will accumulate result names from
413 recursive runs for each brace alternative in the buffer using
414 GLOB_APPEND. */
415 firstc = pglob->gl_pathc;
417 p = begin + 1;
418 while (1)
420 int result;
422 /* Construct the new glob expression. */
423 mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
425 result = __glob (onealt,
426 ((flags & ~(GLOB_NOCHECK | GLOB_NOMAGIC))
427 | GLOB_APPEND),
428 errfunc, pglob);
430 /* If we got an error, return it. */
431 if (result && result != GLOB_NOMATCH)
433 if (__glibc_unlikely (!alloca_onealt))
434 free (onealt);
435 if (!(flags & GLOB_APPEND))
437 globfree (pglob);
438 pglob->gl_pathc = 0;
440 return result;
443 if (*next == '}')
444 /* We saw the last entry. */
445 break;
447 p = next + 1;
448 next = next_brace_sub (p, flags);
449 assert (next != NULL);
452 if (__glibc_unlikely (!alloca_onealt))
453 free (onealt);
455 if (pglob->gl_pathc != firstc)
456 /* We found some entries. */
457 return 0;
458 else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
459 return GLOB_NOMATCH;
463 no_brace:
464 oldcount = pglob->gl_pathc + pglob->gl_offs;
466 /* Find the filename. */
467 filename = strrchr (pattern, '/');
469 #if defined __MSDOS__ || defined WINDOWS32
470 /* The case of "d:pattern". Since ':' is not allowed in
471 file names, we can safely assume that wherever it
472 happens in pattern, it signals the filename part. This
473 is so we could some day support patterns like "[a-z]:foo". */
474 if (filename == NULL)
475 filename = strchr (pattern, ':');
476 #endif /* __MSDOS__ || WINDOWS32 */
478 dirname_modified = 0;
479 if (filename == NULL)
481 /* This can mean two things: a simple name or "~name". The latter
482 case is nothing but a notation for a directory. */
483 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
485 dirname = (char *) pattern;
486 dirlen = strlen (pattern);
488 /* Set FILENAME to NULL as a special flag. This is ugly but
489 other solutions would require much more code. We test for
490 this special case below. */
491 filename = NULL;
493 else
495 if (__glibc_unlikely (pattern[0] == '\0'))
497 dirs.gl_pathv = NULL;
498 goto no_matches;
501 filename = pattern;
502 dirname = (char *) ".";
503 dirlen = 0;
506 else if (filename == pattern
507 || (filename == pattern + 1 && pattern[0] == '\\'
508 && (flags & GLOB_NOESCAPE) == 0))
510 /* "/pattern" or "\\/pattern". */
511 dirname = (char *) "/";
512 dirlen = 1;
513 ++filename;
515 else
517 char *newp;
518 dirlen = filename - pattern;
519 #if defined __MSDOS__ || defined WINDOWS32
520 if (*filename == ':'
521 || (filename > pattern + 1 && filename[-1] == ':'))
523 char *drive_spec;
525 ++dirlen;
526 drive_spec = __alloca (dirlen + 1);
527 *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
528 /* For now, disallow wildcards in the drive spec, to
529 prevent infinite recursion in glob. */
530 if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
531 return GLOB_NOMATCH;
532 /* If this is "d:pattern", we need to copy ':' to DIRNAME
533 as well. If it's "d:/pattern", don't remove the slash
534 from "d:/", since "d:" and "d:/" are not the same.*/
536 #endif
538 if (glob_use_alloca (alloca_used, dirlen + 1))
539 newp = alloca_account (dirlen + 1, alloca_used);
540 else
542 newp = malloc (dirlen + 1);
543 if (newp == NULL)
544 return GLOB_NOSPACE;
545 malloc_dirname = 1;
547 *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
548 dirname = newp;
549 ++filename;
551 #if defined __MSDOS__ || defined WINDOWS32
552 bool drive_root = (dirlen > 1
553 && (dirname[dirlen - 1] == ':'
554 || (dirlen > 2 && dirname[dirlen - 2] == ':'
555 && dirname[dirlen - 1] == '/')));
556 #else
557 bool drive_root = false;
558 #endif
560 if (filename[0] == '\0' && dirlen > 1 && !drive_root)
561 /* "pattern/". Expand "pattern", appending slashes. */
563 int orig_flags = flags;
564 if (!(flags & GLOB_NOESCAPE) && dirname[dirlen - 1] == '\\')
566 /* "pattern\\/". Remove the final backslash if it hasn't
567 been quoted. */
568 char *p = (char *) &dirname[dirlen - 1];
570 while (p > dirname && p[-1] == '\\') --p;
571 if ((&dirname[dirlen] - p) & 1)
573 *(char *) &dirname[--dirlen] = '\0';
574 flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
577 int val = __glob (dirname, flags | GLOB_MARK, errfunc, pglob);
578 if (val == 0)
579 pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
580 | (flags & GLOB_MARK));
581 else if (val == GLOB_NOMATCH && flags != orig_flags)
583 /* Make sure globfree (&dirs); is a nop. */
584 dirs.gl_pathv = NULL;
585 flags = orig_flags;
586 oldcount = pglob->gl_pathc + pglob->gl_offs;
587 goto no_matches;
589 retval = val;
590 goto out;
594 if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
596 if (dirname[1] == '\0' || dirname[1] == '/'
597 || (!(flags & GLOB_NOESCAPE) && dirname[1] == '\\'
598 && (dirname[2] == '\0' || dirname[2] == '/')))
600 /* Look up home directory. */
601 char *home_dir = getenv ("HOME");
602 int malloc_home_dir = 0;
603 if (home_dir == NULL || home_dir[0] == '\0')
605 #ifdef WINDOWS32
606 /* Windows NT defines HOMEDRIVE and HOMEPATH. But give
607 preference to HOME, because the user can change HOME. */
608 const char *home_drive = getenv ("HOMEDRIVE");
609 const char *home_path = getenv ("HOMEPATH");
611 if (home_drive != NULL && home_path != NULL)
613 size_t home_drive_len = strlen (home_drive);
614 size_t home_path_len = strlen (home_path);
615 char *mem = alloca (home_drive_len + home_path_len + 1);
617 memcpy (mem, home_drive, home_drive_len);
618 memcpy (mem + home_drive_len, home_path, home_path_len + 1);
619 home_dir = mem;
621 else
622 home_dir = "c:/users/default"; /* poor default */
623 #else
624 int err;
625 struct passwd *p;
626 struct passwd pwbuf;
627 struct scratch_buffer s;
628 scratch_buffer_init (&s);
629 while (true)
631 p = NULL;
632 err = __getlogin_r (s.data, s.length);
633 if (err == 0)
635 # if defined HAVE_GETPWNAM_R || defined _LIBC
636 size_t ssize = strlen (s.data) + 1;
637 char *sdata = s.data;
638 err = getpwnam_r (sdata, &pwbuf, sdata + ssize,
639 s.length - ssize, &p);
640 # else
641 p = getpwnam (s.data);
642 if (p == NULL)
643 err = errno;
644 # endif
646 if (err != ERANGE)
647 break;
648 if (!scratch_buffer_grow (&s))
650 retval = GLOB_NOSPACE;
651 goto out;
654 if (err == 0)
656 home_dir = strdup (p->pw_dir);
657 malloc_home_dir = 1;
659 scratch_buffer_free (&s);
660 if (err == 0 && home_dir == NULL)
662 retval = GLOB_NOSPACE;
663 goto out;
665 #endif /* WINDOWS32 */
667 if (home_dir == NULL || home_dir[0] == '\0')
669 if (__glibc_unlikely (malloc_home_dir))
670 free (home_dir);
671 if (flags & GLOB_TILDE_CHECK)
673 retval = GLOB_NOMATCH;
674 goto out;
676 else
678 home_dir = (char *) "~"; /* No luck. */
679 malloc_home_dir = 0;
682 /* Now construct the full directory. */
683 if (dirname[1] == '\0')
685 if (__glibc_unlikely (malloc_dirname))
686 free (dirname);
688 dirname = home_dir;
689 dirlen = strlen (dirname);
690 malloc_dirname = malloc_home_dir;
692 else
694 char *newp;
695 size_t home_len = strlen (home_dir);
696 int use_alloca = glob_use_alloca (alloca_used, home_len + dirlen);
697 if (use_alloca)
698 newp = alloca_account (home_len + dirlen, alloca_used);
699 else
701 newp = malloc (home_len + dirlen);
702 if (newp == NULL)
704 if (__glibc_unlikely (malloc_home_dir))
705 free (home_dir);
706 retval = GLOB_NOSPACE;
707 goto out;
711 mempcpy (mempcpy (newp, home_dir, home_len),
712 &dirname[1], dirlen);
714 if (__glibc_unlikely (malloc_dirname))
715 free (dirname);
717 dirname = newp;
718 dirlen += home_len - 1;
719 malloc_dirname = !use_alloca;
721 if (__glibc_unlikely (malloc_home_dir))
722 free (home_dir);
724 dirname_modified = 1;
726 else
728 #ifndef WINDOWS32
729 char *end_name = strchr (dirname, '/');
730 char *user_name;
731 int malloc_user_name = 0;
732 char *unescape = NULL;
734 if (!(flags & GLOB_NOESCAPE))
736 if (end_name == NULL)
738 unescape = strchr (dirname, '\\');
739 if (unescape)
740 end_name = strchr (unescape, '\0');
742 else
743 unescape = memchr (dirname, '\\', end_name - dirname);
745 if (end_name == NULL)
746 user_name = dirname + 1;
747 else
749 char *newp;
750 if (glob_use_alloca (alloca_used, end_name - dirname))
751 newp = alloca_account (end_name - dirname, alloca_used);
752 else
754 newp = malloc (end_name - dirname);
755 if (newp == NULL)
757 retval = GLOB_NOSPACE;
758 goto out;
760 malloc_user_name = 1;
762 if (unescape != NULL)
764 char *p = mempcpy (newp, dirname + 1,
765 unescape - dirname - 1);
766 char *q = unescape;
767 while (q != end_name)
769 if (*q == '\\')
771 if (q + 1 == end_name)
773 /* "~fo\\o\\" unescape to user_name "foo\\",
774 but "~fo\\o\\/" unescape to user_name
775 "foo". */
776 if (filename == NULL)
777 *p++ = '\\';
778 break;
780 ++q;
782 *p++ = *q++;
784 *p = '\0';
786 else
787 *((char *) mempcpy (newp, dirname + 1, end_name - dirname - 1))
788 = '\0';
789 user_name = newp;
792 /* Look up specific user's home directory. */
794 struct passwd *p;
795 struct scratch_buffer pwtmpbuf;
796 scratch_buffer_init (&pwtmpbuf);
798 # if defined HAVE_GETPWNAM_R || defined _LIBC
799 struct passwd pwbuf;
801 while (getpwnam_r (user_name, &pwbuf,
802 pwtmpbuf.data, pwtmpbuf.length, &p)
803 == ERANGE)
805 if (!scratch_buffer_grow (&pwtmpbuf))
807 retval = GLOB_NOSPACE;
808 goto out;
811 # else
812 p = getpwnam (user_name);
813 # endif
815 if (__glibc_unlikely (malloc_user_name))
816 free (user_name);
818 /* If we found a home directory use this. */
819 if (p != NULL)
821 size_t home_len = strlen (p->pw_dir);
822 size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
823 char *d, *newp;
824 bool use_alloca = glob_use_alloca (alloca_used,
825 home_len + rest_len + 1);
827 if (use_alloca)
828 newp = alloca_account (home_len + rest_len + 1, alloca_used);
829 else
831 newp = malloc (home_len + rest_len + 1);
832 if (newp == NULL)
834 scratch_buffer_free (&pwtmpbuf);
835 retval = GLOB_NOSPACE;
836 goto out;
839 d = mempcpy (newp, p->pw_dir, home_len);
840 if (end_name != NULL)
841 d = mempcpy (d, end_name, rest_len);
842 *d = '\0';
844 if (__glibc_unlikely (malloc_dirname))
845 free (dirname);
846 dirname = newp;
847 malloc_dirname = !use_alloca;
849 dirlen = home_len + rest_len;
850 dirname_modified = 1;
852 else
854 if (flags & GLOB_TILDE_CHECK)
856 /* We have to regard it as an error if we cannot find the
857 home directory. */
858 retval = GLOB_NOMATCH;
859 goto out;
862 scratch_buffer_free (&pwtmpbuf);
864 #endif /* !WINDOWS32 */
868 /* Now test whether we looked for "~" or "~NAME". In this case we
869 can give the answer now. */
870 if (filename == NULL)
872 size_t newcount = pglob->gl_pathc + pglob->gl_offs;
873 char **new_gl_pathv;
875 if (newcount > SIZE_MAX / sizeof (char *) - 2)
877 nospace:
878 free (pglob->gl_pathv);
879 pglob->gl_pathv = NULL;
880 pglob->gl_pathc = 0;
881 retval = GLOB_NOSPACE;
882 goto out;
885 new_gl_pathv = realloc (pglob->gl_pathv,
886 (newcount + 2) * sizeof (char *));
887 if (new_gl_pathv == NULL)
888 goto nospace;
889 pglob->gl_pathv = new_gl_pathv;
891 if (flags & GLOB_MARK && is_dir (dirname, flags, pglob))
893 char *p;
894 pglob->gl_pathv[newcount] = malloc (dirlen + 2);
895 if (pglob->gl_pathv[newcount] == NULL)
896 goto nospace;
897 p = mempcpy (pglob->gl_pathv[newcount], dirname, dirlen);
898 p[0] = '/';
899 p[1] = '\0';
900 if (__glibc_unlikely (malloc_dirname))
901 free (dirname);
903 else
905 if (__glibc_unlikely (malloc_dirname))
906 pglob->gl_pathv[newcount] = dirname;
907 else
909 pglob->gl_pathv[newcount] = strdup (dirname);
910 if (pglob->gl_pathv[newcount] == NULL)
911 goto nospace;
914 pglob->gl_pathv[++newcount] = NULL;
915 ++pglob->gl_pathc;
916 pglob->gl_flags = flags;
918 return 0;
921 meta = __glob_pattern_type (dirname, !(flags & GLOB_NOESCAPE));
922 /* meta is 1 if correct glob pattern containing metacharacters.
923 If meta has bit (1 << 2) set, it means there was an unterminated
924 [ which we handle the same, using fnmatch. Broken unterminated
925 pattern bracket expressions ought to be rare enough that it is
926 not worth special casing them, fnmatch will do the right thing. */
927 if (meta & (GLOBPAT_SPECIAL | GLOBPAT_BRACKET))
929 /* The directory name contains metacharacters, so we
930 have to glob for the directory, and then glob for
931 the pattern in each directory found. */
932 size_t i;
934 if (!(flags & GLOB_NOESCAPE) && dirlen > 0 && dirname[dirlen - 1] == '\\')
936 /* "foo\\/bar". Remove the final backslash from dirname
937 if it has not been quoted. */
938 char *p = (char *) &dirname[dirlen - 1];
940 while (p > dirname && p[-1] == '\\') --p;
941 if ((&dirname[dirlen] - p) & 1)
942 *(char *) &dirname[--dirlen] = '\0';
945 if (__glibc_unlikely ((flags & GLOB_ALTDIRFUNC) != 0))
947 /* Use the alternative access functions also in the recursive
948 call. */
949 dirs.gl_opendir = pglob->gl_opendir;
950 dirs.gl_readdir = pglob->gl_readdir;
951 dirs.gl_closedir = pglob->gl_closedir;
952 dirs.gl_stat = pglob->gl_stat;
953 dirs.gl_lstat = pglob->gl_lstat;
956 status = __glob (dirname,
957 ((flags & (GLOB_ERR | GLOB_NOESCAPE | GLOB_ALTDIRFUNC))
958 | GLOB_NOSORT | GLOB_ONLYDIR),
959 errfunc, &dirs);
960 if (status != 0)
962 if ((flags & GLOB_NOCHECK) == 0 || status != GLOB_NOMATCH)
964 retval = status;
965 goto out;
967 goto no_matches;
970 /* We have successfully globbed the preceding directory name.
971 For each name we found, call glob_in_dir on it and FILENAME,
972 appending the results to PGLOB. */
973 for (i = 0; i < dirs.gl_pathc; ++i)
975 size_t old_pathc;
977 old_pathc = pglob->gl_pathc;
978 status = glob_in_dir (filename, dirs.gl_pathv[i],
979 ((flags | GLOB_APPEND)
980 & ~(GLOB_NOCHECK | GLOB_NOMAGIC)),
981 errfunc, pglob, alloca_used);
982 if (status == GLOB_NOMATCH)
983 /* No matches in this directory. Try the next. */
984 continue;
986 if (status != 0)
988 globfree (&dirs);
989 globfree (pglob);
990 pglob->gl_pathc = 0;
991 retval = status;
992 goto out;
995 /* Stick the directory on the front of each name. */
996 if (prefix_array (dirs.gl_pathv[i],
997 &pglob->gl_pathv[old_pathc + pglob->gl_offs],
998 pglob->gl_pathc - old_pathc))
1000 globfree (&dirs);
1001 globfree (pglob);
1002 pglob->gl_pathc = 0;
1003 retval = GLOB_NOSPACE;
1004 goto out;
1008 flags |= GLOB_MAGCHAR;
1010 /* We have ignored the GLOB_NOCHECK flag in the 'glob_in_dir' calls.
1011 But if we have not found any matching entry and the GLOB_NOCHECK
1012 flag was set we must return the input pattern itself. */
1013 if (pglob->gl_pathc + pglob->gl_offs == oldcount)
1015 no_matches:
1016 /* No matches. */
1017 if (flags & GLOB_NOCHECK)
1019 size_t newcount = pglob->gl_pathc + pglob->gl_offs;
1020 char **new_gl_pathv;
1022 if (newcount > SIZE_MAX / sizeof (char *) - 2)
1024 nospace2:
1025 globfree (&dirs);
1026 retval = GLOB_NOSPACE;
1027 goto out;
1030 new_gl_pathv = realloc (pglob->gl_pathv,
1031 (newcount + 2) * sizeof (char *));
1032 if (new_gl_pathv == NULL)
1033 goto nospace2;
1034 pglob->gl_pathv = new_gl_pathv;
1036 pglob->gl_pathv[newcount] = strdup (pattern);
1037 if (pglob->gl_pathv[newcount] == NULL)
1039 globfree (&dirs);
1040 globfree (pglob);
1041 pglob->gl_pathc = 0;
1042 retval = GLOB_NOSPACE;
1043 goto out;
1046 ++pglob->gl_pathc;
1047 ++newcount;
1049 pglob->gl_pathv[newcount] = NULL;
1050 pglob->gl_flags = flags;
1052 else
1054 globfree (&dirs);
1055 retval = GLOB_NOMATCH;
1056 goto out;
1060 globfree (&dirs);
1062 else
1064 size_t old_pathc = pglob->gl_pathc;
1065 int orig_flags = flags;
1067 if (meta & GLOBPAT_BACKSLASH)
1069 char *p = strchr (dirname, '\\'), *q;
1070 /* We need to unescape the dirname string. It is certainly
1071 allocated by alloca, as otherwise filename would be NULL
1072 or dirname wouldn't contain backslashes. */
1073 q = p;
1076 if (*p == '\\')
1078 *q = *++p;
1079 --dirlen;
1081 else
1082 *q = *p;
1083 ++q;
1085 while (*p++ != '\0');
1086 dirname_modified = 1;
1088 if (dirname_modified)
1089 flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
1090 status = glob_in_dir (filename, dirname, flags, errfunc, pglob,
1091 alloca_used);
1092 if (status != 0)
1094 if (status == GLOB_NOMATCH && flags != orig_flags
1095 && pglob->gl_pathc + pglob->gl_offs == oldcount)
1097 /* Make sure globfree (&dirs); is a nop. */
1098 dirs.gl_pathv = NULL;
1099 flags = orig_flags;
1100 goto no_matches;
1102 retval = status;
1103 goto out;
1106 if (dirlen > 0)
1108 /* Stick the directory on the front of each name. */
1109 if (prefix_array (dirname,
1110 &pglob->gl_pathv[old_pathc + pglob->gl_offs],
1111 pglob->gl_pathc - old_pathc))
1113 globfree (pglob);
1114 pglob->gl_pathc = 0;
1115 retval = GLOB_NOSPACE;
1116 goto out;
1121 if (flags & GLOB_MARK)
1123 /* Append slashes to directory names. */
1124 size_t i;
1126 for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
1127 if (is_dir (pglob->gl_pathv[i], flags, pglob))
1129 size_t len = strlen (pglob->gl_pathv[i]) + 2;
1130 char *new = realloc (pglob->gl_pathv[i], len);
1131 if (new == NULL)
1133 globfree (pglob);
1134 pglob->gl_pathc = 0;
1135 retval = GLOB_NOSPACE;
1136 goto out;
1138 strcpy (&new[len - 2], "/");
1139 pglob->gl_pathv[i] = new;
1143 if (!(flags & GLOB_NOSORT))
1145 /* Sort the vector. */
1146 qsort (&pglob->gl_pathv[oldcount],
1147 pglob->gl_pathc + pglob->gl_offs - oldcount,
1148 sizeof (char *), collated_compare);
1151 out:
1152 if (__glibc_unlikely (malloc_dirname))
1153 free (dirname);
1155 return retval;
1157 #if defined _LIBC && !defined __glob
1158 versioned_symbol (libc, __glob, glob, GLIBC_2_27);
1159 libc_hidden_ver (__glob, glob)
1160 #endif
1163 /* Do a collated comparison of A and B. */
1164 static int
1165 collated_compare (const void *a, const void *b)
1167 char *const *ps1 = a; char *s1 = *ps1;
1168 char *const *ps2 = b; char *s2 = *ps2;
1170 if (s1 == s2)
1171 return 0;
1172 if (s1 == NULL)
1173 return 1;
1174 if (s2 == NULL)
1175 return -1;
1176 return strcoll (s1, s2);
1180 /* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
1181 elements in place. Return nonzero if out of memory, zero if successful.
1182 A slash is inserted between DIRNAME and each elt of ARRAY,
1183 unless DIRNAME is just "/". Each old element of ARRAY is freed. */
1184 static int
1185 prefix_array (const char *dirname, char **array, size_t n)
1187 size_t i;
1188 size_t dirlen = strlen (dirname);
1189 char dirsep_char = '/';
1191 if (dirlen == 1 && dirname[0] == '/')
1192 /* DIRNAME is just "/", so normal prepending would get us "//foo".
1193 We want "/foo" instead, so don't prepend any chars from DIRNAME. */
1194 dirlen = 0;
1196 #if defined __MSDOS__ || defined WINDOWS32
1197 if (dirlen > 1)
1199 if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
1200 /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
1201 --dirlen;
1202 else if (dirname[dirlen - 1] == ':')
1204 /* DIRNAME is "d:". Use ':' instead of '/'. */
1205 --dirlen;
1206 dirsep_char = ':';
1209 #endif
1211 for (i = 0; i < n; ++i)
1213 size_t eltlen = strlen (array[i]) + 1;
1214 char *new = malloc (dirlen + 1 + eltlen);
1215 if (new == NULL)
1217 while (i > 0)
1218 free (array[--i]);
1219 return 1;
1223 char *endp = mempcpy (new, dirname, dirlen);
1224 *endp++ = dirsep_char;
1225 mempcpy (endp, array[i], eltlen);
1227 free (array[i]);
1228 array[i] = new;
1231 return 0;
1234 /* Like 'glob', but PATTERN is a final pathname component,
1235 and matches are searched for in DIRECTORY.
1236 The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
1237 The GLOB_APPEND flag is assumed to be set (always appends). */
1238 static int
1239 glob_in_dir (const char *pattern, const char *directory, int flags,
1240 int (*errfunc) (const char *, int),
1241 glob_t *pglob, size_t alloca_used)
1243 size_t dirlen = strlen (directory);
1244 void *stream = NULL;
1245 # define GLOBNAMES_MEMBERS(nnames) \
1246 struct globnames *next; size_t count; char *name[nnames];
1247 struct globnames { GLOBNAMES_MEMBERS (FLEXIBLE_ARRAY_MEMBER) };
1248 struct { GLOBNAMES_MEMBERS (64) } init_names_buf;
1249 struct globnames *init_names = (struct globnames *) &init_names_buf;
1250 struct globnames *names = init_names;
1251 struct globnames *names_alloca = init_names;
1252 size_t nfound = 0;
1253 size_t cur = 0;
1254 int meta;
1255 int save;
1256 int result;
1258 alloca_used += sizeof init_names_buf;
1260 init_names->next = NULL;
1261 init_names->count = ((sizeof init_names_buf
1262 - offsetof (struct globnames, name))
1263 / sizeof init_names->name[0]);
1265 meta = __glob_pattern_type (pattern, !(flags & GLOB_NOESCAPE));
1266 if (meta == GLOBPAT_NONE && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
1268 /* We need not do any tests. The PATTERN contains no meta
1269 characters and we must not return an error therefore the
1270 result will always contain exactly one name. */
1271 flags |= GLOB_NOCHECK;
1273 else if (meta == GLOBPAT_NONE)
1275 size_t patlen = strlen (pattern);
1276 size_t fullsize;
1277 bool alloca_fullname
1278 = (! size_add_wrapv (dirlen + 1, patlen + 1, &fullsize)
1279 && glob_use_alloca (alloca_used, fullsize));
1280 char *fullname;
1281 if (alloca_fullname)
1282 fullname = alloca_account (fullsize, alloca_used);
1283 else
1285 fullname = malloc (fullsize);
1286 if (fullname == NULL)
1287 return GLOB_NOSPACE;
1290 mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
1291 "/", 1),
1292 pattern, patlen + 1);
1293 if (glob_lstat (pglob, flags, fullname) == 0
1294 || errno == EOVERFLOW)
1295 /* We found this file to be existing. Now tell the rest
1296 of the function to copy this name into the result. */
1297 flags |= GLOB_NOCHECK;
1299 if (__glibc_unlikely (!alloca_fullname))
1300 free (fullname);
1302 else
1304 stream = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
1305 ? (*pglob->gl_opendir) (directory)
1306 : opendir (directory));
1307 if (stream == NULL)
1309 if (errno != ENOTDIR
1310 && ((errfunc != NULL && (*errfunc) (directory, errno))
1311 || (flags & GLOB_ERR)))
1312 return GLOB_ABORTED;
1314 else
1316 int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
1317 | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0));
1318 flags |= GLOB_MAGCHAR;
1320 while (1)
1322 struct readdir_result d;
1324 if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
1325 d = convert_dirent (GL_READDIR (pglob, stream));
1326 else
1328 #ifdef COMPILE_GLOB64
1329 d = convert_dirent (__readdir (stream));
1330 #else
1331 d = convert_dirent64 (__readdir64 (stream));
1332 #endif
1335 if (d.name == NULL)
1336 break;
1338 /* If we shall match only directories use the information
1339 provided by the dirent call if possible. */
1340 if (flags & GLOB_ONLYDIR)
1341 switch (readdir_result_type (d))
1343 case DT_DIR: case DT_LNK: case DT_UNKNOWN: break;
1344 default: continue;
1347 if (fnmatch (pattern, d.name, fnm_flags) == 0)
1349 if (cur == names->count)
1351 struct globnames *newnames;
1352 size_t count = names->count * 2;
1353 size_t nameoff = offsetof (struct globnames, name);
1354 size_t size = FLEXSIZEOF (struct globnames, name,
1355 count * sizeof (char *));
1356 if ((SIZE_MAX - nameoff) / 2 / sizeof (char *)
1357 < names->count)
1358 goto memory_error;
1359 if (glob_use_alloca (alloca_used, size))
1360 newnames = names_alloca
1361 = alloca_account (size, alloca_used);
1362 else if ((newnames = malloc (size))
1363 == NULL)
1364 goto memory_error;
1365 newnames->count = count;
1366 newnames->next = names;
1367 names = newnames;
1368 cur = 0;
1370 names->name[cur] = strdup (d.name);
1371 if (names->name[cur] == NULL)
1372 goto memory_error;
1373 ++cur;
1374 ++nfound;
1375 if (SIZE_MAX - pglob->gl_offs <= nfound)
1376 goto memory_error;
1382 if (nfound == 0 && (flags & GLOB_NOCHECK))
1384 size_t len = strlen (pattern);
1385 nfound = 1;
1386 names->name[cur] = malloc (len + 1);
1387 if (names->name[cur] == NULL)
1388 goto memory_error;
1389 *((char *) mempcpy (names->name[cur++], pattern, len)) = '\0';
1392 result = GLOB_NOMATCH;
1393 if (nfound != 0)
1395 char **new_gl_pathv;
1396 result = 0;
1398 if (SIZE_MAX / sizeof (char *) - pglob->gl_pathc
1399 < pglob->gl_offs + nfound + 1)
1400 goto memory_error;
1402 new_gl_pathv
1403 = realloc (pglob->gl_pathv,
1404 (pglob->gl_pathc + pglob->gl_offs + nfound + 1)
1405 * sizeof (char *));
1407 if (new_gl_pathv == NULL)
1409 memory_error:
1410 while (1)
1412 struct globnames *old = names;
1413 for (size_t i = 0; i < cur; ++i)
1414 free (names->name[i]);
1415 names = names->next;
1416 /* NB: we will not leak memory here if we exit without
1417 freeing the current block assigned to OLD. At least
1418 the very first block is always allocated on the stack
1419 and this is the block assigned to OLD here. */
1420 if (names == NULL)
1422 assert (old == init_names);
1423 break;
1425 cur = names->count;
1426 if (old == names_alloca)
1427 names_alloca = names;
1428 else
1429 free (old);
1431 result = GLOB_NOSPACE;
1433 else
1435 while (1)
1437 struct globnames *old = names;
1438 for (size_t i = 0; i < cur; ++i)
1439 new_gl_pathv[pglob->gl_offs + pglob->gl_pathc++]
1440 = names->name[i];
1441 names = names->next;
1442 /* NB: we will not leak memory here if we exit without
1443 freeing the current block assigned to OLD. At least
1444 the very first block is always allocated on the stack
1445 and this is the block assigned to OLD here. */
1446 if (names == NULL)
1448 assert (old == init_names);
1449 break;
1451 cur = names->count;
1452 if (old == names_alloca)
1453 names_alloca = names;
1454 else
1455 free (old);
1458 pglob->gl_pathv = new_gl_pathv;
1460 pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
1462 pglob->gl_flags = flags;
1466 if (stream != NULL)
1468 save = errno;
1469 if (__glibc_unlikely (flags & GLOB_ALTDIRFUNC))
1470 (*pglob->gl_closedir) (stream);
1471 else
1472 closedir (stream);
1473 __set_errno (save);
1476 return result;