Revert "Fix dlext tests for MTE globals"
Revert submission 3236258
Reason for revert: b/374452952
Reverted changes: /q/submissionid:3236258
(cherry picked from https://android-review.googlesource.com/q/commit:33941dc3053bbd90bf419055b3181c4e12c80f5c)
Merged-In: I3cd7b514fa314e6f2662eb07448bcd834d03687a
Change-Id: I3cd7b514fa314e6f2662eb07448bcd834d03687a
Staged CLs so I don't have to wait for merges before I CP
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index 8b26cb0..570da2a 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -21,7 +21,6 @@
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
-#include <link.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -41,13 +40,11 @@
#include <procinfo/process_map.h>
#include <ziparchive/zip_archive.h>
-#include "bionic/mte.h"
-#include "bionic/page.h"
#include "core_shared_libs.h"
-#include "dlext_private.h"
-#include "dlfcn_symlink_support.h"
#include "gtest_globals.h"
#include "utils.h"
+#include "dlext_private.h"
+#include "dlfcn_symlink_support.h"
#define ASSERT_DL_NOTNULL(ptr) \
ASSERT_TRUE((ptr) != nullptr) << "dlerror: " << dlerror()
@@ -1961,14 +1958,6 @@
dlclose(ns_a_handle3);
}
-static inline int MapPflagsToProtFlags(uint32_t flags) {
- int prot_flags = 0;
- if (PF_X & flags) prot_flags |= PROT_EXEC;
- if (PF_W & flags) prot_flags |= PROT_WRITE;
- if (PF_R & flags) prot_flags |= PROT_READ;
- return prot_flags;
-}
-
TEST(dlext, ns_anonymous) {
static const char* root_lib = "libnstest_root.so";
std::string shared_libs = g_core_shared_libs + ":" + g_public_lib;
@@ -2010,45 +1999,30 @@
typedef const char* (*fn_t)();
fn_t ns_get_dlopened_string_private = reinterpret_cast<fn_t>(ns_get_dlopened_string_addr);
- Dl_info private_library_info;
- ASSERT_NE(dladdr(reinterpret_cast<void*>(ns_get_dlopened_string_addr), &private_library_info), 0)
- << dlerror();
- std::vector<map_record> maps_to_copy;
- bool has_executable_segment = false;
+ std::vector<map_record> maps;
+ Maps::parse_maps(&maps);
+
uintptr_t addr_start = 0;
uintptr_t addr_end = 0;
- std::tuple dl_iterate_arg = {&private_library_info, &maps_to_copy, &has_executable_segment,
- &addr_start, &addr_end};
- ASSERT_EQ(
- 1, dl_iterate_phdr(
- [](dl_phdr_info* info, size_t /*size*/, void* data) -> int {
- auto [private_library_info, maps_to_copy, has_executable_segment, addr_start,
- addr_end] = *reinterpret_cast<decltype(dl_iterate_arg)*>(data);
- if (info->dlpi_addr != reinterpret_cast<ElfW(Addr)>(private_library_info->dli_fbase))
- return 0;
+ bool has_executable_segment = false;
+ std::vector<map_record> maps_to_copy;
- for (size_t i = 0; i < info->dlpi_phnum; ++i) {
- const ElfW(Phdr)* phdr = info->dlpi_phdr + i;
- if (phdr->p_type != PT_LOAD) continue;
- *has_executable_segment |= phdr->p_flags & PF_X;
- uintptr_t mapping_start = page_start(info->dlpi_addr + phdr->p_vaddr);
- uintptr_t mapping_end = page_end(info->dlpi_addr + phdr->p_vaddr + phdr->p_memsz);
- if (*addr_start == 0 || mapping_start < *addr_start) *addr_start = mapping_start;
- if (*addr_end == 0 || mapping_end > *addr_end) *addr_end = mapping_end;
- maps_to_copy->push_back({
- .addr_start = mapping_start,
- .addr_end = mapping_end,
- .perms = MapPflagsToProtFlags(phdr->p_flags),
- });
- }
- return 1;
- },
- &dl_iterate_arg));
+ for (const auto& rec : maps) {
+ if (rec.pathname == private_library_absolute_path) {
+ if (addr_start == 0) {
+ addr_start = rec.addr_start;
+ }
+ addr_end = rec.addr_end;
+ has_executable_segment = has_executable_segment || (rec.perms & PROT_EXEC) != 0;
+
+ maps_to_copy.push_back(rec);
+ }
+ }
// Some validity checks.
- ASSERT_NE(maps_to_copy.size(), 0u);
ASSERT_TRUE(addr_start > 0);
ASSERT_TRUE(addr_end > 0);
+ ASSERT_TRUE(maps_to_copy.size() > 0);
ASSERT_TRUE(ns_get_dlopened_string_addr > addr_start);
ASSERT_TRUE(ns_get_dlopened_string_addr < addr_end);
@@ -2078,26 +2052,19 @@
ASSERT_EQ(ret, 0) << "Failed to stat library";
size_t file_size = file_stat.st_size;
- {
- // Disable MTE while copying the PROT_MTE-protected global variables from
- // the existing mappings. We don't really care about turning on PROT_MTE for
- // the new copy of the mappings, as this isn't the behaviour under test and
- // tags will be ignored. This only applies for MTE-enabled devices.
- ScopedDisableMTE disable_mte_for_copying_global_variables;
- for (const auto& rec : maps_to_copy) {
- uintptr_t offset = rec.addr_start - addr_start;
- size_t size = rec.addr_end - rec.addr_start;
- void* addr = reinterpret_cast<void*>(reserved_addr + offset);
- void* map =
- mmap(addr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0);
- ASSERT_TRUE(map != MAP_FAILED);
- // Attempting the below memcpy from a portion of the map that is off the end of
- // the backing file will cause the kernel to throw a SIGBUS
- size_t _size =
- ::android::procinfo::MappedFileSize(rec.addr_start, rec.addr_end, rec.offset, file_size);
- memcpy(map, reinterpret_cast<void*>(rec.addr_start), _size);
- mprotect(map, size, rec.perms);
- }
+ for (const auto& rec : maps_to_copy) {
+ uintptr_t offset = rec.addr_start - addr_start;
+ size_t size = rec.addr_end - rec.addr_start;
+ void* addr = reinterpret_cast<void*>(reserved_addr + offset);
+ void* map = mmap(addr, size, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0);
+ ASSERT_TRUE(map != MAP_FAILED);
+ // Attempting the below memcpy from a portion of the map that is off the end of
+ // the backing file will cause the kernel to throw a SIGBUS
+ size_t _size = ::android::procinfo::MappedFileSize(rec.addr_start, rec.addr_end,
+ rec.offset, file_size);
+ memcpy(map, reinterpret_cast<void*>(rec.addr_start), _size);
+ mprotect(map, size, rec.perms);
}
// call the function copy