forked from rpms/glibc
73667d0be6
* Thu Apr 28 2022 Carlos O'Donell <carlos@redhat.com> - 2.34-32 - Sync with upstream branch release/2.34/master, commit c66c92181ddbd82306537a608e8c0282587131de: - posix/glob.c: update from gnulib (BZ#25659) - linux: Fix fchmodat with AT_SYMLINK_NOFOLLOW for 64 bit time_t (BZ#29097) * Wed Apr 27 2022 Carlos O'Donell <carlos@redhat.com> - 2.34-31 - Sync with upstream branch release/2.34/master, commit 55640ed3fde48360a8e8083be4843bd2dc7cecfe: - i386: Regenerate ulps - linux: Fix missing internal 64 bit time_t stat usage - x86: Optimize L(less_vec) case in memcmp-evex-movbe.S - x86: Don't set Prefer_No_AVX512 for processors with AVX512 and AVX-VNNI - x86-64: Use notl in EVEX strcmp [BZ #28646] - x86: Shrink memcmp-sse4.S code size - x86: Double size of ERMS rep_movsb_threshold in dl-cacheinfo.h - x86: Optimize memmove-vec-unaligned-erms.S - x86-64: Replace movzx with movzbl - x86-64: Remove Prefer_AVX2_STRCMP - x86-64: Improve EVEX strcmp with masked load - x86: Replace sse2 instructions with avx in memcmp-evex-movbe.S - x86: Optimize memset-vec-unaligned-erms.S - x86: Optimize memcmp-evex-movbe.S for frontend behavior and size - x86: Modify ENTRY in sysdep.h so that p2align can be specified - x86-64: Optimize load of all bits set into ZMM register [BZ #28252] - scripts/glibcelf.py: Mark as UNSUPPORTED on Python 3.5 and earlier - dlfcn: Do not use rtld_active () to determine ld.so state (bug 29078) - INSTALL: Rephrase -with-default-link documentation - misc: Fix rare fortify crash on wchar funcs. [BZ 29030] - Default to --with-default-link=no (bug 25812) - scripts: Add glibcelf.py module * Thu Apr 21 2022 Carlos O'Donell <carlos@redhat.com> - 2.34-30 - Sync with upstream branch release/2.34/master, commit 71326f1f2fd09dafb9c34404765fb88129e94237: - nptl: Fix pthread_cancel cancelhandling atomic operations - mips: Fix mips64n32 64 bit time_t stat support (BZ#29069) - hurd: Fix arbitrary error code - nptl: Handle spurious EINTR when thread cancellation is disabled (BZ#29029) - S390: Add new s390 platform z16. - NEWS: Update fixed bug list for LD_AUDIT backports. - hppa: Fix bind-now audit (BZ #28857) - elf: Replace tst-audit24bmod2.so with tst-audit24bmod2 - Fix elf/tst-audit25a with default bind now toolchains - elf: Fix runtime linker auditing on aarch64 (BZ #26643) - elf: Issue la_symbind for bind-now (BZ #23734) - elf: Fix initial-exec TLS access on audit modules (BZ #28096) - elf: Add la_activity during application exit - elf: Do not fail for failed dlmopen on audit modules (BZ #28061) - elf: Issue audit la_objopen for vDSO - elf: Add audit tests for modules with TLSDESC - elf: Avoid unnecessary slowdown from profiling with audit (BZ#15533) - elf: Add _dl_audit_pltexit - elf: Add _dl_audit_pltenter - elf: Add _dl_audit_preinit - elf: Add _dl_audit_symbind_alt and _dl_audit_symbind - elf: Add _dl_audit_objclose - elf: Add _dl_audit_objsearch - elf: Add _dl_audit_activity_map and _dl_audit_activity_nsid - elf: Add _dl_audit_objopen - elf: Move la_activity (LA_ACT_ADD) after _dl_add_to_namespace_list() (BZ #28062) - elf: Move LAV_CURRENT to link_lavcurrent.h - elf: Fix elf_get_dynamic_info() for bootstrap - elf: Fix dynamic-link.h usage on rtld.c - elf: Fix elf_get_dynamic_info definition - elf: Avoid nested functions in the loader [BZ #27220] - powerpc: Delete unneeded ELF_MACHINE_BEFORE_RTLD_RELOC - hppa: Use END instead of PSEUDO_END in swapcontext.S - hppa: Implement swapcontext in assembler (bug 28960) Resolves: #2003291 Resolves: #2064181 Resolves: #2072328 Resolves: #2075713 Resolves: #2077838
190 lines
6.9 KiB
Diff
190 lines
6.9 KiB
Diff
commit c66c92181ddbd82306537a608e8c0282587131de
|
|
Author: DJ Delorie <dj@redhat.com>
|
|
Date: Wed Mar 30 17:44:02 2022 -0400
|
|
|
|
posix/glob.c: update from gnulib
|
|
|
|
Copied from gnulib/lib/glob.c in order to fix rhbz 1982608
|
|
Also fixes swbz 25659
|
|
|
|
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
|
Tested-by: Carlos O'Donell <carlos@redhat.com>
|
|
(cherry picked from commit 7c477b57a31487eda516db02b9e04f22d1a6e6af)
|
|
|
|
diff --git a/posix/glob.c b/posix/glob.c
|
|
index 593a4c358f3d42e5..6af310a1aa31401a 100644
|
|
--- a/posix/glob.c
|
|
+++ b/posix/glob.c
|
|
@@ -21,13 +21,14 @@
|
|
optimizes away the pattern == NULL test below. */
|
|
# define _GL_ARG_NONNULL(params)
|
|
|
|
-# include <config.h>
|
|
+# include <libc-config.h>
|
|
|
|
#endif
|
|
|
|
#include <glob.h>
|
|
|
|
#include <errno.h>
|
|
+#include <fcntl.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <stdbool.h>
|
|
@@ -56,6 +57,8 @@
|
|
# define sysconf(id) __sysconf (id)
|
|
# define closedir(dir) __closedir (dir)
|
|
# define opendir(name) __opendir (name)
|
|
+# undef dirfd
|
|
+# define dirfd(str) __dirfd (str)
|
|
# define readdir(str) __readdir64 (str)
|
|
# define getpwnam_r(name, bufp, buf, len, res) \
|
|
__getpwnam_r (name, bufp, buf, len, res)
|
|
@@ -69,11 +72,8 @@
|
|
# ifndef GLOB_LSTAT
|
|
# define GLOB_LSTAT gl_lstat
|
|
# endif
|
|
-# ifndef GLOB_STAT64
|
|
-# define GLOB_STAT64 __stat64
|
|
-# endif
|
|
-# ifndef GLOB_LSTAT64
|
|
-# define GLOB_LSTAT64 __lstat64
|
|
+# ifndef GLOB_FSTATAT64
|
|
+# define GLOB_FSTATAT64 __fstatat64
|
|
# endif
|
|
# include <shlib-compat.h>
|
|
#else /* !_LIBC */
|
|
@@ -88,8 +88,7 @@
|
|
# define struct_stat struct stat
|
|
# define struct_stat64 struct stat
|
|
# define GLOB_LSTAT gl_lstat
|
|
-# define GLOB_STAT64 stat
|
|
-# define GLOB_LSTAT64 lstat
|
|
+# define GLOB_FSTATAT64 fstatat
|
|
#endif /* _LIBC */
|
|
|
|
#include <fnmatch.h>
|
|
@@ -215,7 +214,8 @@ glob_lstat (glob_t *pglob, int flags, const char *fullname)
|
|
} ust;
|
|
return (__glibc_unlikely (flags & GLOB_ALTDIRFUNC)
|
|
? pglob->GLOB_LSTAT (fullname, &ust.st)
|
|
- : GLOB_LSTAT64 (fullname, &ust.st64));
|
|
+ : GLOB_FSTATAT64 (AT_FDCWD, fullname, &ust.st64,
|
|
+ AT_SYMLINK_NOFOLLOW));
|
|
}
|
|
|
|
/* Set *R = A + B. Return true if the answer is mathematically
|
|
@@ -257,7 +257,8 @@ is_dir (char const *filename, int flags, glob_t const *pglob)
|
|
struct_stat64 st64;
|
|
return (__glibc_unlikely (flags & GLOB_ALTDIRFUNC)
|
|
? pglob->gl_stat (filename, &st) == 0 && S_ISDIR (st.st_mode)
|
|
- : GLOB_STAT64 (filename, &st64) == 0 && S_ISDIR (st64.st_mode));
|
|
+ : (GLOB_FSTATAT64 (AT_FDCWD, filename, &st64, 0) == 0
|
|
+ && S_ISDIR (st64.st_mode)));
|
|
}
|
|
|
|
/* Find the end of the sub-pattern in a brace expression. */
|
|
@@ -747,6 +748,8 @@ __glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
|
|
else
|
|
{
|
|
#ifndef WINDOWS32
|
|
+ /* Recognize ~user as a shorthand for the specified user's home
|
|
+ directory. */
|
|
char *end_name = strchr (dirname, '/');
|
|
char *user_name;
|
|
int malloc_user_name = 0;
|
|
@@ -885,7 +888,22 @@ __glob (const char *pattern, int flags, int (*errfunc) (const char *, int),
|
|
}
|
|
scratch_buffer_free (&pwtmpbuf);
|
|
}
|
|
-#endif /* !WINDOWS32 */
|
|
+#else /* WINDOWS32 */
|
|
+ /* On native Windows, access to a user's home directory
|
|
+ (via GetUserProfileDirectory) or to a user's environment
|
|
+ variables (via ExpandEnvironmentStringsForUser) requires
|
|
+ the credentials of the user. Therefore we cannot support
|
|
+ the ~user syntax on this platform.
|
|
+ Handling ~user specially (and treat it like plain ~) if
|
|
+ user is getenv ("USERNAME") would not be a good idea,
|
|
+ since it would make people think that ~user is supported
|
|
+ in general. */
|
|
+ if (flags & GLOB_TILDE_CHECK)
|
|
+ {
|
|
+ retval = GLOB_NOMATCH;
|
|
+ goto out;
|
|
+ }
|
|
+#endif /* WINDOWS32 */
|
|
}
|
|
}
|
|
|
|
@@ -1266,6 +1284,8 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
|
|
{
|
|
size_t dirlen = strlen (directory);
|
|
void *stream = NULL;
|
|
+ struct scratch_buffer s;
|
|
+ scratch_buffer_init (&s);
|
|
# define GLOBNAMES_MEMBERS(nnames) \
|
|
struct globnames *next; size_t count; char *name[nnames];
|
|
struct globnames { GLOBNAMES_MEMBERS (FLEXIBLE_ARRAY_MEMBER) };
|
|
@@ -1337,6 +1357,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
|
|
}
|
|
else
|
|
{
|
|
+ int dfd = dirfd (stream);
|
|
int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
|
|
| ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0));
|
|
flags |= GLOB_MAGCHAR;
|
|
@@ -1364,8 +1385,32 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
|
|
if (flags & GLOB_ONLYDIR)
|
|
switch (readdir_result_type (d))
|
|
{
|
|
- case DT_DIR: case DT_LNK: case DT_UNKNOWN: break;
|
|
default: continue;
|
|
+ case DT_DIR: break;
|
|
+ case DT_LNK: case DT_UNKNOWN:
|
|
+ /* The filesystem was too lazy to give us a hint,
|
|
+ so we have to do it the hard way. */
|
|
+ if (__glibc_unlikely (dfd < 0 || flags & GLOB_ALTDIRFUNC))
|
|
+ {
|
|
+ size_t namelen = strlen (d.name);
|
|
+ size_t need = dirlen + 1 + namelen + 1;
|
|
+ if (s.length < need
|
|
+ && !scratch_buffer_set_array_size (&s, need, 1))
|
|
+ goto memory_error;
|
|
+ char *p = mempcpy (s.data, directory, dirlen);
|
|
+ *p = '/';
|
|
+ p += p[-1] != '/';
|
|
+ memcpy (p, d.name, namelen + 1);
|
|
+ if (! is_dir (s.data, flags, pglob))
|
|
+ continue;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ struct_stat64 st64;
|
|
+ if (! (GLOB_FSTATAT64 (dfd, d.name, &st64, 0) == 0
|
|
+ && S_ISDIR (st64.st_mode)))
|
|
+ continue;
|
|
+ }
|
|
}
|
|
|
|
if (fnmatch (pattern, d.name, fnm_flags) == 0)
|
|
@@ -1497,5 +1542,6 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
|
|
__set_errno (save);
|
|
}
|
|
|
|
+ scratch_buffer_free (&s);
|
|
return result;
|
|
}
|
|
diff --git a/sysdeps/unix/sysv/linux/glob64-time64.c b/sysdeps/unix/sysv/linux/glob64-time64.c
|
|
index a465f70905e5a8a3..95efe4c4f4624967 100644
|
|
--- a/sysdeps/unix/sysv/linux/glob64-time64.c
|
|
+++ b/sysdeps/unix/sysv/linux/glob64-time64.c
|
|
@@ -37,6 +37,7 @@
|
|
# define GLOB_LSTAT gl_lstat
|
|
# define GLOB_STAT64 __stat64_time64
|
|
# define GLOB_LSTAT64 __lstat64_time64
|
|
+# define GLOB_FSTATAT64 __fstatat64_time64
|
|
|
|
# define COMPILE_GLOB64 1
|
|
|