[HWASan] [MTE] disable MTE for HWASan binaries
Bug: 389848256
Test: atest hwasan_test with persist.arm64.memtag.default=sync
Test: atest bionic-unit-tests[-static]
Change-Id: I871932af1ed763e3b7d5f580052a009d5aa02e7d
diff --git a/libc/bionic/libc_init_mte.cpp b/libc/bionic/libc_init_mte.cpp
index eda2eec..d23b056 100644
--- a/libc/bionic/libc_init_mte.cpp
+++ b/libc/bionic/libc_init_mte.cpp
@@ -246,6 +246,7 @@
__attribute__((no_sanitize("hwaddress", "memtag"))) void __libc_init_mte(
const memtag_dynamic_entries_t* memtag_dynamic_entries, const void* phdr_start, size_t phdr_ct,
uintptr_t load_bias) {
+ if (__libc_shared_globals()->is_hwasan) return;
bool memtag_stack = false;
HeapTaggingLevel level =
__get_tagging_level(memtag_dynamic_entries, phdr_start, phdr_ct, load_bias, &memtag_stack);
diff --git a/libc/bionic/libc_init_static.cpp b/libc/bionic/libc_init_static.cpp
index 85e742c..0c962ff 100644
--- a/libc/bionic/libc_init_static.cpp
+++ b/libc/bionic/libc_init_static.cpp
@@ -167,7 +167,7 @@
}
__attribute__((no_sanitize("memtag"))) __noreturn static void __real_libc_init(
- KernelArgumentBlock& args, void* raw_args, void (*onexit)(void) __unused,
+ KernelArgumentBlock& args, void* raw_args __unused, void (*onexit)(void) __unused,
int (*slingshot)(int, char**, char**), structors_array_t const* const structors,
bionic_tcb* temp_tcb) {
BIONIC_STOP_UNWIND;
@@ -180,10 +180,12 @@
layout_static_tls(args);
__libc_init_main_thread_final();
__libc_init_common();
+#if !__has_feature(hwaddress_sanitizer)
__libc_init_mte(/*memtag_dynamic_entries=*/nullptr,
reinterpret_cast<ElfW(Phdr)*>(getauxval(AT_PHDR)), getauxval(AT_PHNUM),
/*load_bias = */ 0);
__libc_init_mte_stack(/*stack_top = */ raw_args);
+#endif
__libc_init_scudo();
__libc_globals.mutate(__libc_init_malloc);
__libc_init_profiling_handlers();
@@ -205,8 +207,9 @@
if (structors->fini_array_count > 0) {
__cxa_atexit(call_fini_array, const_cast<structors_array_t*>(structors), nullptr);
}
-
+#if !__has_feature(hwaddress_sanitizer)
__libc_init_mte_late();
+#endif
exit(slingshot(args.argc, args.argv, args.envp));
}
diff --git a/libc/private/bionic_globals.h b/libc/private/bionic_globals.h
index 77ac21f..2346a4d 100644
--- a/libc/private/bionic_globals.h
+++ b/libc/private/bionic_globals.h
@@ -152,6 +152,8 @@
bool initial_memtag_stack_abi = false;
int64_t heap_tagging_upgrade_timer_sec = 0;
+ bool is_hwasan = false;
+
void (*memtag_stack_dlopen_callback)() = nullptr;
pthread_mutex_t crash_detail_page_lock = PTHREAD_MUTEX_INITIALIZER;
crash_detail_page_t* crash_detail_page = nullptr;
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 2393f13..742f639 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -3614,14 +3614,7 @@
return kLdConfigFilePath;
}
-
-std::vector<android_namespace_t*> init_default_namespaces(const char* executable_path) {
- g_default_namespace.set_name("(default)");
-
- soinfo* somain = solist_get_somain();
-
- const char *interp = phdr_table_get_interpreter_name(somain->phdr, somain->phnum,
- somain->load_bias);
+void init_sanitizer_mode(const char *interp ) {
const char* bname = (interp != nullptr) ? basename(interp) : nullptr;
g_is_asan = bname != nullptr &&
@@ -3637,7 +3630,13 @@
g_is_hwasan = (bname != nullptr &&
strcmp(bname, "linker_hwasan64") == 0) ||
(hwasan_env != nullptr && !getauxval(AT_SECURE) && strcmp(hwasan_env, "1") == 0);
+ __libc_shared_globals()->is_hwasan = g_is_hwasan;
#endif
+}
+
+std::vector<android_namespace_t*> init_default_namespaces(const char* executable_path) {
+ g_default_namespace.set_name("(default)");
+
const Config* config = nullptr;
{
diff --git a/linker/linker_main.cpp b/linker/linker_main.cpp
index 40f6b9a..425bcda 100644
--- a/linker/linker_main.cpp
+++ b/linker/linker_main.cpp
@@ -366,6 +366,7 @@
}
solinker->set_realpath(interp);
init_link_map_head(*solinker);
+ init_sanitizer_mode(interp);
#if defined(__aarch64__)
__libc_init_mte(somain->memtag_dynamic_entries(), somain->phdr, somain->phnum, somain->load_bias);
diff --git a/linker/linker_main.h b/linker/linker_main.h
index ffbcf0f..bec9d35 100644
--- a/linker/linker_main.h
+++ b/linker/linker_main.h
@@ -48,6 +48,7 @@
class ElfReader;
+void init_sanitizer_mode(const char *interp);
std::vector<android_namespace_t*> init_default_namespaces(const char* executable_path);
soinfo* soinfo_alloc(android_namespace_t* ns, const char* name,
const struct stat* file_stat, off64_t file_offset,
diff --git a/tests/memtag_stack_test.cpp b/tests/memtag_stack_test.cpp
index 9d02830..98e340a 100644
--- a/tests/memtag_stack_test.cpp
+++ b/tests/memtag_stack_test.cpp
@@ -19,6 +19,7 @@
#include <gtest/gtest.h>
#if defined(__BIONIC__)
+#include <android-base/test_utils.h>
#include "gtest_globals.h"
#include "platform/bionic/mte.h"
#include "utils.h"
@@ -32,6 +33,9 @@
GTEST_SKIP() << "MTE unsupported";
}
bool is_static = std::get<1>(GetParam());
+ if (running_with_hwasan() && !is_static) {
+ GTEST_SKIP() << "Can't run with HWASanified libc.so";
+ }
std::string helper =
GetTestLibRoot() + (is_static ? "/stack_tagging_static_helper" : "/stack_tagging_helper");
const char* arg = std::get<0>(GetParam());