Sync with upstream branch release/2.34/master
Upstream commit: c66c92181ddbd82306537a608e8c0282587131de - posix/glob.c: update from gnulib (BZ#25659) - linux: Fix fchmodat with AT_SYMLINK_NOFOLLOW for 64 bit time_t (BZ#29097)
This commit is contained in:
parent
4e3257320c
commit
8f8d2743e4
116
glibc-upstream-2.34-189.patch
Normal file
116
glibc-upstream-2.34-189.patch
Normal file
@ -0,0 +1,116 @@
|
||||
commit 88a8637cb4658cd91a002659db05867716b88b36
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Wed Apr 27 13:40:30 2022 -0300
|
||||
|
||||
linux: Fix fchmodat with AT_SYMLINK_NOFOLLOW for 64 bit time_t (BZ#29097)
|
||||
|
||||
The AT_SYMLINK_NOFOLLOW emulation ues the default 32 bit stat internal
|
||||
calls, which fails with EOVERFLOW if the file constains timestamps
|
||||
beyond 2038.
|
||||
|
||||
Checked on i686-linux-gnu.
|
||||
|
||||
(cherry picked from commit 118a2aee07f64d605b6668cbe195c1f44eac6be6)
|
||||
|
||||
diff --git a/io/Makefile b/io/Makefile
|
||||
index 9871ecbc74020a6d..01968b81042e01e4 100644
|
||||
--- a/io/Makefile
|
||||
+++ b/io/Makefile
|
||||
@@ -81,16 +81,17 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \
|
||||
tst-closefrom \
|
||||
|
||||
tests-time64 := \
|
||||
+ tst-fcntl-time64 \
|
||||
+ tst-fts-time64 \
|
||||
tst-futimens-time64 \
|
||||
tst-futimes-time64\
|
||||
- tst-fts-time64 \
|
||||
+ tst-futimesat-time64 \
|
||||
+ tst-lchmod-time64 \
|
||||
tst-lutimes-time64 \
|
||||
tst-stat-time64 \
|
||||
- tst-futimesat-time64 \
|
||||
tst-utime-time64 \
|
||||
tst-utimensat-time64 \
|
||||
tst-utimes-time64 \
|
||||
- tst-fcntl-time64 \
|
||||
# tests-time64
|
||||
|
||||
# Likewise for statx, but we do not need static linking here.
|
||||
@@ -134,6 +135,7 @@ CFLAGS-close.c += -fexceptions -fasynchronous-unwind-tables
|
||||
|
||||
CFLAGS-test-stat.c += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
|
||||
CFLAGS-test-lfs.c += -D_LARGEFILE64_SOURCE
|
||||
+CFLAGS-tst-lchmod.c += -D_FILE_OFFSET_BITS=64
|
||||
|
||||
test-stat2-ARGS = Makefile . $(objpfx)test-stat2
|
||||
|
||||
diff --git a/io/tst-lchmod-time64.c b/io/tst-lchmod-time64.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..f2b7cc9d358f2a77
|
||||
--- /dev/null
|
||||
+++ b/io/tst-lchmod-time64.c
|
||||
@@ -0,0 +1,2 @@
|
||||
+#define CHECK_TIME64
|
||||
+#include "tst-lchmod.c"
|
||||
diff --git a/io/tst-lchmod.c b/io/tst-lchmod.c
|
||||
index 0fe98e01b74b713d..472766b186975922 100644
|
||||
--- a/io/tst-lchmod.c
|
||||
+++ b/io/tst-lchmod.c
|
||||
@@ -66,10 +66,27 @@ select_path (bool do_relative_path, const char *full_path, const char *relative_
|
||||
return full_path;
|
||||
}
|
||||
|
||||
+static void
|
||||
+update_file_time_to_y2038 (const char *fname, int flags)
|
||||
+{
|
||||
+#ifdef CHECK_TIME64
|
||||
+ /* Y2038 threshold plus 1 second. */
|
||||
+ const struct timespec ts[] = { { 0x80000001LL, 0}, { 0x80000001LL } };
|
||||
+ TEST_VERIFY_EXIT (utimensat (AT_FDCWD, fname, ts, flags) == 0);
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
static void
|
||||
test_1 (bool do_relative_path, int (*chmod_func) (int fd, const char *, mode_t, int))
|
||||
{
|
||||
char *tempdir = support_create_temp_directory ("tst-lchmod-");
|
||||
+#ifdef CHECK_TIME64
|
||||
+ if (!support_path_support_time64 (tempdir))
|
||||
+ {
|
||||
+ puts ("info: test skipped, filesystem does not support 64 bit time_t");
|
||||
+ return;
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
char *path_dangling = xasprintf ("%s/dangling", tempdir);
|
||||
char *path_file = xasprintf ("%s/file", tempdir);
|
||||
@@ -93,9 +110,12 @@ test_1 (bool do_relative_path, int (*chmod_func) (int fd, const char *, mode_t,
|
||||
xsymlink ("loop", path_loop);
|
||||
xsymlink ("target-does-not-exist", path_dangling);
|
||||
|
||||
+ update_file_time_to_y2038 (path_file, 0);
|
||||
+ update_file_time_to_y2038 (path_to_file, AT_SYMLINK_NOFOLLOW);
|
||||
+
|
||||
/* Check that the modes do not collide with what we will use in the
|
||||
test. */
|
||||
- struct stat64 st;
|
||||
+ struct stat st;
|
||||
xstat (path_file, &st);
|
||||
TEST_VERIFY ((st.st_mode & 0777) != 1);
|
||||
xlstat (path_to_file, &st);
|
||||
diff --git a/sysdeps/unix/sysv/linux/fchmodat.c b/sysdeps/unix/sysv/linux/fchmodat.c
|
||||
index 5bd1eb96a5d78130..b0cf61949a9302d9 100644
|
||||
--- a/sysdeps/unix/sysv/linux/fchmodat.c
|
||||
+++ b/sysdeps/unix/sysv/linux/fchmodat.c
|
||||
@@ -48,8 +48,8 @@ fchmodat (int fd, const char *file, mode_t mode, int flag)
|
||||
|
||||
/* Use fstatat because fstat does not work on O_PATH descriptors
|
||||
before Linux 3.6. */
|
||||
- struct stat64 st;
|
||||
- if (__fstatat64 (pathfd, "", &st, AT_EMPTY_PATH) != 0)
|
||||
+ struct __stat64_t64 st;
|
||||
+ if (__fstatat64_time64 (pathfd, "", &st, AT_EMPTY_PATH) != 0)
|
||||
{
|
||||
__close_nocancel (pathfd);
|
||||
return -1;
|
189
glibc-upstream-2.34-190.patch
Normal file
189
glibc-upstream-2.34-190.patch
Normal file
@ -0,0 +1,189 @@
|
||||
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
|
||||
|
10
glibc.spec
10
glibc.spec
@ -148,7 +148,7 @@ end \
|
||||
Summary: The GNU libc libraries
|
||||
Name: glibc
|
||||
Version: %{glibcversion}
|
||||
Release: 31%{?dist}
|
||||
Release: 32%{?dist}
|
||||
|
||||
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
||||
# libraries.
|
||||
@ -459,6 +459,8 @@ Patch251: glibc-upstream-2.34-185.patch
|
||||
Patch252: glibc-upstream-2.34-186.patch
|
||||
Patch253: glibc-upstream-2.34-187.patch
|
||||
Patch254: glibc-upstream-2.34-188.patch
|
||||
Patch255: glibc-upstream-2.34-189.patch
|
||||
Patch256: glibc-upstream-2.34-190.patch
|
||||
|
||||
##############################################################################
|
||||
# Continued list of core "glibc" package information:
|
||||
@ -2515,6 +2517,12 @@ fi
|
||||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||
|
||||
%changelog
|
||||
* 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:
|
||||
|
Loading…
Reference in New Issue
Block a user