aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Jeanson <mjeanson@efficios.com>2025-02-14 13:54:22 -0500
committerMichael Jeanson <mjeanson@efficios.com>2025-03-12 19:34:12 +0000
commite1fe22368e4fbc13ce300d89802b7fcc0d5cfb38 (patch)
treee2b9de775de00e89895cd28dad2c9e2082032aca
parentdd8c0c3bbd4e22e00a7275c75dc0d40f24bb0d68 (diff)
downloadglibc-e1fe22368e4fbc13ce300d89802b7fcc0d5cfb38.tar.xz
glibc-e1fe22368e4fbc13ce300d89802b7fcc0d5cfb38.zip
nptl: clear the whole rseq area before registration
Due to the extensible nature of the rseq area we can't explictly initialize fields that are not part of the ABI yet. It was agreed with upstream that all new fields will be documented as zero initialized by userspace. Future kernels configured with CONFIG_DEBUG_RSEQ will validate the content of all fields during registration. Replace the explicit field initialization with a memset of the whole rseq area which will cover fields as they are added to future kernels. Signed-off-by: Michael Jeanson <mjeanson@efficios.com> Reviewed-by: Florian Weimer <fweimer@redhat.com> (cherry picked from commit 689a62a4217fae78b9ce0db781dc2a421f2b1ab4)
-rw-r--r--sysdeps/nptl/dl-tls_init_tp.c1
-rw-r--r--sysdeps/unix/sysv/linux/rseq-internal.h11
2 files changed, 6 insertions, 6 deletions
diff --git a/sysdeps/nptl/dl-tls_init_tp.c b/sysdeps/nptl/dl-tls_init_tp.c
index 7803e19fd1..ed10185e37 100644
--- a/sysdeps/nptl/dl-tls_init_tp.c
+++ b/sysdeps/nptl/dl-tls_init_tp.c
@@ -23,6 +23,7 @@
#include <tls.h>
#include <rseq-internal.h>
#include <thread_pointer.h>
+#include <dl-symbol-redir-ifunc.h>
#define TUNABLE_NAMESPACE pthread
#include <dl-tunables.h>
diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h
index ef3eab1fef..76de2b7ff0 100644
--- a/sysdeps/unix/sysv/linux/rseq-internal.h
+++ b/sysdeps/unix/sysv/linux/rseq-internal.h
@@ -52,13 +52,12 @@ rseq_register_current_thread (struct pthread *self, bool do_rseq)
but still expected size 32. */
size = RSEQ_AREA_SIZE_INITIAL;
- /* Initialize the rseq fields that are read by the kernel on
- registration, there is no guarantee that struct pthread is
- cleared on all architectures. */
+ /* Initialize the whole rseq area to zero prior to registration. */
+ memset (&self->rseq_area, 0, size);
+
+ /* Set the cpu_id field to RSEQ_CPU_ID_UNINITIALIZED, this is checked by
+ the kernel at registration when CONFIG_DEBUG_RSEQ is enabled. */
THREAD_SETMEM (self, rseq_area.cpu_id, RSEQ_CPU_ID_UNINITIALIZED);
- THREAD_SETMEM (self, rseq_area.cpu_id_start, 0);
- THREAD_SETMEM (self, rseq_area.rseq_cs, 0);
- THREAD_SETMEM (self, rseq_area.flags, 0);
int ret = INTERNAL_SYSCALL_CALL (rseq, &self->rseq_area,
size, 0, RSEQ_SIG);