Reland "[MTE] remap stacks with PROT_MTE when requested by dlopened library"
This reverts commit c20e1c2bdfc00b3fb7931da5e88ceac3fa4df4b2.
Reason for revert: Was not the root-cause of test failure.
Change-Id: I7dcd9fc3cbac47703fa8ecd5aafd7e1c3ed87301
diff --git a/libc/bionic/libc_init_dynamic.cpp b/libc/bionic/libc_init_dynamic.cpp
index c61810e..295484b 100644
--- a/libc/bionic/libc_init_dynamic.cpp
+++ b/libc/bionic/libc_init_dynamic.cpp
@@ -39,11 +39,12 @@
* all dynamic linking has been performed.
*/
+#include <elf.h>
#include <stddef.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdint.h>
-#include <elf.h>
+#include "bionic/pthread_internal.h"
#include "libc_init_common.h"
#include "private/bionic_defs.h"
@@ -59,6 +60,10 @@
extern int __cxa_atexit(void (*)(void *), void *, void *);
};
+void memtag_stack_dlopen_callback() {
+ __pthread_internal_remap_stack_with_mte();
+}
+
// Use an initializer so __libc_sysinfo will have a fallback implementation
// while .preinit_array constructors run.
#if defined(__i386__)
@@ -156,6 +161,10 @@
__libc_init_mte_late();
+ // This roundabout way is needed so we don't use the static libc linked into the linker, which
+ // will not affect the process.
+ __libc_shared_globals()->memtag_stack_dlopen_callback = memtag_stack_dlopen_callback;
+
exit(slingshot(args.argc - __libc_shared_globals()->initial_linker_arg_count,
args.argv + __libc_shared_globals()->initial_linker_arg_count,
args.envp));