forked from pool/glibc
Dirk Mueller
366ef06a7b
- add glibc-getaddrinfo-fix-use-after-free-in-getcanonname.patch (bsc#1215281, CVE-2023-4806) - Regenerate it also in the %post of glibc-local-base-<targettype> But to create clearly defined bootstrap projects, it's essential - Recognize ppc64p7 arch to build for power7 - add ld-linux.so.3 compat symlink also for armv6hl - Do not order nscd after syslog.target * bugfixes - Update manpages from Debian, includes new man pages for - Use _target_cpu instead of _build and _host. This makes the - check-build.sh: accept kernel 3.x - more libm optimizations - Revert last change, it caused some breakage. [bnc#715854] for vsyscall which is not anymore in 3.1 kernel - Further cleanup of ld.so.conf to remove duplicate directories - Fix warning about potential array subscript out of bounds - Work around shortest-stem feature in make 3.82+ (patch - Update to glibc-2.10.1-e38af591a8 of glibc/pb-stable.git glibc-2.10-branch - only do obsoletes for XXbit packages on ppc, not on x86 * Fix sched_getcpu error path on x86-64. - nptl/init.c (sigcancel_handler): Compare with correct PID even - Don't terminate strings twice in nis/netgroup code. - Fix invalidating of nscd caches and getaddrinfo() - Update to current CVS: - Update to current CVS version and update to - Add fixes from CVS: - forward umount to umount2 on ppc64 because umount syscall - really fix linux/percpu.h to compile in userland - Update to kernel header files from 2.6.0-test7 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=670
138 lines
4.3 KiB
Diff
138 lines
4.3 KiB
Diff
diff --git a/sysdeps/unix/sysv/linux/fstat64.c b/sysdeps/unix/sysv/linux/fstat64.c
|
|
index 124384e57f..a291f0825b 100644
|
|
--- a/sysdeps/unix/sysv/linux/fstat64.c
|
|
+++ b/sysdeps/unix/sysv/linux/fstat64.c
|
|
@@ -19,20 +19,53 @@
|
|
#define __fstat __redirect___fstat
|
|
#define fstat __redirect_fstat
|
|
#include <sys/stat.h>
|
|
+#undef __fstat
|
|
+#undef fstat
|
|
#include <fcntl.h>
|
|
-#include <kernel_stat.h>
|
|
-#include <stat_t64_cp.h>
|
|
+#include <internal-stat.h>
|
|
#include <errno.h>
|
|
|
|
int
|
|
__fstat64_time64 (int fd, struct __stat64_t64 *buf)
|
|
{
|
|
+#if !FSTATAT_USE_STATX
|
|
+# if XSTAT_IS_XSTAT64
|
|
+# ifdef __NR_fstat
|
|
+ /* 64-bit kABI, e.g. aarch64, ia64, powerpc64*, s390x, riscv64, and
|
|
+ x86_64. */
|
|
+ return INLINE_SYSCALL_CALL (fstat, fd, buf);
|
|
+# elif defined __NR_fstat64
|
|
+# if STAT64_IS_KERNEL_STAT64
|
|
+ /* 64-bit kABI outlier, e.g. alpha */
|
|
+ return INLINE_SYSCALL_CALL (fstat64, fd, buf);
|
|
+# else
|
|
+ /* 64-bit kABI outlier, e.g. sparc64. */
|
|
+ struct kernel_stat64 kst64;
|
|
+ int r = INLINE_SYSCALL_CALL (fstat64, fd, &kst64);
|
|
+ if (r == 0)
|
|
+ __cp_stat64_kstat64 (buf, &kst64);
|
|
+ return r;
|
|
+# endif /* STAT64_IS_KERNEL_STAT64 */
|
|
+# endif
|
|
+# else /* XSTAT_IS_XSTAT64 */
|
|
+ /* 64-bit kabi outlier, e.g. mips64 and mips64-n32. */
|
|
+ struct kernel_stat kst;
|
|
+ int r = INLINE_SYSCALL_CALL (fstat, fd, &kst);
|
|
+ if (r == 0)
|
|
+ __cp_kstat_stat64_t64 (&kst, buf);
|
|
+ return r;
|
|
+# endif
|
|
+#else /* !FSTATAT_USE_STATX */
|
|
+ /* All kABIs with non-LFS support and with old 32-bit time_t support
|
|
+ e.g. arm, csky, i386, hppa, m68k, microblaze, nios2, sh, powerpc32,
|
|
+ and sparc32. */
|
|
if (fd < 0)
|
|
{
|
|
__set_errno (EBADF);
|
|
return -1;
|
|
}
|
|
return __fstatat64_time64 (fd, "", buf, AT_EMPTY_PATH);
|
|
+#endif
|
|
}
|
|
#if __TIMESIZE != 64
|
|
hidden_def (__fstat64_time64)
|
|
diff --git a/sysdeps/unix/sysv/linux/fstatat64.c b/sysdeps/unix/sysv/linux/fstatat64.c
|
|
index 3509d3ca6d..127c6ff601 100644
|
|
--- a/sysdeps/unix/sysv/linux/fstatat64.c
|
|
+++ b/sysdeps/unix/sysv/linux/fstatat64.c
|
|
@@ -21,12 +21,10 @@
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
-#include <kernel_stat.h>
|
|
#include <sysdep.h>
|
|
#include <time.h>
|
|
-#include <kstat_cp.h>
|
|
-#include <stat_t64_cp.h>
|
|
#include <sys/sysmacros.h>
|
|
+#include <internal-stat.h>
|
|
|
|
#if __TIMESIZE == 64 \
|
|
&& (__WORDSIZE == 32 \
|
|
@@ -40,11 +38,7 @@ _Static_assert (sizeof (__blkcnt_t) == sizeof (__blkcnt64_t),
|
|
"__blkcnt_t and __blkcnt64_t must match");
|
|
#endif
|
|
|
|
-#if (__WORDSIZE == 32 \
|
|
- && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \
|
|
- || defined STAT_HAS_TIME32 \
|
|
- || (!defined __NR_newfstatat && !defined __NR_fstatat64)
|
|
-# define FSTATAT_USE_STATX 1
|
|
+#if FSTATAT_USE_STATX
|
|
|
|
static inline int
|
|
fstatat64_time64_statx (int fd, const char *file, struct __stat64_t64 *buf,
|
|
@@ -79,8 +73,6 @@ fstatat64_time64_statx (int fd, const char *file, struct __stat64_t64 *buf,
|
|
|
|
return r;
|
|
}
|
|
-#else
|
|
-# define FSTATAT_USE_STATX 0
|
|
#endif
|
|
|
|
/* Only statx supports 64-bit timestamps for 32-bit architectures with
|
|
diff --git a/sysdeps/unix/sysv/linux/internal-stat.h b/sysdeps/unix/sysv/linux/internal-stat.h
|
|
new file mode 100644
|
|
index 0000000000..e3b0569853
|
|
--- /dev/null
|
|
+++ b/sysdeps/unix/sysv/linux/internal-stat.h
|
|
@@ -0,0 +1,31 @@
|
|
+/* Internal stat definitions.
|
|
+ Copyright (C) 2023 Free Software Foundation, Inc.
|
|
+ This file is part of the GNU C Library.
|
|
+
|
|
+ The GNU C Library is free software; you can redistribute it and/or
|
|
+ modify it under the terms of the GNU Lesser General Public
|
|
+ License as published by the Free Software Foundation; either
|
|
+ version 2.1 of the License, or (at your option) any later version.
|
|
+
|
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ Lesser General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU Lesser General Public
|
|
+ License along with the GNU C Library; if not, see
|
|
+ <https://www.gnu.org/licenses/>. */
|
|
+
|
|
+#include <sysdep.h>
|
|
+#include <stat_t64_cp.h>
|
|
+#include <kernel_stat.h>
|
|
+#include <kstat_cp.h>
|
|
+
|
|
+#if (__WORDSIZE == 32 \
|
|
+ && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \
|
|
+ || defined STAT_HAS_TIME32 \
|
|
+ || (!defined __NR_newfstatat && !defined __NR_fstatat64)
|
|
+# define FSTATAT_USE_STATX 1
|
|
+#else
|
|
+# define FSTATAT_USE_STATX 0
|
|
+#endif
|