mirror of
git://sourceware.org/git/glibc.git
synced 2025-02-23 13:09:58 +08:00
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>
This commit is contained in:
parent
41f6684557
commit
689a62a421
@ -23,6 +23,7 @@
|
|||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
#include <rseq-internal.h>
|
#include <rseq-internal.h>
|
||||||
#include <thread_pointer.h>
|
#include <thread_pointer.h>
|
||||||
|
#include <dl-symbol-redir-ifunc.h>
|
||||||
|
|
||||||
#define TUNABLE_NAMESPACE pthread
|
#define TUNABLE_NAMESPACE pthread
|
||||||
#include <dl-tunables.h>
|
#include <dl-tunables.h>
|
||||||
|
@ -108,13 +108,12 @@ rseq_register_current_thread (struct pthread *self, bool do_rseq)
|
|||||||
if (size < RSEQ_AREA_SIZE_INITIAL)
|
if (size < RSEQ_AREA_SIZE_INITIAL)
|
||||||
size = RSEQ_AREA_SIZE_INITIAL;
|
size = RSEQ_AREA_SIZE_INITIAL;
|
||||||
|
|
||||||
/* Initialize the rseq fields that are read by the kernel on
|
/* Initialize the whole rseq area to zero prior to registration. */
|
||||||
registration, there is no guarantee that struct pthread is
|
memset (RSEQ_SELF (), 0, size);
|
||||||
cleared on all architectures. */
|
|
||||||
|
/* Set the cpu_id field to RSEQ_CPU_ID_UNINITIALIZED, this is checked by
|
||||||
|
the kernel at registration when CONFIG_DEBUG_RSEQ is enabled. */
|
||||||
RSEQ_SETMEM (cpu_id, RSEQ_CPU_ID_UNINITIALIZED);
|
RSEQ_SETMEM (cpu_id, RSEQ_CPU_ID_UNINITIALIZED);
|
||||||
RSEQ_SETMEM (cpu_id_start, 0);
|
|
||||||
RSEQ_SETMEM (rseq_cs, 0);
|
|
||||||
RSEQ_SETMEM (flags, 0);
|
|
||||||
|
|
||||||
int ret = INTERNAL_SYSCALL_CALL (rseq, RSEQ_SELF (), size, 0, RSEQ_SIG);
|
int ret = INTERNAL_SYSCALL_CALL (rseq, RSEQ_SELF (), size, 0, RSEQ_SIG);
|
||||||
if (!INTERNAL_SYSCALL_ERROR_P (ret))
|
if (!INTERNAL_SYSCALL_ERROR_P (ret))
|
||||||
|
Loading…
Reference in New Issue
Block a user