forked from rpms/glibc
import glibc-2.34-8.el9
This commit is contained in:
parent
3b7d21b7cf
commit
d772ba140f
41
SOURCES/glibc-upstream-2.34-34.patch
Normal file
41
SOURCES/glibc-upstream-2.34-34.patch
Normal file
@ -0,0 +1,41 @@
|
||||
commit 558168c78ea1eb8efb33959c1da9d6b5a997fd7b
|
||||
Author: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
Date: Wed Oct 6 21:48:35 2021 +0530
|
||||
|
||||
support: Also return fd when it is 0
|
||||
|
||||
The fd validity check in open_dev_null checks if fd > 0, which would
|
||||
lead to a leaked fd if it is == 0.
|
||||
|
||||
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
(cherry picked from commit 27b6edbb090f736b101f569620d8ad0e7217ddf8)
|
||||
|
||||
diff --git a/support/support-open-dev-null-range.c b/support/support-open-dev-null-range.c
|
||||
index 80d9dba50402ce12..66a850410557351b 100644
|
||||
--- a/support/support-open-dev-null-range.c
|
||||
+++ b/support/support-open-dev-null-range.c
|
||||
@@ -40,16 +40,16 @@ increase_nofile (void)
|
||||
static int
|
||||
open_dev_null (int flags, mode_t mode)
|
||||
{
|
||||
- int fd = open64 ("/dev/null", flags, mode);
|
||||
- if (fd > 0)
|
||||
- return fd;
|
||||
+ int fd = open64 ("/dev/null", flags, mode);
|
||||
+ if (fd >= 0)
|
||||
+ return fd;
|
||||
|
||||
- if (fd < 0 && errno != EMFILE)
|
||||
- FAIL_EXIT1 ("open64 (\"/dev/null\", 0x%x, 0%o): %m", flags, mode);
|
||||
+ if (fd < 0 && errno != EMFILE)
|
||||
+ FAIL_EXIT1 ("open64 (\"/dev/null\", 0x%x, 0%o): %m", flags, mode);
|
||||
|
||||
- increase_nofile ();
|
||||
+ increase_nofile ();
|
||||
|
||||
- return xopen ("/dev/null", flags, mode);
|
||||
+ return xopen ("/dev/null", flags, mode);
|
||||
}
|
||||
|
||||
struct range
|
83
SOURCES/glibc-upstream-2.34-35.patch
Normal file
83
SOURCES/glibc-upstream-2.34-35.patch
Normal file
@ -0,0 +1,83 @@
|
||||
commit cb44a620ef2336449af60694b6696efced161774
|
||||
Author: Stefan Liebler <stli@linux.ibm.com>
|
||||
Date: Tue Oct 5 16:14:10 2021 +0200
|
||||
|
||||
S390: Add PCI_MIO and SIE HWCAPs
|
||||
|
||||
Both new HWCAPs were introduced in these kernel commits:
|
||||
- 7e8403ecaf884f307b627f3c371475913dd29292
|
||||
"s390: add HWCAP_S390_PCI_MIO to ELF hwcaps"
|
||||
- 7e82523f2583e9813e4109df3656707162541297
|
||||
"s390/hwcaps: make sie capability regular hwcap"
|
||||
|
||||
Also note that the kernel commit 511ad531afd4090625def4d9aba1f5227bd44b8e
|
||||
"s390/hwcaps: shorten HWCAP defines" has shortened the prefix of the macros
|
||||
from "HWCAP_S390_" to "HWCAP_". For compatibility reasons, we do not
|
||||
change the prefix in public glibc header file.
|
||||
|
||||
(cherry picked from commit f2e06656d04a9fcb0603802a4f8ce7aa3a1f055e)
|
||||
|
||||
diff --git a/sysdeps/s390/dl-procinfo.c b/sysdeps/s390/dl-procinfo.c
|
||||
index c174e27b3559c57c..155f0bd99eccb3f9 100644
|
||||
--- a/sysdeps/s390/dl-procinfo.c
|
||||
+++ b/sysdeps/s390/dl-procinfo.c
|
||||
@@ -46,13 +46,13 @@
|
||||
#if !defined PROCINFO_DECL && defined SHARED
|
||||
._dl_s390_cap_flags
|
||||
#else
|
||||
-PROCINFO_CLASS const char _dl_s390_cap_flags[21][9]
|
||||
+PROCINFO_CLASS const char _dl_s390_cap_flags[23][9]
|
||||
#endif
|
||||
#ifndef PROCINFO_DECL
|
||||
= {
|
||||
"esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", "edat", "etf3eh",
|
||||
"highgprs", "te", "vx", "vxd", "vxe", "gs", "vxe2", "vxp", "sort", "dflt",
|
||||
- "vxp2", "nnpa"
|
||||
+ "vxp2", "nnpa", "pcimio", "sie"
|
||||
}
|
||||
#endif
|
||||
#if !defined SHARED || defined PROCINFO_DECL
|
||||
diff --git a/sysdeps/s390/dl-procinfo.h b/sysdeps/s390/dl-procinfo.h
|
||||
index 2d9c3058083e5dda..e4e3e334a5b3d47c 100644
|
||||
--- a/sysdeps/s390/dl-procinfo.h
|
||||
+++ b/sysdeps/s390/dl-procinfo.h
|
||||
@@ -21,7 +21,7 @@
|
||||
#define _DL_PROCINFO_H 1
|
||||
#include <ldsodefs.h>
|
||||
|
||||
-#define _DL_HWCAP_COUNT 21
|
||||
+#define _DL_HWCAP_COUNT 23
|
||||
|
||||
#define _DL_PLATFORMS_COUNT 10
|
||||
|
||||
@@ -63,6 +63,8 @@ enum
|
||||
HWCAP_S390_DFLT = 1 << 18,
|
||||
HWCAP_S390_VXRS_PDE2 = 1 << 19,
|
||||
HWCAP_S390_NNPA = 1 << 20,
|
||||
+ HWCAP_S390_PCI_MIO = 1 << 21,
|
||||
+ HWCAP_S390_SIE = 1 << 22,
|
||||
};
|
||||
|
||||
#define HWCAP_IMPORTANT (HWCAP_S390_ZARCH | HWCAP_S390_LDISP \
|
||||
diff --git a/sysdeps/unix/sysv/linux/s390/bits/hwcap.h b/sysdeps/unix/sysv/linux/s390/bits/hwcap.h
|
||||
index e9bd3684db862d1b..00e73a3e3bfdb711 100644
|
||||
--- a/sysdeps/unix/sysv/linux/s390/bits/hwcap.h
|
||||
+++ b/sysdeps/unix/sysv/linux/s390/bits/hwcap.h
|
||||
@@ -22,6 +22,11 @@
|
||||
|
||||
/*
|
||||
* The following must match the kernels asm/elf.h.
|
||||
+ * Note: The kernel commit 511ad531afd4090625def4d9aba1f5227bd44b8e
|
||||
+ * "s390/hwcaps: shorten HWCAP defines" has shortened the prefix of the macros
|
||||
+ * from "HWCAP_S390_" to "HWCAP_". For compatibility reasons, we do not
|
||||
+ * change the prefix in public glibc header file.
|
||||
+ *
|
||||
* Note that these are *not* the same as the STORE FACILITY LIST bits.
|
||||
*/
|
||||
#define HWCAP_S390_ESAN3 1
|
||||
@@ -48,3 +53,5 @@
|
||||
#define HWCAP_S390_DFLT 262144
|
||||
#define HWCAP_S390_VXRS_PDE2 524288
|
||||
#define HWCAP_S390_NNPA 1048576
|
||||
+#define HWCAP_S390_PCI_MIO 2097152
|
||||
+#define HWCAP_S390_SIE 4194304
|
47
SOURCES/glibc-upstream-2.34-36.patch
Normal file
47
SOURCES/glibc-upstream-2.34-36.patch
Normal file
@ -0,0 +1,47 @@
|
||||
commit 79528414dc1578800cbf1fba2fbdb6335f4f39bf
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Thu Sep 30 10:29:17 2021 -0700
|
||||
|
||||
elf: Replace nsid with args.nsid [BZ #27609]
|
||||
|
||||
commit ec935dea6332cb22f9881cd1162bad156173f4b0
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Fri Apr 24 22:31:15 2020 +0200
|
||||
|
||||
elf: Implement __libc_early_init
|
||||
|
||||
has
|
||||
|
||||
@@ -856,6 +876,11 @@ no more namespaces available for dlmopen()"));
|
||||
/* See if an error occurred during loading. */
|
||||
if (__glibc_unlikely (exception.errstring != NULL))
|
||||
{
|
||||
+ /* Avoid keeping around a dangling reference to the libc.so link
|
||||
+ map in case it has been cached in libc_map. */
|
||||
+ if (!args.libc_already_loaded)
|
||||
+ GL(dl_ns)[nsid].libc_map = NULL;
|
||||
+
|
||||
|
||||
do_dlopen calls _dl_open with nsid == __LM_ID_CALLER (-2), which calls
|
||||
dl_open_worker with args.nsid = nsid. dl_open_worker updates args.nsid
|
||||
if it is __LM_ID_CALLER. After dl_open_worker returns, it is wrong to
|
||||
use nsid.
|
||||
|
||||
Replace nsid with args.nsid after dl_open_worker returns. This fixes
|
||||
BZ #27609.
|
||||
|
||||
(cherry picked from commit 1e1ecea62e899acb58c3fdf3b320a0833ddd0dff)
|
||||
|
||||
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||
index ec386626f96e17f7..41c7250bf630f978 100644
|
||||
--- a/elf/dl-open.c
|
||||
+++ b/elf/dl-open.c
|
||||
@@ -886,7 +886,7 @@ no more namespaces available for dlmopen()"));
|
||||
/* Avoid keeping around a dangling reference to the libc.so link
|
||||
map in case it has been cached in libc_map. */
|
||||
if (!args.libc_already_loaded)
|
||||
- GL(dl_ns)[nsid].libc_map = NULL;
|
||||
+ GL(dl_ns)[args.nsid].libc_map = NULL;
|
||||
|
||||
/* Remove the object from memory. It may be in an inconsistent
|
||||
state if relocation failed, for example. */
|
137
SOURCES/glibc-upstream-2.34-37.patch
Normal file
137
SOURCES/glibc-upstream-2.34-37.patch
Normal file
@ -0,0 +1,137 @@
|
||||
commit 76843f3b3ecb886b8d300220e6ec378e0fd09a8b
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Wed Oct 6 08:10:13 2021 -0300
|
||||
|
||||
y2038: Use a common definition for stat for sparc32
|
||||
|
||||
The sparc32 misses support for support done by 4e8521333bea6.
|
||||
|
||||
Checked on sparcv9-linux-gnu.
|
||||
|
||||
(cherry picked from commit d2b1254db208b35ff060f00a15f22a1eed5306d2)
|
||||
|
||||
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/struct_stat.h b/sysdeps/unix/sysv/linux/sparc/bits/struct_stat.h
|
||||
index b481b4f9f80a94f4..45db6b6ffbb19b8b 100644
|
||||
--- a/sysdeps/unix/sysv/linux/sparc/bits/struct_stat.h
|
||||
+++ b/sysdeps/unix/sysv/linux/sparc/bits/struct_stat.h
|
||||
@@ -28,32 +28,35 @@
|
||||
|
||||
struct stat
|
||||
{
|
||||
+#ifdef __USE_TIME_BITS64
|
||||
+# include <bits/struct_stat_time64_helper.h>
|
||||
+#else
|
||||
__dev_t st_dev; /* Device. */
|
||||
-#if __WORDSIZE == 64 || !defined __USE_FILE_OFFSET64
|
||||
+# if __WORDSIZE == 64 || !defined __USE_FILE_OFFSET64
|
||||
unsigned short int __pad1;
|
||||
__ino_t st_ino; /* File serial number. */
|
||||
-#else
|
||||
+# else
|
||||
__ino64_t st_ino; /* File serial number. */
|
||||
-#endif
|
||||
+# endif
|
||||
__mode_t st_mode; /* File mode. */
|
||||
__nlink_t st_nlink; /* Link count. */
|
||||
__uid_t st_uid; /* User ID of the file's owner. */
|
||||
__gid_t st_gid; /* Group ID of the file's group.*/
|
||||
__dev_t st_rdev; /* Device number, if device. */
|
||||
unsigned short int __pad2;
|
||||
-#ifndef __USE_FILE_OFFSET64
|
||||
+# ifndef __USE_FILE_OFFSET64
|
||||
__off_t st_size; /* Size of file, in bytes. */
|
||||
-#else
|
||||
+# else
|
||||
__off64_t st_size; /* Size of file, in bytes. */
|
||||
-#endif
|
||||
+# endif
|
||||
__blksize_t st_blksize; /* Optimal block size for I/O. */
|
||||
|
||||
-#ifndef __USE_FILE_OFFSET64
|
||||
+# ifndef __USE_FILE_OFFSET64
|
||||
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
|
||||
-#else
|
||||
+# else
|
||||
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
|
||||
-#endif
|
||||
-#ifdef __USE_XOPEN2K8
|
||||
+# endif
|
||||
+# ifdef __USE_XOPEN2K8
|
||||
/* Nanosecond resolution timestamps are stored in a format
|
||||
equivalent to 'struct timespec'. This is the type used
|
||||
whenever possible but the Unix namespace rules do not allow the
|
||||
@@ -63,28 +66,32 @@ struct stat
|
||||
struct timespec st_atim; /* Time of last access. */
|
||||
struct timespec st_mtim; /* Time of last modification. */
|
||||
struct timespec st_ctim; /* Time of last status change. */
|
||||
-# define st_atime st_atim.tv_sec /* Backward compatibility. */
|
||||
-# define st_mtime st_mtim.tv_sec
|
||||
-# define st_ctime st_ctim.tv_sec
|
||||
-#else
|
||||
+# define st_atime st_atim.tv_sec /* Backward compatibility. */
|
||||
+# define st_mtime st_mtim.tv_sec
|
||||
+# define st_ctime st_ctim.tv_sec
|
||||
+# else
|
||||
__time_t st_atime; /* Time of last access. */
|
||||
unsigned long int st_atimensec; /* Nscecs of last access. */
|
||||
__time_t st_mtime; /* Time of last modification. */
|
||||
unsigned long int st_mtimensec; /* Nsecs of last modification. */
|
||||
__time_t st_ctime; /* Time of last status change. */
|
||||
unsigned long int st_ctimensec; /* Nsecs of last status change. */
|
||||
-#endif
|
||||
+# endif
|
||||
unsigned long int __glibc_reserved4;
|
||||
unsigned long int __glibc_reserved5;
|
||||
+#endif /* __USE_TIME_BITS64 */
|
||||
};
|
||||
|
||||
#ifdef __USE_LARGEFILE64
|
||||
struct stat64
|
||||
{
|
||||
+# ifdef __USE_TIME_BITS64
|
||||
+# include <bits/struct_stat_time64_helper.h>
|
||||
+# else
|
||||
__dev_t st_dev; /* Device. */
|
||||
-# if __WORDSIZE == 64
|
||||
+# if __WORDSIZE == 64
|
||||
unsigned short int __pad1;
|
||||
-# endif
|
||||
+# endif
|
||||
__ino64_t st_ino; /* File serial number. */
|
||||
__mode_t st_mode; /* File mode. */
|
||||
__nlink_t st_nlink; /* Link count. */
|
||||
@@ -96,7 +103,7 @@ struct stat64
|
||||
__blksize_t st_blksize; /* Optimal block size for I/O. */
|
||||
|
||||
__blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */
|
||||
-# ifdef __USE_XOPEN2K8
|
||||
+# ifdef __USE_XOPEN2K8
|
||||
/* Nanosecond resolution timestamps are stored in a format
|
||||
equivalent to 'struct timespec'. This is the type used
|
||||
whenever possible but the Unix namespace rules do not allow the
|
||||
@@ -106,19 +113,20 @@ struct stat64
|
||||
struct timespec st_atim; /* Time of last access. */
|
||||
struct timespec st_mtim; /* Time of last modification. */
|
||||
struct timespec st_ctim; /* Time of last status change. */
|
||||
-# define st_atime st_atim.tv_sec /* Backward compatibility. */
|
||||
-# define st_mtime st_mtim.tv_sec
|
||||
-# define st_ctime st_ctim.tv_sec
|
||||
-# else
|
||||
+# define st_atime st_atim.tv_sec /* Backward compatibility. */
|
||||
+# define st_mtime st_mtim.tv_sec
|
||||
+# define st_ctime st_ctim.tv_sec
|
||||
+# else
|
||||
__time_t st_atime; /* Time of last access. */
|
||||
unsigned long int st_atimensec; /* Nscecs of last access. */
|
||||
__time_t st_mtime; /* Time of last modification. */
|
||||
unsigned long int st_mtimensec; /* Nsecs of last modification. */
|
||||
__time_t st_ctime; /* Time of last status change. */
|
||||
unsigned long int st_ctimensec; /* Nsecs of last status change. */
|
||||
-# endif
|
||||
+# endif
|
||||
unsigned long int __glibc_reserved4;
|
||||
unsigned long int __glibc_reserved5;
|
||||
+# endif /* __USE_TIME_BITS64 */
|
||||
};
|
||||
#endif
|
||||
|
41
SOURCES/glibc-upstream-2.34-38.patch
Normal file
41
SOURCES/glibc-upstream-2.34-38.patch
Normal file
@ -0,0 +1,41 @@
|
||||
commit cb9b8b5d7670df1a13544857640efd86a299d0e4
|
||||
Author: Stafford Horne <shorne@gmail.com>
|
||||
Date: Fri Oct 15 06:17:41 2021 +0900
|
||||
|
||||
timex: Use 64-bit fields on 32-bit TIMESIZE=64 systems (BZ #28469)
|
||||
|
||||
This was found when testing the OpenRISC port I am working on. These
|
||||
two tests fail with SIGSEGV:
|
||||
|
||||
FAIL: misc/tst-ntp_gettime
|
||||
FAIL: misc/tst-ntp_gettimex
|
||||
|
||||
This was found to be due to the kernel overwriting the stack space
|
||||
allocated by the timex structure. The reason for the overwrite being
|
||||
that the kernel timex has 64-bit fields and user space code only
|
||||
allocates enough stack space for timex with 32-bit fields.
|
||||
|
||||
On 32-bit systems with TIMESIZE=64 __USE_TIME_BITS64 is not defined.
|
||||
This causes the timex structure to use 32-bit fields with type
|
||||
__syscall_slong_t.
|
||||
|
||||
This patch adjusts the ifdef condition to allow 32-bit systems with
|
||||
TIMESIZE=64 to use the 64-bit long long timex definition.
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
(Cherry picked from commit 1d550265a75b412cea4889a50b101395f6a8e025)
|
||||
|
||||
diff --git a/sysdeps/unix/sysv/linux/bits/timex.h b/sysdeps/unix/sysv/linux/bits/timex.h
|
||||
index ee37694e8f09a8e4..4a5db6deca10de58 100644
|
||||
--- a/sysdeps/unix/sysv/linux/bits/timex.h
|
||||
+++ b/sysdeps/unix/sysv/linux/bits/timex.h
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
struct timex
|
||||
{
|
||||
-# ifdef __USE_TIME_BITS64
|
||||
+# if defined __USE_TIME_BITS64 || (__TIMESIZE == 64 && __WORDSIZE == 32)
|
||||
unsigned int modes; /* mode selector */
|
||||
int :32; /* pad */
|
||||
long long offset; /* time offset (usec) */
|
466
SOURCES/glibc-upstream-2.34-39.patch
Normal file
466
SOURCES/glibc-upstream-2.34-39.patch
Normal file
@ -0,0 +1,466 @@
|
||||
commit 024a7640ab9ecea80e527f4e4d7f7a1868e952c5
|
||||
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||
Date: Wed Sep 15 15:16:19 2021 +0100
|
||||
|
||||
elf: Avoid deadlock between pthread_create and ctors [BZ #28357]
|
||||
|
||||
The fix for bug 19329 caused a regression such that pthread_create can
|
||||
deadlock when concurrent ctors from dlopen are waiting for it to finish.
|
||||
Use a new GL(dl_load_tls_lock) in pthread_create that is not taken
|
||||
around ctors in dlopen.
|
||||
|
||||
The new lock is also used in __tls_get_addr instead of GL(dl_load_lock).
|
||||
|
||||
The new lock is held in _dl_open_worker and _dl_close_worker around
|
||||
most of the logic before/after the init/fini routines. When init/fini
|
||||
routines are running then TLS is in a consistent, usable state.
|
||||
In _dl_open_worker the new lock requires catching and reraising dlopen
|
||||
failures that happen in the critical section.
|
||||
|
||||
The new lock is reinitialized in a fork child, to keep the existing
|
||||
behaviour and it is kept recursive in case malloc interposition or TLS
|
||||
access from signal handlers can retake it. It is not obvious if this
|
||||
is necessary or helps, but avoids changing the preexisting behaviour.
|
||||
|
||||
The new lock may be more appropriate for dl_iterate_phdr too than
|
||||
GL(dl_load_write_lock), since TLS state of an incompletely loaded
|
||||
module may be accessed. If the new lock can replace the old one,
|
||||
that can be a separate change.
|
||||
|
||||
Fixes bug 28357.
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
(cherry picked from commit 83b5323261bb72313bffcf37476c1b8f0847c736)
|
||||
|
||||
diff --git a/elf/dl-close.c b/elf/dl-close.c
|
||||
index f39001cab981b723..cd7b9c9fe83a1a44 100644
|
||||
--- a/elf/dl-close.c
|
||||
+++ b/elf/dl-close.c
|
||||
@@ -549,6 +549,9 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||
size_t tls_free_end;
|
||||
tls_free_start = tls_free_end = NO_TLS_OFFSET;
|
||||
|
||||
+ /* Protects global and module specitic TLS state. */
|
||||
+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
|
||||
+
|
||||
/* We modify the list of loaded objects. */
|
||||
__rtld_lock_lock_recursive (GL(dl_load_write_lock));
|
||||
|
||||
@@ -784,6 +787,9 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||
GL(dl_tls_static_used) = tls_free_start;
|
||||
}
|
||||
|
||||
+ /* TLS is cleaned up for the unloaded modules. */
|
||||
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||
+
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we have deleted all objects. */
|
||||
if (__glibc_unlikely (do_audit))
|
||||
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||
index 41c7250bf630f978..bc68e2c376debd71 100644
|
||||
--- a/elf/dl-open.c
|
||||
+++ b/elf/dl-open.c
|
||||
@@ -66,6 +66,9 @@ struct dl_open_args
|
||||
libc_map value in the namespace in case of a dlopen failure. */
|
||||
bool libc_already_loaded;
|
||||
|
||||
+ /* Set to true if the end of dl_open_worker_begin was reached. */
|
||||
+ bool worker_continue;
|
||||
+
|
||||
/* Original parameters to the program and the current environment. */
|
||||
int argc;
|
||||
char **argv;
|
||||
@@ -482,7 +485,7 @@ call_dl_init (void *closure)
|
||||
}
|
||||
|
||||
static void
|
||||
-dl_open_worker (void *a)
|
||||
+dl_open_worker_begin (void *a)
|
||||
{
|
||||
struct dl_open_args *args = a;
|
||||
const char *file = args->file;
|
||||
@@ -774,6 +777,36 @@ dl_open_worker (void *a)
|
||||
_dl_call_libc_early_init (libc_map, false);
|
||||
}
|
||||
|
||||
+ args->worker_continue = true;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+dl_open_worker (void *a)
|
||||
+{
|
||||
+ struct dl_open_args *args = a;
|
||||
+
|
||||
+ args->worker_continue = false;
|
||||
+
|
||||
+ {
|
||||
+ /* Protects global and module specific TLS state. */
|
||||
+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
|
||||
+
|
||||
+ struct dl_exception ex;
|
||||
+ int err = _dl_catch_exception (&ex, dl_open_worker_begin, args);
|
||||
+
|
||||
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||
+
|
||||
+ if (__glibc_unlikely (ex.errstring != NULL))
|
||||
+ /* Reraise the error. */
|
||||
+ _dl_signal_exception (err, &ex, NULL);
|
||||
+ }
|
||||
+
|
||||
+ if (!args->worker_continue)
|
||||
+ return;
|
||||
+
|
||||
+ int mode = args->mode;
|
||||
+ struct link_map *new = args->map;
|
||||
+
|
||||
/* Run the initializer functions of new objects. Temporarily
|
||||
disable the exception handler, so that lazy binding failures are
|
||||
fatal. */
|
||||
diff --git a/elf/dl-support.c b/elf/dl-support.c
|
||||
index 01557181753fb38d..d8c06ba7eb4c76ea 100644
|
||||
--- a/elf/dl-support.c
|
||||
+++ b/elf/dl-support.c
|
||||
@@ -229,6 +229,13 @@ __rtld_lock_define_initialized_recursive (, _dl_load_lock)
|
||||
list of loaded objects while an object is added to or removed from
|
||||
that list. */
|
||||
__rtld_lock_define_initialized_recursive (, _dl_load_write_lock)
|
||||
+ /* This lock protects global and module specific TLS related data.
|
||||
+ E.g. it is held in dlopen and dlclose when GL(dl_tls_generation),
|
||||
+ GL(dl_tls_max_dtv_idx) or GL(dl_tls_dtv_slotinfo_list) are
|
||||
+ accessed and when TLS related relocations are processed for a
|
||||
+ module. It was introduced to keep pthread_create accessing TLS
|
||||
+ state that is being set up. */
|
||||
+__rtld_lock_define_initialized_recursive (, _dl_load_tls_lock)
|
||||
|
||||
|
||||
#ifdef HAVE_AUX_VECTOR
|
||||
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
|
||||
index 423e380f7ca654fe..40263cf586e74c64 100644
|
||||
--- a/elf/dl-tls.c
|
||||
+++ b/elf/dl-tls.c
|
||||
@@ -532,7 +532,7 @@ _dl_allocate_tls_init (void *result)
|
||||
size_t maxgen = 0;
|
||||
|
||||
/* Protects global dynamic TLS related state. */
|
||||
- __rtld_lock_lock_recursive (GL(dl_load_lock));
|
||||
+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
|
||||
|
||||
/* Check if the current dtv is big enough. */
|
||||
if (dtv[-1].counter < GL(dl_tls_max_dtv_idx))
|
||||
@@ -606,7 +606,7 @@ _dl_allocate_tls_init (void *result)
|
||||
listp = listp->next;
|
||||
assert (listp != NULL);
|
||||
}
|
||||
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||
|
||||
/* The DTV version is up-to-date now. */
|
||||
dtv[0].counter = maxgen;
|
||||
@@ -745,7 +745,7 @@ _dl_update_slotinfo (unsigned long int req_modid)
|
||||
|
||||
Here the dtv needs to be updated to new_gen generation count.
|
||||
|
||||
- This code may be called during TLS access when GL(dl_load_lock)
|
||||
+ This code may be called during TLS access when GL(dl_load_tls_lock)
|
||||
is not held. In that case the user code has to synchronize with
|
||||
dlopen and dlclose calls of relevant modules. A module m is
|
||||
relevant if the generation of m <= new_gen and dlclose of m is
|
||||
@@ -867,11 +867,11 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
|
||||
if (__glibc_unlikely (the_map->l_tls_offset
|
||||
!= FORCED_DYNAMIC_TLS_OFFSET))
|
||||
{
|
||||
- __rtld_lock_lock_recursive (GL(dl_load_lock));
|
||||
+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock));
|
||||
if (__glibc_likely (the_map->l_tls_offset == NO_TLS_OFFSET))
|
||||
{
|
||||
the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
|
||||
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||
}
|
||||
else if (__glibc_likely (the_map->l_tls_offset
|
||||
!= FORCED_DYNAMIC_TLS_OFFSET))
|
||||
@@ -883,7 +883,7 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
|
||||
#else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||
|
||||
dtv[GET_ADDR_MODULE].pointer.to_free = NULL;
|
||||
dtv[GET_ADDR_MODULE].pointer.val = p;
|
||||
@@ -891,7 +891,7 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
|
||||
return (char *) p + GET_ADDR_OFFSET;
|
||||
}
|
||||
else
|
||||
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||
+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||
}
|
||||
struct dtv_pointer result = allocate_and_init (the_map);
|
||||
dtv[GET_ADDR_MODULE].pointer = result;
|
||||
@@ -962,7 +962,7 @@ _dl_tls_get_addr_soft (struct link_map *l)
|
||||
return NULL;
|
||||
|
||||
dtv_t *dtv = THREAD_DTV ();
|
||||
- /* This may be called without holding the GL(dl_load_lock). Reading
|
||||
+ /* This may be called without holding the GL(dl_load_tls_lock). Reading
|
||||
arbitrary gen value is fine since this is best effort code. */
|
||||
size_t gen = atomic_load_relaxed (&GL(dl_tls_generation));
|
||||
if (__glibc_unlikely (dtv[0].counter != gen))
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index d733359eaf808b8a..08cf50145a1c01ce 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -322,6 +322,7 @@ struct rtld_global _rtld_global =
|
||||
#ifdef _LIBC_REENTRANT
|
||||
._dl_load_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
|
||||
._dl_load_write_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
|
||||
+ ._dl_load_tls_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
|
||||
#endif
|
||||
._dl_nns = 1,
|
||||
._dl_ns =
|
||||
diff --git a/posix/fork.c b/posix/fork.c
|
||||
index c471f7b15fe4290d..021691b9b7441f15 100644
|
||||
--- a/posix/fork.c
|
||||
+++ b/posix/fork.c
|
||||
@@ -99,6 +99,9 @@ __libc_fork (void)
|
||||
/* Reset the lock the dynamic loader uses to protect its data. */
|
||||
__rtld_lock_initialize (GL(dl_load_lock));
|
||||
|
||||
+ /* Reset the lock protecting dynamic TLS related data. */
|
||||
+ __rtld_lock_initialize (GL(dl_load_tls_lock));
|
||||
+
|
||||
reclaim_stacks ();
|
||||
|
||||
/* Run the handlers registered for the child. */
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 9c15259236adab43..1ceb9c3212c148ba 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -372,6 +372,13 @@ struct rtld_global
|
||||
list of loaded objects while an object is added to or removed
|
||||
from that list. */
|
||||
__rtld_lock_define_recursive (EXTERN, _dl_load_write_lock)
|
||||
+ /* This lock protects global and module specific TLS related data.
|
||||
+ E.g. it is held in dlopen and dlclose when GL(dl_tls_generation),
|
||||
+ GL(dl_tls_max_dtv_idx) or GL(dl_tls_dtv_slotinfo_list) are
|
||||
+ accessed and when TLS related relocations are processed for a
|
||||
+ module. It was introduced to keep pthread_create accessing TLS
|
||||
+ state that is being set up. */
|
||||
+ __rtld_lock_define_recursive (EXTERN, _dl_load_tls_lock)
|
||||
|
||||
/* Incremented whenever something may have been added to dl_loaded. */
|
||||
EXTERN unsigned long long _dl_load_adds;
|
||||
@@ -1261,7 +1268,7 @@ extern int _dl_scope_free (void *) attribute_hidden;
|
||||
|
||||
/* Add module to slot information data. If DO_ADD is false, only the
|
||||
required memory is allocated. Must be called with GL
|
||||
- (dl_load_lock) acquired. If the function has already been called
|
||||
+ (dl_load_tls_lock) acquired. If the function has already been called
|
||||
for the link map L with !do_add, then this function will not raise
|
||||
an exception, otherwise it is possible that it encounters a memory
|
||||
allocation failure. */
|
||||
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
|
||||
index 0af9c59b425aefb1..df8943f4860a39d8 100644
|
||||
--- a/sysdeps/pthread/Makefile
|
||||
+++ b/sysdeps/pthread/Makefile
|
||||
@@ -152,15 +152,17 @@ tests += tst-cancelx2 tst-cancelx3 tst-cancelx6 tst-cancelx8 tst-cancelx9 \
|
||||
tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3
|
||||
|
||||
ifeq ($(build-shared),yes)
|
||||
-tests += tst-atfork2 tst-pt-tls4 tst-_res1 tst-fini1
|
||||
+tests += tst-atfork2 tst-pt-tls4 tst-_res1 tst-fini1 tst-create1
|
||||
tests-nolibpthread += tst-fini1
|
||||
endif
|
||||
|
||||
modules-names += tst-atfork2mod tst-tls4moda tst-tls4modb \
|
||||
- tst-_res1mod1 tst-_res1mod2 tst-fini1mod
|
||||
+ tst-_res1mod1 tst-_res1mod2 tst-fini1mod \
|
||||
+ tst-create1mod
|
||||
test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names)))
|
||||
|
||||
tst-atfork2mod.so-no-z-defs = yes
|
||||
+tst-create1mod.so-no-z-defs = yes
|
||||
|
||||
ifeq ($(build-shared),yes)
|
||||
# Build all the modules even when not actually running test programs.
|
||||
@@ -279,4 +281,8 @@ LDFLAGS-tst-join7mod.so = -Wl,-soname,tst-join7mod.so
|
||||
|
||||
CFLAGS-tst-unwind-thread.c += -funwind-tables
|
||||
|
||||
+LDFLAGS-tst-create1 = -Wl,-export-dynamic
|
||||
+$(objpfx)tst-create1: $(shared-thread-library)
|
||||
+$(objpfx)tst-create1.out: $(objpfx)tst-create1mod.so
|
||||
+
|
||||
endif
|
||||
diff --git a/sysdeps/pthread/tst-create1.c b/sysdeps/pthread/tst-create1.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..932586c30990d1d4
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/pthread/tst-create1.c
|
||||
@@ -0,0 +1,119 @@
|
||||
+/* Verify that pthread_create does not deadlock when ctors take locks.
|
||||
+ Copyright (C) 2021 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 <stdio.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+#include <support/xthread.h>
|
||||
+
|
||||
+/*
|
||||
+Check if ctor and pthread_create deadlocks in
|
||||
+
|
||||
+thread 1: dlopen -> ctor -> lock(user_lock)
|
||||
+thread 2: lock(user_lock) -> pthread_create
|
||||
+
|
||||
+or in
|
||||
+
|
||||
+thread 1: dlclose -> dtor -> lock(user_lock)
|
||||
+thread 2: lock(user_lock) -> pthread_create
|
||||
+*/
|
||||
+
|
||||
+static pthread_barrier_t bar_ctor;
|
||||
+static pthread_barrier_t bar_dtor;
|
||||
+static pthread_mutex_t user_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
+
|
||||
+void
|
||||
+ctor (void)
|
||||
+{
|
||||
+ xpthread_barrier_wait (&bar_ctor);
|
||||
+ dprintf (1, "thread 1: in ctor: started.\n");
|
||||
+ xpthread_mutex_lock (&user_lock);
|
||||
+ dprintf (1, "thread 1: in ctor: locked user_lock.\n");
|
||||
+ xpthread_mutex_unlock (&user_lock);
|
||||
+ dprintf (1, "thread 1: in ctor: unlocked user_lock.\n");
|
||||
+ dprintf (1, "thread 1: in ctor: done.\n");
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+dtor (void)
|
||||
+{
|
||||
+ xpthread_barrier_wait (&bar_dtor);
|
||||
+ dprintf (1, "thread 1: in dtor: started.\n");
|
||||
+ xpthread_mutex_lock (&user_lock);
|
||||
+ dprintf (1, "thread 1: in dtor: locked user_lock.\n");
|
||||
+ xpthread_mutex_unlock (&user_lock);
|
||||
+ dprintf (1, "thread 1: in dtor: unlocked user_lock.\n");
|
||||
+ dprintf (1, "thread 1: in dtor: done.\n");
|
||||
+}
|
||||
+
|
||||
+static void *
|
||||
+thread3 (void *a)
|
||||
+{
|
||||
+ dprintf (1, "thread 3: started.\n");
|
||||
+ dprintf (1, "thread 3: done.\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void *
|
||||
+thread2 (void *a)
|
||||
+{
|
||||
+ pthread_t t3;
|
||||
+ dprintf (1, "thread 2: started.\n");
|
||||
+
|
||||
+ xpthread_mutex_lock (&user_lock);
|
||||
+ dprintf (1, "thread 2: locked user_lock.\n");
|
||||
+ xpthread_barrier_wait (&bar_ctor);
|
||||
+ t3 = xpthread_create (0, thread3, 0);
|
||||
+ xpthread_mutex_unlock (&user_lock);
|
||||
+ dprintf (1, "thread 2: unlocked user_lock.\n");
|
||||
+ xpthread_join (t3);
|
||||
+
|
||||
+ xpthread_mutex_lock (&user_lock);
|
||||
+ dprintf (1, "thread 2: locked user_lock.\n");
|
||||
+ xpthread_barrier_wait (&bar_dtor);
|
||||
+ t3 = xpthread_create (0, thread3, 0);
|
||||
+ xpthread_mutex_unlock (&user_lock);
|
||||
+ dprintf (1, "thread 2: unlocked user_lock.\n");
|
||||
+ xpthread_join (t3);
|
||||
+
|
||||
+ dprintf (1, "thread 2: done.\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+thread1 (void)
|
||||
+{
|
||||
+ dprintf (1, "thread 1: started.\n");
|
||||
+ xpthread_barrier_init (&bar_ctor, NULL, 2);
|
||||
+ xpthread_barrier_init (&bar_dtor, NULL, 2);
|
||||
+ pthread_t t2 = xpthread_create (0, thread2, 0);
|
||||
+ void *p = xdlopen ("tst-create1mod.so", RTLD_NOW | RTLD_GLOBAL);
|
||||
+ dprintf (1, "thread 1: dlopen done.\n");
|
||||
+ xdlclose (p);
|
||||
+ dprintf (1, "thread 1: dlclose done.\n");
|
||||
+ xpthread_join (t2);
|
||||
+ dprintf (1, "thread 1: done.\n");
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ thread1 ();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/sysdeps/pthread/tst-create1mod.c b/sysdeps/pthread/tst-create1mod.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..62c9006961683177
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/pthread/tst-create1mod.c
|
||||
@@ -0,0 +1,41 @@
|
||||
+/* Verify that pthread_create does not deadlock when ctors take locks.
|
||||
+ Copyright (C) 2021 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 <stdio.h>
|
||||
+
|
||||
+/* Require TLS setup for the module. */
|
||||
+__thread int tlsvar;
|
||||
+
|
||||
+void ctor (void);
|
||||
+void dtor (void);
|
||||
+
|
||||
+static void __attribute__ ((constructor))
|
||||
+do_init (void)
|
||||
+{
|
||||
+ dprintf (1, "constructor started: %d.\n", tlsvar++);
|
||||
+ ctor ();
|
||||
+ dprintf (1, "constructor done: %d.\n", tlsvar++);
|
||||
+}
|
||||
+
|
||||
+static void __attribute__ ((destructor))
|
||||
+do_end (void)
|
||||
+{
|
||||
+ dprintf (1, "destructor started: %d.\n", tlsvar++);
|
||||
+ dtor ();
|
||||
+ dprintf (1, "destructor done: %d.\n", tlsvar++);
|
||||
+}
|
151
SOURCES/glibc-upstream-2.34-40.patch
Normal file
151
SOURCES/glibc-upstream-2.34-40.patch
Normal file
@ -0,0 +1,151 @@
|
||||
commit 01bffc013cdad1e0c45db7aa57efb2bee61f3338
|
||||
Author: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
Date: Fri Oct 29 14:53:55 2021 +0530
|
||||
|
||||
Handle NULL input to malloc_usable_size [BZ #28506]
|
||||
|
||||
Hoist the NULL check for malloc_usable_size into its entry points in
|
||||
malloc-debug and malloc and assume non-NULL in all callees. This fixes
|
||||
BZ #28506
|
||||
|
||||
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
|
||||
(cherry picked from commit 88e316b06414ee7c944cd6f8b30b07a972b78499)
|
||||
|
||||
diff --git a/malloc/malloc-debug.c b/malloc/malloc-debug.c
|
||||
index 9922ef5f25d2e018..3d7e6d44fdc9e17b 100644
|
||||
--- a/malloc/malloc-debug.c
|
||||
+++ b/malloc/malloc-debug.c
|
||||
@@ -1,5 +1,6 @@
|
||||
/* Malloc debug DSO.
|
||||
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
+ Copyright The GNU Toolchain Authors.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@@ -399,17 +400,17 @@ strong_alias (__debug_calloc, calloc)
|
||||
size_t
|
||||
malloc_usable_size (void *mem)
|
||||
{
|
||||
+ if (mem == NULL)
|
||||
+ return 0;
|
||||
+
|
||||
if (__is_malloc_debug_enabled (MALLOC_MCHECK_HOOK))
|
||||
return mcheck_usable_size (mem);
|
||||
if (__is_malloc_debug_enabled (MALLOC_CHECK_HOOK))
|
||||
return malloc_check_get_size (mem);
|
||||
|
||||
- if (mem != NULL)
|
||||
- {
|
||||
- mchunkptr p = mem2chunk (mem);
|
||||
- if (DUMPED_MAIN_ARENA_CHUNK (p))
|
||||
- return chunksize (p) - SIZE_SZ;
|
||||
- }
|
||||
+ mchunkptr p = mem2chunk (mem);
|
||||
+ if (DUMPED_MAIN_ARENA_CHUNK (p))
|
||||
+ return chunksize (p) - SIZE_SZ;
|
||||
|
||||
return musable (mem);
|
||||
}
|
||||
diff --git a/malloc/malloc.c b/malloc/malloc.c
|
||||
index e065785af77af72c..7882c70f0a0312d1 100644
|
||||
--- a/malloc/malloc.c
|
||||
+++ b/malloc/malloc.c
|
||||
@@ -1,5 +1,6 @@
|
||||
/* Malloc implementation for multiple threads without lock contention.
|
||||
Copyright (C) 1996-2021 Free Software Foundation, Inc.
|
||||
+ Copyright The GNU Toolchain Authors.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Wolfram Gloger <wg@malloc.de>
|
||||
and Doug Lea <dl@cs.oswego.edu>, 2001.
|
||||
@@ -5009,20 +5010,13 @@ __malloc_trim (size_t s)
|
||||
static size_t
|
||||
musable (void *mem)
|
||||
{
|
||||
- mchunkptr p;
|
||||
- if (mem != 0)
|
||||
- {
|
||||
- size_t result = 0;
|
||||
-
|
||||
- p = mem2chunk (mem);
|
||||
+ mchunkptr p = mem2chunk (mem);
|
||||
|
||||
- if (chunk_is_mmapped (p))
|
||||
- result = chunksize (p) - CHUNK_HDR_SZ;
|
||||
- else if (inuse (p))
|
||||
- result = memsize (p);
|
||||
+ if (chunk_is_mmapped (p))
|
||||
+ return chunksize (p) - CHUNK_HDR_SZ;
|
||||
+ else if (inuse (p))
|
||||
+ return memsize (p);
|
||||
|
||||
- return result;
|
||||
- }
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5030,10 +5024,9 @@ musable (void *mem)
|
||||
size_t
|
||||
__malloc_usable_size (void *m)
|
||||
{
|
||||
- size_t result;
|
||||
-
|
||||
- result = musable (m);
|
||||
- return result;
|
||||
+ if (m == NULL)
|
||||
+ return 0;
|
||||
+ return musable (m);
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/malloc/tst-malloc-usable.c b/malloc/tst-malloc-usable.c
|
||||
index a1074b782a0de96c..b0d702be10ba1610 100644
|
||||
--- a/malloc/tst-malloc-usable.c
|
||||
+++ b/malloc/tst-malloc-usable.c
|
||||
@@ -2,6 +2,7 @@
|
||||
MALLOC_CHECK_ exported to a positive value.
|
||||
|
||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
||||
+ Copyright The GNU Toolchain Authors.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@@ -21,29 +22,24 @@
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
+#include <support/support.h>
|
||||
+#include <support/check.h>
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
size_t usable_size;
|
||||
void *p = malloc (7);
|
||||
- if (!p)
|
||||
- {
|
||||
- printf ("memory allocation failed\n");
|
||||
- return 1;
|
||||
- }
|
||||
|
||||
+ TEST_VERIFY_EXIT (p != NULL);
|
||||
usable_size = malloc_usable_size (p);
|
||||
- if (usable_size != 7)
|
||||
- {
|
||||
- printf ("malloc_usable_size: expected 7 but got %zu\n", usable_size);
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
+ TEST_COMPARE (usable_size, 7);
|
||||
memset (p, 0, usable_size);
|
||||
free (p);
|
||||
+
|
||||
+ TEST_COMPARE (malloc_usable_size (NULL), 0);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
-#define TEST_FUNCTION do_test ()
|
||||
-#include "../test-skeleton.c"
|
||||
+#include "support/test-driver.c"
|
489
SOURCES/glibc-upstream-2.34-41.patch
Normal file
489
SOURCES/glibc-upstream-2.34-41.patch
Normal file
@ -0,0 +1,489 @@
|
||||
commit f42373f911a28d34325a5bfc1ed5a962c89da7eb
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Thu Sep 16 08:15:29 2021 -0700
|
||||
|
||||
ld.so: Replace DL_RO_DYN_SECTION with dl_relocate_ld [BZ #28340]
|
||||
|
||||
We can't relocate entries in dynamic section if it is readonly:
|
||||
|
||||
1. Add a l_ld_readonly field to struct link_map to indicate if dynamic
|
||||
section is readonly and set it based on p_flags of PT_DYNAMIC segment.
|
||||
2. Replace DL_RO_DYN_SECTION with dl_relocate_ld to decide if dynamic
|
||||
section should be relocated.
|
||||
3. Remove DL_RO_DYN_TEMP_CNT.
|
||||
4. Don't use a static dynamic section to make readonly dynamic section
|
||||
in vDSO writable.
|
||||
5. Remove the temp argument from elf_get_dynamic_info.
|
||||
|
||||
This fixes BZ #28340.
|
||||
|
||||
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
(cherry picked from commit b413280cfb16834450f66f554bc0d618bb513851)
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index d05f410592723f09..de854b4d1a815bd3 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -224,7 +224,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-tls-ie tst-tls-ie-dlmopen argv0test \
|
||||
tst-glibc-hwcaps tst-glibc-hwcaps-prepend tst-glibc-hwcaps-mask \
|
||||
tst-tls20 tst-tls21 tst-dlmopen-dlerror tst-dlmopen-gethostbyname \
|
||||
- tst-dl-is_dso
|
||||
+ tst-dl-is_dso tst-ro-dynamic
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
@@ -357,7 +357,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
libmarkermod4-1 libmarkermod4-2 libmarkermod4-3 libmarkermod4-4 \
|
||||
tst-tls20mod-bad tst-tls21mod tst-dlmopen-dlerror-mod \
|
||||
tst-auxvalmod \
|
||||
- tst-dlmopen-gethostbyname-mod \
|
||||
+ tst-dlmopen-gethostbyname-mod tst-ro-dynamic-mod \
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
||||
@@ -1906,3 +1906,10 @@ $(objpfx)tst-getauxval-static.out: $(objpfx)tst-auxvalmod.so
|
||||
tst-getauxval-static-ENV = LD_LIBRARY_PATH=$(objpfx):$(common-objpfx)
|
||||
|
||||
$(objpfx)tst-dlmopen-gethostbyname.out: $(objpfx)tst-dlmopen-gethostbyname-mod.so
|
||||
+
|
||||
+$(objpfx)tst-ro-dynamic: $(objpfx)tst-ro-dynamic-mod.so
|
||||
+$(objpfx)tst-ro-dynamic-mod.so: $(objpfx)tst-ro-dynamic-mod.os \
|
||||
+ tst-ro-dynamic-mod.map
|
||||
+ $(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
|
||||
+ -Wl,--script=tst-ro-dynamic-mod.map \
|
||||
+ $(objpfx)tst-ro-dynamic-mod.os
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index 650e4edc35e5e582..4445c28ef3fb4a7e 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -1149,6 +1149,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
|
||||
such a segment to avoid a crash later. */
|
||||
l->l_ld = (void *) ph->p_vaddr;
|
||||
l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn));
|
||||
+ l->l_ld_readonly = (ph->p_flags & PF_W) == 0;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1292,7 +1293,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
|
||||
else
|
||||
l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr);
|
||||
|
||||
- elf_get_dynamic_info (l, NULL);
|
||||
+ elf_get_dynamic_info (l);
|
||||
|
||||
/* Make sure we are not dlopen'ing an object that has the
|
||||
DF_1_NOOPEN flag set, or a PIE object. */
|
||||
diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c
|
||||
index d5bd2f31e9ca50ce..2fb02d727654c87d 100644
|
||||
--- a/elf/dl-reloc-static-pie.c
|
||||
+++ b/elf/dl-reloc-static-pie.c
|
||||
@@ -40,7 +40,17 @@ _dl_relocate_static_pie (void)
|
||||
|
||||
/* Read our own dynamic section and fill in the info array. */
|
||||
main_map->l_ld = ((void *) main_map->l_addr + elf_machine_dynamic ());
|
||||
- elf_get_dynamic_info (main_map, NULL);
|
||||
+
|
||||
+ const ElfW(Phdr) *ph, *phdr = GL(dl_phdr);
|
||||
+ size_t phnum = GL(dl_phnum);
|
||||
+ for (ph = phdr; ph < &phdr[phnum]; ++ph)
|
||||
+ if (ph->p_type == PT_DYNAMIC)
|
||||
+ {
|
||||
+ main_map->l_ld_readonly = (ph->p_flags & PF_W) == 0;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ elf_get_dynamic_info (main_map);
|
||||
|
||||
# ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
|
||||
ELF_MACHINE_BEFORE_RTLD_RELOC (main_map->l_info);
|
||||
diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h
|
||||
index d8ec32377d37635c..4aa2058abf6443c9 100644
|
||||
--- a/elf/get-dynamic-info.h
|
||||
+++ b/elf/get-dynamic-info.h
|
||||
@@ -28,7 +28,7 @@ static
|
||||
auto
|
||||
#endif
|
||||
inline void __attribute__ ((unused, always_inline))
|
||||
-elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
|
||||
+elf_get_dynamic_info (struct link_map *l)
|
||||
{
|
||||
#if __ELF_NATIVE_CLASS == 32
|
||||
typedef Elf32_Word d_tag_utype;
|
||||
@@ -69,28 +69,15 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
|
||||
info[i] = dyn;
|
||||
}
|
||||
|
||||
-#define DL_RO_DYN_TEMP_CNT 8
|
||||
-
|
||||
-#ifndef DL_RO_DYN_SECTION
|
||||
/* Don't adjust .dynamic unnecessarily. */
|
||||
- if (l->l_addr != 0)
|
||||
+ if (l->l_addr != 0 && dl_relocate_ld (l))
|
||||
{
|
||||
ElfW(Addr) l_addr = l->l_addr;
|
||||
- int cnt = 0;
|
||||
|
||||
# define ADJUST_DYN_INFO(tag) \
|
||||
do \
|
||||
if (info[tag] != NULL) \
|
||||
- { \
|
||||
- if (temp) \
|
||||
- { \
|
||||
- temp[cnt].d_tag = info[tag]->d_tag; \
|
||||
- temp[cnt].d_un.d_ptr = info[tag]->d_un.d_ptr + l_addr; \
|
||||
- info[tag] = temp + cnt++; \
|
||||
- } \
|
||||
- else \
|
||||
- info[tag]->d_un.d_ptr += l_addr; \
|
||||
- } \
|
||||
+ info[tag]->d_un.d_ptr += l_addr; \
|
||||
while (0)
|
||||
|
||||
ADJUST_DYN_INFO (DT_HASH);
|
||||
@@ -107,9 +94,7 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
|
||||
ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM));
|
||||
ADJUST_DYN_INFO (ADDRIDX (DT_GNU_HASH));
|
||||
# undef ADJUST_DYN_INFO
|
||||
- assert (cnt <= DL_RO_DYN_TEMP_CNT);
|
||||
}
|
||||
-#endif
|
||||
if (info[DT_PLTREL] != NULL)
|
||||
{
|
||||
#if ELF_MACHINE_NO_RELA
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index 08cf50145a1c01ce..405166d62b34847c 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -464,6 +464,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
|
||||
#ifndef DONT_USE_BOOTSTRAP_MAP
|
||||
GL(dl_rtld_map).l_addr = info->l.l_addr;
|
||||
GL(dl_rtld_map).l_ld = info->l.l_ld;
|
||||
+ GL(dl_rtld_map).l_ld_readonly = info->l.l_ld_readonly;
|
||||
memcpy (GL(dl_rtld_map).l_info, info->l.l_info,
|
||||
sizeof GL(dl_rtld_map).l_info);
|
||||
GL(dl_rtld_map).l_mach = info->l.l_mach;
|
||||
@@ -547,7 +548,7 @@ _dl_start (void *arg)
|
||||
|
||||
/* Read our own dynamic section and fill in the info array. */
|
||||
bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
|
||||
- elf_get_dynamic_info (&bootstrap_map, NULL);
|
||||
+ elf_get_dynamic_info (&bootstrap_map);
|
||||
|
||||
#if NO_TLS_OFFSET != 0
|
||||
bootstrap_map.l_tls_offset = NO_TLS_OFFSET;
|
||||
@@ -1469,6 +1470,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
/* This tells us where to find the dynamic section,
|
||||
which tells us everything we need to do. */
|
||||
main_map->l_ld = (void *) main_map->l_addr + ph->p_vaddr;
|
||||
+ main_map->l_ld_readonly = (ph->p_flags & PF_W) == 0;
|
||||
break;
|
||||
case PT_INTERP:
|
||||
/* This "interpreter segment" was used by the program loader to
|
||||
@@ -1614,7 +1616,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
if (! rtld_is_main)
|
||||
{
|
||||
/* Extract the contents of the dynamic section for easy access. */
|
||||
- elf_get_dynamic_info (main_map, NULL);
|
||||
+ elf_get_dynamic_info (main_map);
|
||||
|
||||
/* If the main map is libc.so, update the base namespace to
|
||||
refer to this map. If libc.so is loaded later, this happens
|
||||
diff --git a/elf/setup-vdso.h b/elf/setup-vdso.h
|
||||
index 86c491e49c98345d..f44748bc9858e5fd 100644
|
||||
--- a/elf/setup-vdso.h
|
||||
+++ b/elf/setup-vdso.h
|
||||
@@ -33,8 +33,6 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
|
||||
0, LM_ID_BASE);
|
||||
if (__glibc_likely (l != NULL))
|
||||
{
|
||||
- static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT] attribute_relro;
|
||||
-
|
||||
l->l_phdr = ((const void *) GLRO(dl_sysinfo_dso)
|
||||
+ GLRO(dl_sysinfo_dso)->e_phoff);
|
||||
l->l_phnum = GLRO(dl_sysinfo_dso)->e_phnum;
|
||||
@@ -45,6 +43,7 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
|
||||
{
|
||||
l->l_ld = (void *) ph->p_vaddr;
|
||||
l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn));
|
||||
+ l->l_ld_readonly = (ph->p_flags & PF_W) == 0;
|
||||
}
|
||||
else if (ph->p_type == PT_LOAD)
|
||||
{
|
||||
@@ -65,7 +64,7 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
|
||||
l->l_map_end += l->l_addr;
|
||||
l->l_text_end += l->l_addr;
|
||||
l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr);
|
||||
- elf_get_dynamic_info (l, dyn_temp);
|
||||
+ elf_get_dynamic_info (l);
|
||||
_dl_setup_hash (l);
|
||||
l->l_relocated = 1;
|
||||
|
||||
diff --git a/elf/tst-ro-dynamic-mod.c b/elf/tst-ro-dynamic-mod.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..6d99925964c50caf
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-ro-dynamic-mod.c
|
||||
@@ -0,0 +1,19 @@
|
||||
+/* Test case for DSO with readonly dynamic section.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+int foo = -1;
|
||||
diff --git a/elf/tst-ro-dynamic-mod.map b/elf/tst-ro-dynamic-mod.map
|
||||
new file mode 100644
|
||||
index 0000000000000000..2fe4a2998cddd587
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-ro-dynamic-mod.map
|
||||
@@ -0,0 +1,16 @@
|
||||
+SECTIONS
|
||||
+{
|
||||
+ . = SIZEOF_HEADERS;
|
||||
+ .dynamic : { *(.dynamic) } :text :dynamic
|
||||
+ .rodata : { *(.data*) *(.bss*) } :text
|
||||
+ /DISCARD/ : {
|
||||
+ *(.note.gnu.property)
|
||||
+ }
|
||||
+ .note : { *(.note.*) } :text :note
|
||||
+}
|
||||
+PHDRS
|
||||
+{
|
||||
+ text PT_LOAD FLAGS(5) FILEHDR PHDRS;
|
||||
+ dynamic PT_DYNAMIC FLAGS(4);
|
||||
+ note PT_NOTE FLAGS(4);
|
||||
+}
|
||||
diff --git a/elf/tst-ro-dynamic.c b/elf/tst-ro-dynamic.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..3a18f8789ad386bb
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-ro-dynamic.c
|
||||
@@ -0,0 +1,31 @@
|
||||
+/* Test case for DSO with readonly dynamic section.
|
||||
+ Copyright (C) 2021 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 <support/check.h>
|
||||
+#include <support/test-driver.h>
|
||||
+
|
||||
+extern int foo;
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ TEST_COMPARE (foo, -1);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/include/link.h b/include/link.h
|
||||
index 4af16cb59639a077..c46aced9f7b43ba0 100644
|
||||
--- a/include/link.h
|
||||
+++ b/include/link.h
|
||||
@@ -205,6 +205,7 @@ struct link_map
|
||||
unsigned int l_free_initfini:1; /* Nonzero if l_initfini can be
|
||||
freed, ie. not allocated with
|
||||
the dummy malloc in ld.so. */
|
||||
+ unsigned int l_ld_readonly:1; /* Nonzero if dynamic section is readonly. */
|
||||
|
||||
/* NODELETE status of the map. Only valid for maps of type
|
||||
lt_loaded. Lazy binding sets l_nodelete_active directly,
|
||||
@@ -342,6 +343,8 @@ struct link_map
|
||||
unsigned long long int l_serial;
|
||||
};
|
||||
|
||||
+#include <dl-relocate-ld.h>
|
||||
+
|
||||
/* Information used by audit modules. For most link maps, this data
|
||||
immediate follows the link map in memory. For the dynamic linker,
|
||||
it is allocated separately. See link_map_audit_state in
|
||||
diff --git a/sysdeps/generic/dl-relocate-ld.h b/sysdeps/generic/dl-relocate-ld.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..5fae206db9941e97
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/generic/dl-relocate-ld.h
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* Check if dynamic section should be relocated. Generic version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+#ifndef _DL_RELOCATE_LD_H
|
||||
+#define _DL_RELOCATE_LD_H
|
||||
+
|
||||
+/* Return true if dynamic section in the shared library L should be
|
||||
+ relocated. */
|
||||
+
|
||||
+static inline bool
|
||||
+dl_relocate_ld (const struct link_map *l)
|
||||
+{
|
||||
+ /* Don't relocate dynamic section if it is readonly */
|
||||
+ return !l->l_ld_readonly;
|
||||
+}
|
||||
+
|
||||
+#endif /* _DL_RELOCATE_LD_H */
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 1ceb9c3212c148ba..ed10953f34b96c49 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -75,11 +75,8 @@ __BEGIN_DECLS
|
||||
have to be accessed via the D_PTR macro. The macro is needed since for
|
||||
most architectures the entry is already relocated - but for some not
|
||||
and we need to relocate at access time. */
|
||||
-#ifdef DL_RO_DYN_SECTION
|
||||
-# define D_PTR(map, i) ((map)->i->d_un.d_ptr + (map)->l_addr)
|
||||
-#else
|
||||
-# define D_PTR(map, i) (map)->i->d_un.d_ptr
|
||||
-#endif
|
||||
+#define D_PTR(map, i) \
|
||||
+ ((map)->i->d_un.d_ptr + (dl_relocate_ld (map) ? 0 : (map)->l_addr))
|
||||
|
||||
/* Result of the lookup functions and how to retrieve the base address. */
|
||||
typedef struct link_map *lookup_t;
|
||||
diff --git a/sysdeps/mips/dl-relocate-ld.h b/sysdeps/mips/dl-relocate-ld.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..0c18d9a567cad54f
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/mips/dl-relocate-ld.h
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* Check if dynamic section should be relocated. MIPS version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+#ifndef _DL_RELOCATE_LD_H
|
||||
+#define _DL_RELOCATE_LD_H
|
||||
+
|
||||
+/* Return true if dynamic section in the shared library L should be
|
||||
+ relocated. */
|
||||
+
|
||||
+static inline bool
|
||||
+dl_relocate_ld (const struct link_map *l)
|
||||
+{
|
||||
+ /* Never relocate dynamic section. */
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+#endif /* _DL_RELOCATE_LD_H */
|
||||
diff --git a/sysdeps/mips/ldsodefs.h b/sysdeps/mips/ldsodefs.h
|
||||
index 4db7c60e38e42ef2..36fd09a8bdb4cacf 100644
|
||||
--- a/sysdeps/mips/ldsodefs.h
|
||||
+++ b/sysdeps/mips/ldsodefs.h
|
||||
@@ -75,10 +75,6 @@ struct La_mips_64_retval;
|
||||
struct La_mips_64_retval *, \
|
||||
const char *);
|
||||
|
||||
-/* The MIPS ABI specifies that the dynamic section has to be read-only. */
|
||||
-
|
||||
-#define DL_RO_DYN_SECTION 1
|
||||
-
|
||||
#include_next <ldsodefs.h>
|
||||
|
||||
/* The 64-bit MIPS ELF ABI uses an unusual reloc format. Each
|
||||
diff --git a/sysdeps/riscv/dl-relocate-ld.h b/sysdeps/riscv/dl-relocate-ld.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..10327454b17a7097
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/riscv/dl-relocate-ld.h
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* Check if dynamic section should be relocated. RISC-V version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+#ifndef _DL_RELOCATE_LD_H
|
||||
+#define _DL_RELOCATE_LD_H
|
||||
+
|
||||
+/* Return true if dynamic section in the shared library L should be
|
||||
+ relocated. */
|
||||
+
|
||||
+static inline bool
|
||||
+dl_relocate_ld (const struct link_map *l)
|
||||
+{
|
||||
+ /* Never relocate dynamic section for ABI compatibility. */
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+#endif /* _DL_RELOCATE_LD_H */
|
||||
diff --git a/sysdeps/riscv/ldsodefs.h b/sysdeps/riscv/ldsodefs.h
|
||||
index 0c696714a7a93cff..8947ffe4b5026a2e 100644
|
||||
--- a/sysdeps/riscv/ldsodefs.h
|
||||
+++ b/sysdeps/riscv/ldsodefs.h
|
||||
@@ -38,11 +38,6 @@ struct La_riscv_retval;
|
||||
struct La_riscv_retval *, \
|
||||
const char *);
|
||||
|
||||
-/* Although the RISC-V ABI does not specify that the dynamic section has
|
||||
- to be read-only, it needs to be kept for ABI compatibility. */
|
||||
-
|
||||
-#define DL_RO_DYN_SECTION 1
|
||||
-
|
||||
#include_next <ldsodefs.h>
|
||||
|
||||
#endif
|
117
SOURCES/glibc-upstream-2.34-42.patch
Normal file
117
SOURCES/glibc-upstream-2.34-42.patch
Normal file
@ -0,0 +1,117 @@
|
||||
commit 5f36e5c70107ecb59281ef57f9f1c0e37ec3076d
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Thu Sep 23 09:06:49 2021 -0700
|
||||
|
||||
ld.so: Initialize bootstrap_map.l_ld_readonly [BZ #28340]
|
||||
|
||||
1. Define DL_RO_DYN_SECTION to initalize bootstrap_map.l_ld_readonly
|
||||
before calling elf_get_dynamic_info to get dynamic info in bootstrap_map,
|
||||
2. Define a single
|
||||
|
||||
static inline bool
|
||||
dl_relocate_ld (const struct link_map *l)
|
||||
{
|
||||
/* Don't relocate dynamic section if it is readonly */
|
||||
return !(l->l_ld_readonly || DL_RO_DYN_SECTION);
|
||||
}
|
||||
|
||||
This updates BZ #28340 fix.
|
||||
|
||||
(cherry picked from commit 2ec99d8c42b2ff1a1231e4df462a0910a9b7fdef)
|
||||
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index 405166d62b34847c..d83ac1bdc40a6081 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -548,6 +548,7 @@ _dl_start (void *arg)
|
||||
|
||||
/* Read our own dynamic section and fill in the info array. */
|
||||
bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
|
||||
+ bootstrap_map.l_ld_readonly = DL_RO_DYN_SECTION;
|
||||
elf_get_dynamic_info (&bootstrap_map);
|
||||
|
||||
#if NO_TLS_OFFSET != 0
|
||||
diff --git a/sysdeps/generic/dl-relocate-ld.h b/sysdeps/generic/dl-relocate-ld.h
|
||||
index 5fae206db9941e97..cfb86c2d6a2394c1 100644
|
||||
--- a/sysdeps/generic/dl-relocate-ld.h
|
||||
+++ b/sysdeps/generic/dl-relocate-ld.h
|
||||
@@ -19,14 +19,7 @@
|
||||
#ifndef _DL_RELOCATE_LD_H
|
||||
#define _DL_RELOCATE_LD_H
|
||||
|
||||
-/* Return true if dynamic section in the shared library L should be
|
||||
- relocated. */
|
||||
-
|
||||
-static inline bool
|
||||
-dl_relocate_ld (const struct link_map *l)
|
||||
-{
|
||||
- /* Don't relocate dynamic section if it is readonly */
|
||||
- return !l->l_ld_readonly;
|
||||
-}
|
||||
+/* The dynamic section is writable. */
|
||||
+#define DL_RO_DYN_SECTION 0
|
||||
|
||||
#endif /* _DL_RELOCATE_LD_H */
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index ed10953f34b96c49..fcbbf6974827cdf1 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -69,6 +69,16 @@ __BEGIN_DECLS
|
||||
`ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'. */
|
||||
#define ELFW(type) _ElfW (ELF, __ELF_NATIVE_CLASS, type)
|
||||
|
||||
+/* Return true if dynamic section in the shared library L should be
|
||||
+ relocated. */
|
||||
+
|
||||
+static inline bool
|
||||
+dl_relocate_ld (const struct link_map *l)
|
||||
+{
|
||||
+ /* Don't relocate dynamic section if it is readonly */
|
||||
+ return !(l->l_ld_readonly || DL_RO_DYN_SECTION);
|
||||
+}
|
||||
+
|
||||
/* All references to the value of l_info[DT_PLTGOT],
|
||||
l_info[DT_STRTAB], l_info[DT_SYMTAB], l_info[DT_RELA],
|
||||
l_info[DT_REL], l_info[DT_JMPREL], and l_info[VERSYMIDX (DT_VERSYM)]
|
||||
diff --git a/sysdeps/mips/dl-relocate-ld.h b/sysdeps/mips/dl-relocate-ld.h
|
||||
index 0c18d9a567cad54f..376ad75dd1695fe3 100644
|
||||
--- a/sysdeps/mips/dl-relocate-ld.h
|
||||
+++ b/sysdeps/mips/dl-relocate-ld.h
|
||||
@@ -19,14 +19,7 @@
|
||||
#ifndef _DL_RELOCATE_LD_H
|
||||
#define _DL_RELOCATE_LD_H
|
||||
|
||||
-/* Return true if dynamic section in the shared library L should be
|
||||
- relocated. */
|
||||
-
|
||||
-static inline bool
|
||||
-dl_relocate_ld (const struct link_map *l)
|
||||
-{
|
||||
- /* Never relocate dynamic section. */
|
||||
- return false;
|
||||
-}
|
||||
+/* The dynamic section is readonly. */
|
||||
+#define DL_RO_DYN_SECTION 1
|
||||
|
||||
#endif /* _DL_RELOCATE_LD_H */
|
||||
diff --git a/sysdeps/riscv/dl-relocate-ld.h b/sysdeps/riscv/dl-relocate-ld.h
|
||||
index 10327454b17a7097..2ab2b8ac6c09af82 100644
|
||||
--- a/sysdeps/riscv/dl-relocate-ld.h
|
||||
+++ b/sysdeps/riscv/dl-relocate-ld.h
|
||||
@@ -19,14 +19,7 @@
|
||||
#ifndef _DL_RELOCATE_LD_H
|
||||
#define _DL_RELOCATE_LD_H
|
||||
|
||||
-/* Return true if dynamic section in the shared library L should be
|
||||
- relocated. */
|
||||
-
|
||||
-static inline bool
|
||||
-dl_relocate_ld (const struct link_map *l)
|
||||
-{
|
||||
- /* Never relocate dynamic section for ABI compatibility. */
|
||||
- return false;
|
||||
-}
|
||||
+/* The dynamic section is readonly for ABI compatibility. */
|
||||
+#define DL_RO_DYN_SECTION 1
|
||||
|
||||
#endif /* _DL_RELOCATE_LD_H */
|
30
SOURCES/glibc-upstream-2.34-43.patch
Normal file
30
SOURCES/glibc-upstream-2.34-43.patch
Normal file
@ -0,0 +1,30 @@
|
||||
commit 6548a9bdba95b3e1fcdbd85445342467e4b0cd4f
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Fri Sep 24 08:56:42 2021 -0700
|
||||
|
||||
Avoid warning: overriding recipe for .../tst-ro-dynamic-mod.so
|
||||
|
||||
Add tst-ro-dynamic-mod to modules-names-nobuild to avoid
|
||||
|
||||
../Makerules:767: warning: ignoring old recipe for target '.../elf/tst-ro-dynamic-mod.so'
|
||||
|
||||
This updates BZ #28340 fix.
|
||||
|
||||
(cherry picked from commit 15e6d6785ac2935bb963506b47a37b3d1f728952)
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index de854b4d1a815bd3..118d579c42c38110 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -399,8 +399,9 @@ endif
|
||||
modules-execstack-yes = tst-execstack-mod
|
||||
extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
|
||||
|
||||
-# filtmod1.so, tst-big-note-lib.so have special rules.
|
||||
-modules-names-nobuild := filtmod1 tst-big-note-lib
|
||||
+# filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special
|
||||
+# rules.
|
||||
+modules-names-nobuild := filtmod1 tst-big-note-lib tst-ro-dynamic-mod
|
||||
|
||||
tests += $(tests-static)
|
||||
|
@ -151,7 +151,7 @@ end \
|
||||
Summary: The GNU libc libraries
|
||||
Name: glibc
|
||||
Version: %{glibcversion}
|
||||
Release: 7%{?dist}
|
||||
Release: 8%{?dist}
|
||||
|
||||
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
||||
# libraries.
|
||||
@ -264,6 +264,16 @@ Patch61: glibc-upstream-2.34-30.patch
|
||||
Patch62: glibc-upstream-2.34-31.patch
|
||||
Patch63: glibc-upstream-2.34-32.patch
|
||||
Patch64: glibc-upstream-2.34-33.patch
|
||||
Patch65: glibc-upstream-2.34-34.patch
|
||||
Patch66: glibc-upstream-2.34-35.patch
|
||||
Patch67: glibc-upstream-2.34-36.patch
|
||||
Patch68: glibc-upstream-2.34-37.patch
|
||||
Patch69: glibc-upstream-2.34-38.patch
|
||||
Patch70: glibc-upstream-2.34-39.patch
|
||||
Patch71: glibc-upstream-2.34-40.patch
|
||||
Patch72: glibc-upstream-2.34-41.patch
|
||||
Patch73: glibc-upstream-2.34-42.patch
|
||||
Patch74: glibc-upstream-2.34-43.patch
|
||||
|
||||
##############################################################################
|
||||
# Continued list of core "glibc" package information:
|
||||
@ -2295,6 +2305,20 @@ fi
|
||||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||
|
||||
%changelog
|
||||
* Wed Nov 3 2021 Florian Weimer <fweimer@redhat.com> - 2.34-8
|
||||
- Sync with upstream branch release/2.34/master,
|
||||
commit 6548a9bdba95b3e1fcdbd85445342467e4b0cd4f:
|
||||
- Avoid warning: overriding recipe for .../tst-ro-dynamic-mod.so
|
||||
- ld.so: Initialize bootstrap_map.l_ld_readonly [BZ #28340]
|
||||
- ld.so: Replace DL_RO_DYN_SECTION with dl_relocate_ld [BZ #28340]
|
||||
- Handle NULL input to malloc_usable_size [BZ #28506]
|
||||
- elf: Avoid deadlock between pthread_create and ctors [BZ #28357]
|
||||
- timex: Use 64-bit fields on 32-bit TIMESIZE=64 systems (BZ #28469)
|
||||
- y2038: Use a common definition for stat for sparc32
|
||||
- elf: Replace nsid with args.nsid [BZ #27609]
|
||||
- S390: Add PCI_MIO and SIE HWCAPs
|
||||
- support: Also return fd when it is 0
|
||||
|
||||
* Fri Oct 1 2021 Florian Weimer <fweimer@redhat.com> - 2.34-7
|
||||
- Drop glibc-rh1992702-*.patch, applied upstream. (#1992702)
|
||||
- Sync with upstream branch release/2.34/master,
|
||||
|
Loading…
Reference in New Issue
Block a user