From 1e0969997a7f992f79e975f391a4810ff10e63d7 Mon Sep 17 00:00:00 2001 From: Mitch Phillips Date: Tue, 22 Mar 2022 15:59:31 -0700 Subject: [PATCH] [GWP-ASan] Enable debuggerd to pull more allocation metadata. With the addition of runtime-configurable GWP-ASan, there might be many, many more than 1,000 allocations. Have support for them, but keep a hopefully-won't-crash-the-device limit. Bug: 219651032 Test: atest bionic-unit-tests Change-Id: I7b8e2bf5ab7c723ab6c61365f0dc610e400dbbce --- debuggerd/debuggerd_test.cpp | 10 ++++++++-- debuggerd/libdebuggerd/gwp_asan.cpp | 7 +++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/debuggerd/debuggerd_test.cpp b/debuggerd/debuggerd_test.cpp index a5e2413d5..a52bf2159 100644 --- a/debuggerd/debuggerd_test.cpp +++ b/debuggerd/debuggerd_test.cpp @@ -113,8 +113,14 @@ constexpr char kWaitForDebuggerKey[] = "debug.debuggerd.wait_for_debugger"; // Enable GWP-ASan at the start of this process. GWP-ASan is enabled using // process sampling, so we need to ensure we force GWP-ASan on. __attribute__((constructor)) static void enable_gwp_asan() { - bool force = true; - android_mallopt(M_INITIALIZE_GWP_ASAN, &force, sizeof(force)); + android_mallopt_gwp_asan_options_t opts; + // No, we're not an app, but let's turn ourselves on without sampling. + // Technically, if someone's using the *.default_app sysprops, they'll adjust + // our settings, but I don't think this will be common on a device that's + // running debuggerd_tests. + opts.desire = android_mallopt_gwp_asan_options_t::Action::TURN_ON_FOR_APP; + opts.program_name = ""; + android_mallopt(M_INITIALIZE_GWP_ASAN, &opts, sizeof(android_mallopt_gwp_asan_options_t)); } static void tombstoned_intercept(pid_t target_pid, unique_fd* intercept_fd, unique_fd* output_fd, diff --git a/debuggerd/libdebuggerd/gwp_asan.cpp b/debuggerd/libdebuggerd/gwp_asan.cpp index b2077baf1..3d9662793 100644 --- a/debuggerd/libdebuggerd/gwp_asan.cpp +++ b/debuggerd/libdebuggerd/gwp_asan.cpp @@ -43,10 +43,13 @@ static bool retrieve_gwp_asan_state(unwindstack::Memory* process_memory, uintptr static const gwp_asan::AllocationMetadata* retrieve_gwp_asan_metadata( unwindstack::Memory* process_memory, const gwp_asan::AllocatorState& state, uintptr_t metadata_addr) { - if (state.MaxSimultaneousAllocations > 1024) { + // 1 million GWP-ASan slots would take 4.1GiB of space. Thankfully, copying + // the metadata for that amount of slots is only 532MiB, and this really will + // only be used with some ridiculous torture-tests. + if (state.MaxSimultaneousAllocations > 1000000) { ALOGE( "Error when retrieving GWP-ASan metadata, MSA from state (%zu) " - "exceeds maximum allowed (1024).", + "exceeds maximum allowed (1,000,000).", state.MaxSimultaneousAllocations); return nullptr; }