glibc/glibc-RHEL-65280-7.patch
Arjun Shankar 283b9330df nptl: Keep __rseq_size consistent (RHEL-65280)
Resolves: RHEL-65280
2025-03-07 16:32:29 +01:00

139 lines
5.2 KiB
Diff

This reverts glibc-RHEL-65280-6.patch.
diff --git a/sysdeps/nptl/dl-tls_init_tp.c b/sysdeps/nptl/dl-tls_init_tp.c
index 20552b11843148fb..2f56281a02246a09 100644
--- a/sysdeps/nptl/dl-tls_init_tp.c
+++ b/sysdeps/nptl/dl-tls_init_tp.c
@@ -46,8 +46,6 @@ rtld_mutex_dummy (pthread_mutex_t *lock)
const unsigned int __rseq_flags;
-size_t _rseq_align attribute_hidden;
-
void
__tls_pre_init_tp (void)
{
@@ -101,17 +99,12 @@ __tls_init_tp (void)
}
{
- /* If the registration fails or is disabled by tunable, the public
- '__rseq_size' will be set to '0' regardless of the feature size of the
- allocated rseq area. An rseq area of at least 32 bytes is always
- allocated since application code is allowed to check the status of the
- rseq registration by reading the content of the 'cpu_id' field. */
bool do_rseq = true;
#if HAVE_TUNABLES
do_rseq = TUNABLE_GET (rseq, int, NULL);
#endif
- if (!rseq_register_current_thread (pd, do_rseq))
- _rseq_size = 0;
+ if (rseq_register_current_thread (pd, do_rseq))
+ _rseq_size = RSEQ_AREA_SIZE_INITIAL_USED;
#ifdef RSEQ_SIG
/* This should be a compile-time constant, but the current
diff --git a/sysdeps/unix/sysv/linux/dl-parse_auxv.h b/sysdeps/unix/sysv/linux/dl-parse_auxv.h
index 44c135c56570134e..bf9374371eb217fc 100644
--- a/sysdeps/unix/sysv/linux/dl-parse_auxv.h
+++ b/sysdeps/unix/sysv/linux/dl-parse_auxv.h
@@ -21,7 +21,6 @@
#include <fpu_control.h>
#include <ldsodefs.h>
#include <link.h>
-#include <rseq-internal.h>
typedef ElfW(Addr) dl_parse_auxv_t[AT_MINSIGSTKSZ + 1];
@@ -58,17 +57,5 @@ void _dl_parse_auxv (ElfW(auxv_t) *av, dl_parse_auxv_t auxv_values)
GLRO(dl_sysinfo) = auxv_values[AT_SYSINFO];
#endif
- /* Get the rseq feature size, with a minimum of RSEQ_AREA_SIZE_INITIAL_USED
- (20) for kernels that don't have AT_RSEQ_FEATURE_SIZE. Limit the feature
- size to RSEQ_AREA_SIZE_MAX_USED (28) which fits the rseq area in 'struct
- pthread' and represents the maximum feature size of currently released
- kernels. Since no kernels currently cross the 32 bytes of the original
- ABI, the semantics of a feature size of 32 or more are still undetermined.
- */
- _rseq_size = MIN (MAX (auxv_values[AT_RSEQ_FEATURE_SIZE],
- RSEQ_AREA_SIZE_INITIAL_USED),
- RSEQ_AREA_SIZE_MAX_USED);
- _rseq_align = MAX (auxv_values[AT_RSEQ_ALIGN], RSEQ_MIN_ALIGN);
-
DL_PLATFORM_AUXV
}
diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h
index f4027b09519a652b..c108a12a6227eeac 100644
--- a/sysdeps/unix/sysv/linux/rseq-internal.h
+++ b/sysdeps/unix/sysv/linux/rseq-internal.h
@@ -25,31 +25,13 @@
#include <stdio.h>
#include <sys/rseq.h>
-/* Minimum size of the rseq area allocation required by the syscall. The
- actually used rseq feature size may be less (20 bytes initially). */
+/* 32 is the initially required value for the area size. The
+ actually used rseq size may be less (20 bytes initially). */
#define RSEQ_AREA_SIZE_INITIAL 32
-
-/* Minimum used feature size of the rseq area. */
#define RSEQ_AREA_SIZE_INITIAL_USED 20
-/* Maximum currently used feature size of the rseq area. */
-#define RSEQ_AREA_SIZE_MAX_USED 28
-
-/* Minimum alignment of the rseq area. */
-#define RSEQ_MIN_ALIGN 32
-
-/* Alignment requirement of the rseq area.
- Populated from the auxiliary vector with a minimum of '32'.
- In .data.relro but not yet write-protected. */
-extern size_t _rseq_align attribute_hidden;
-
-/* Size of the active features in the rseq area.
- Populated from the auxiliary vector with a minimum of '20'.
- In .data.relro but not yet write-protected. */
+/* The variables are in .data.relro but are not yet write-protected. */
extern unsigned int _rseq_size attribute_hidden;
-
-/* Offset from the thread pointer to the rseq area.
- In .data.relro but not yet write-protected. */
extern ptrdiff_t _rseq_offset attribute_hidden;
#ifdef RSEQ_SIG
diff --git a/sysdeps/unix/sysv/linux/tst-rseq.c b/sysdeps/unix/sysv/linux/tst-rseq.c
index 5946db73d9b079c3..1d404db610c08fdf 100644
--- a/sysdeps/unix/sysv/linux/tst-rseq.c
+++ b/sysdeps/unix/sysv/linux/tst-rseq.c
@@ -38,15 +38,13 @@ static void
do_rseq_main_test (void)
{
struct pthread *pd = THREAD_SELF;
- size_t rseq_feature_size = MIN (MAX (getauxval (AT_RSEQ_FEATURE_SIZE),
- RSEQ_AREA_SIZE_INITIAL_USED),
- RSEQ_AREA_SIZE_MAX_USED);
TEST_VERIFY_EXIT (rseq_thread_registered ());
TEST_COMPARE (__rseq_flags, 0);
TEST_VERIFY ((char *) __thread_pointer () + __rseq_offset
== (char *) &pd->rseq_area);
- TEST_COMPARE (__rseq_size, rseq_feature_size);
+ /* The current implementation only supports the initial size. */
+ TEST_COMPARE (__rseq_size, 20);
}
static void
diff --git a/sysdeps/unix/sysv/linux/tst-rseq.h b/sysdeps/unix/sysv/linux/tst-rseq.h
index 86cf50fbeff32384..a476c316fc2671a0 100644
--- a/sysdeps/unix/sysv/linux/tst-rseq.h
+++ b/sysdeps/unix/sysv/linux/tst-rseq.h
@@ -23,7 +23,6 @@
#include <syscall.h>
#include <sys/rseq.h>
#include <tls.h>
-#include <rseq-internal.h>
static inline bool
rseq_thread_registered (void)