7827991d7f
r.android.com/2108505 was intended to fix a crash in Scudo in the case where the stack depot, region info or ring buffer were unreadable. However, it also ended up introducing a number of bugs into the code. It failed to call __scudo_get_error_info if the page at the fault address was unreadable. This can happen in legitimate crash cases if a primary allocation was close to the boundary of a mapped region, or if the allocation was a secondary allocation with guard pages. It also used long as the type for tags, whereas Scudo expects it to be char. In combination this ended up causing most of the MTE tests to fail. Therefore, mostly revert that change. Fix the original crash by null checking the pointers returned by AllocAndReadFully before proceeding with the rest of the function. Bug: 233720136 Change-Id: I04d70d2abffaa35fe315d15d9224f9b412a9825d
491 lines
11 KiB
Text
491 lines
11 KiB
Text
package {
|
|
default_applicable_licenses: ["Android-Apache-2.0"],
|
|
}
|
|
|
|
cc_defaults {
|
|
name: "debuggerd_defaults",
|
|
cflags: [
|
|
"-Wall",
|
|
"-Wextra",
|
|
"-Werror",
|
|
"-Wno-gcc-compat",
|
|
"-Wno-unused-argument",
|
|
"-Wno-unused-function",
|
|
"-Wno-nullability-completeness",
|
|
"-Os",
|
|
"-fno-finite-loops",
|
|
],
|
|
|
|
local_include_dirs: ["include"],
|
|
}
|
|
|
|
cc_library_headers {
|
|
name: "libdebuggerd_common_headers",
|
|
export_include_dirs: ["common/include"],
|
|
recovery_available: true,
|
|
vendor_ramdisk_available: true,
|
|
apex_available: [
|
|
"com.android.virt",
|
|
"//apex_available:platform",
|
|
],
|
|
}
|
|
|
|
cc_library_shared {
|
|
name: "libtombstoned_client",
|
|
defaults: ["debuggerd_defaults"],
|
|
srcs: [
|
|
"tombstoned/tombstoned_client.cpp",
|
|
"util.cpp",
|
|
],
|
|
|
|
header_libs: ["libdebuggerd_common_headers"],
|
|
|
|
static_libs: [
|
|
"libasync_safe",
|
|
],
|
|
|
|
shared_libs: [
|
|
"libbase",
|
|
"libcutils",
|
|
],
|
|
apex_available: [
|
|
"com.android.virt",
|
|
"//apex_available:platform",
|
|
],
|
|
|
|
export_header_lib_headers: ["libdebuggerd_common_headers"],
|
|
export_include_dirs: ["tombstoned/include"],
|
|
}
|
|
|
|
// Utility library to talk to tombstoned and get an output fd.
|
|
cc_library_static {
|
|
name: "libtombstoned_client_static",
|
|
defaults: ["debuggerd_defaults"],
|
|
recovery_available: true,
|
|
vendor_ramdisk_available: true,
|
|
srcs: [
|
|
"tombstoned/tombstoned_client.cpp",
|
|
"util.cpp",
|
|
],
|
|
|
|
header_libs: ["libdebuggerd_common_headers"],
|
|
|
|
whole_static_libs: [
|
|
"libasync_safe",
|
|
"libcutils",
|
|
"libbase",
|
|
],
|
|
|
|
export_header_lib_headers: ["libdebuggerd_common_headers"],
|
|
export_include_dirs: ["tombstoned/include"],
|
|
}
|
|
|
|
// Core implementation, linked into libdebuggerd_handler and the dynamic linker.
|
|
cc_library_static {
|
|
name: "libdebuggerd_handler_core",
|
|
defaults: ["debuggerd_defaults"],
|
|
recovery_available: true,
|
|
vendor_ramdisk_available: true,
|
|
srcs: ["handler/debuggerd_handler.cpp"],
|
|
|
|
header_libs: [
|
|
"libbase_headers",
|
|
"libdebuggerd_common_headers",
|
|
"bionic_libc_platform_headers",
|
|
],
|
|
|
|
whole_static_libs: [
|
|
"libasync_safe",
|
|
"libcutils",
|
|
"libdebuggerd",
|
|
],
|
|
|
|
export_header_lib_headers: ["libdebuggerd_common_headers"],
|
|
export_include_dirs: ["include"],
|
|
}
|
|
|
|
// Implementation with a no-op fallback.
|
|
cc_library_static {
|
|
name: "libdebuggerd_handler",
|
|
defaults: ["debuggerd_defaults"],
|
|
srcs: ["handler/debuggerd_fallback_nop.cpp"],
|
|
|
|
header_libs: ["bionic_libc_platform_headers"],
|
|
export_header_lib_headers: ["bionic_libc_platform_headers"],
|
|
|
|
whole_static_libs: [
|
|
"libdebuggerd_handler_core",
|
|
],
|
|
|
|
export_include_dirs: ["include"],
|
|
}
|
|
|
|
// Fallback implementation, for use in the Bionic linker only.
|
|
cc_library_static {
|
|
name: "libdebuggerd_handler_fallback",
|
|
visibility: ["//bionic/linker"],
|
|
apex_available: [
|
|
"com.android.runtime",
|
|
"//apex_available:platform",
|
|
],
|
|
defaults: ["debuggerd_defaults"],
|
|
recovery_available: true,
|
|
vendor_ramdisk_available: true,
|
|
srcs: [
|
|
"handler/debuggerd_fallback.cpp",
|
|
],
|
|
|
|
whole_static_libs: [
|
|
"libdebuggerd_handler_core",
|
|
"libtombstoned_client_static",
|
|
"libasync_safe",
|
|
"libbase",
|
|
"libdebuggerd",
|
|
"libunwindstack_no_dex",
|
|
"liblzma",
|
|
"libcutils",
|
|
],
|
|
|
|
header_libs: ["bionic_libc_platform_headers"],
|
|
export_header_lib_headers: ["bionic_libc_platform_headers"],
|
|
|
|
export_include_dirs: ["include"],
|
|
}
|
|
|
|
cc_library {
|
|
name: "libdebuggerd_client",
|
|
defaults: ["debuggerd_defaults"],
|
|
srcs: [
|
|
"client/debuggerd_client.cpp",
|
|
"util.cpp",
|
|
],
|
|
|
|
shared_libs: [
|
|
"libbase",
|
|
"libcutils",
|
|
"libprocinfo",
|
|
],
|
|
|
|
header_libs: [
|
|
"libdebuggerd_common_headers",
|
|
"bionic_libc_platform_headers",
|
|
],
|
|
export_header_lib_headers: [
|
|
"libdebuggerd_common_headers",
|
|
"bionic_libc_platform_headers",
|
|
],
|
|
|
|
export_include_dirs: ["include"],
|
|
}
|
|
|
|
cc_library_static {
|
|
name: "libdebuggerd",
|
|
defaults: ["debuggerd_defaults"],
|
|
recovery_available: true,
|
|
vendor_ramdisk_available: true,
|
|
|
|
srcs: [
|
|
"libdebuggerd/backtrace.cpp",
|
|
"libdebuggerd/gwp_asan.cpp",
|
|
"libdebuggerd/open_files_list.cpp",
|
|
"libdebuggerd/tombstone.cpp",
|
|
"libdebuggerd/tombstone_proto.cpp",
|
|
"libdebuggerd/tombstone_proto_to_text.cpp",
|
|
"libdebuggerd/utility.cpp",
|
|
],
|
|
|
|
local_include_dirs: ["libdebuggerd/include"],
|
|
export_include_dirs: ["libdebuggerd/include"],
|
|
|
|
include_dirs: [
|
|
// Needed for private/bionic_fdsan.h
|
|
"bionic/libc",
|
|
],
|
|
header_libs: [
|
|
"bionic_libc_platform_headers",
|
|
"gwp_asan_headers",
|
|
],
|
|
|
|
static_libs: [
|
|
"libdexfile_support", // libunwindstack dependency
|
|
"libunwindstack",
|
|
"liblzma",
|
|
"libbase",
|
|
"libcutils",
|
|
"liblog",
|
|
],
|
|
runtime_libs: [
|
|
"libdexfile", // libdexfile_support dependency
|
|
],
|
|
|
|
whole_static_libs: [
|
|
"libasync_safe",
|
|
"gwp_asan_crash_handler",
|
|
"libtombstone_proto",
|
|
"libprocinfo",
|
|
"libprotobuf-cpp-lite",
|
|
],
|
|
|
|
target: {
|
|
recovery: {
|
|
exclude_static_libs: [
|
|
"libdexfile_support",
|
|
],
|
|
exclude_runtime_libs: [
|
|
"libdexfile",
|
|
],
|
|
},
|
|
vendor_ramdisk: {
|
|
exclude_static_libs: [
|
|
"libdexfile_support",
|
|
],
|
|
exclude_runtime_libs: [
|
|
"libdexfile",
|
|
],
|
|
},
|
|
},
|
|
|
|
product_variables: {
|
|
debuggable: {
|
|
cflags: ["-DROOT_POSSIBLE"],
|
|
},
|
|
|
|
malloc_not_svelte: {
|
|
cflags: ["-DUSE_SCUDO"],
|
|
whole_static_libs: ["libscudo"],
|
|
srcs: ["libdebuggerd/scudo.cpp"],
|
|
header_libs: ["scudo_headers"],
|
|
},
|
|
},
|
|
}
|
|
|
|
cc_binary {
|
|
name: "pbtombstone",
|
|
defaults: ["debuggerd_defaults"],
|
|
srcs: ["pbtombstone.cpp"],
|
|
static_libs: [
|
|
"libbase",
|
|
"libdebuggerd",
|
|
"liblog",
|
|
"libprotobuf-cpp-lite",
|
|
"libtombstone_proto",
|
|
"libunwindstack",
|
|
],
|
|
}
|
|
|
|
cc_test_library {
|
|
name: "libcrash_test",
|
|
defaults: ["debuggerd_defaults"],
|
|
srcs: ["crash_test.cpp"],
|
|
}
|
|
|
|
cc_test {
|
|
name: "debuggerd_test",
|
|
defaults: ["debuggerd_defaults"],
|
|
require_root: true,
|
|
|
|
cflags: ["-Wno-missing-field-initializers"],
|
|
srcs: [
|
|
"libdebuggerd/test/dump_memory_test.cpp",
|
|
"libdebuggerd/test/elf_fake.cpp",
|
|
"libdebuggerd/test/log_fake.cpp",
|
|
"libdebuggerd/test/open_files_list_test.cpp",
|
|
"libdebuggerd/test/utility_test.cpp",
|
|
],
|
|
|
|
target: {
|
|
android: {
|
|
srcs: [
|
|
"client/debuggerd_client_test.cpp",
|
|
"debuggerd_test.cpp",
|
|
],
|
|
static_libs: [
|
|
"libasync_safe",
|
|
"libtombstoned_client_static",
|
|
],
|
|
},
|
|
},
|
|
|
|
shared_libs: [
|
|
"libbase",
|
|
"libcutils",
|
|
"libdebuggerd_client",
|
|
"liblog",
|
|
"libnativehelper",
|
|
"libunwindstack",
|
|
],
|
|
|
|
static_libs: [
|
|
"libdebuggerd",
|
|
"libgmock",
|
|
"libminijail",
|
|
],
|
|
|
|
header_libs: [
|
|
"bionic_libc_platform_headers",
|
|
"gwp_asan_headers",
|
|
],
|
|
|
|
local_include_dirs: [
|
|
"libdebuggerd",
|
|
],
|
|
|
|
compile_multilib: "both",
|
|
multilib: {
|
|
lib32: {
|
|
stem: "debuggerd_test32",
|
|
},
|
|
lib64: {
|
|
stem: "debuggerd_test64",
|
|
},
|
|
},
|
|
|
|
data: [
|
|
":libcrash_test",
|
|
],
|
|
|
|
test_suites: ["device-tests"],
|
|
}
|
|
|
|
cc_benchmark {
|
|
name: "debuggerd_benchmark",
|
|
defaults: ["debuggerd_defaults"],
|
|
srcs: ["debuggerd_benchmark.cpp"],
|
|
shared_libs: [
|
|
"libbase",
|
|
"libdebuggerd_client",
|
|
],
|
|
}
|
|
|
|
cc_binary {
|
|
name: "crash_dump",
|
|
srcs: [
|
|
"crash_dump.cpp",
|
|
"util.cpp",
|
|
],
|
|
defaults: ["debuggerd_defaults"],
|
|
|
|
compile_multilib: "both",
|
|
multilib: {
|
|
lib32: {
|
|
suffix: "32",
|
|
},
|
|
lib64: {
|
|
suffix: "64",
|
|
},
|
|
},
|
|
|
|
header_libs: [
|
|
"bionic_libc_platform_headers",
|
|
],
|
|
|
|
static_libs: [
|
|
"libtombstoned_client_static",
|
|
"libdebuggerd",
|
|
"libcutils",
|
|
|
|
"libtombstone_proto",
|
|
"libprotobuf-cpp-lite",
|
|
],
|
|
|
|
shared_libs: [
|
|
"libbase",
|
|
"liblog",
|
|
"libprocinfo",
|
|
"libunwindstack",
|
|
],
|
|
|
|
apex_available: [
|
|
"com.android.runtime",
|
|
],
|
|
|
|
// Required for tests.
|
|
required: ["crash_dump.policy"],
|
|
}
|
|
|
|
cc_binary {
|
|
name: "debuggerd",
|
|
srcs: [
|
|
"debuggerd.cpp",
|
|
],
|
|
defaults: ["debuggerd_defaults"],
|
|
|
|
shared_libs: [
|
|
"libbase",
|
|
"libdebuggerd_client",
|
|
"liblog",
|
|
"libprocinfo",
|
|
],
|
|
|
|
local_include_dirs: ["include"],
|
|
}
|
|
|
|
cc_binary {
|
|
name: "tombstoned",
|
|
srcs: [
|
|
"util.cpp",
|
|
"tombstoned/intercept_manager.cpp",
|
|
"tombstoned/tombstoned.cpp",
|
|
],
|
|
defaults: ["debuggerd_defaults"],
|
|
|
|
header_libs: [
|
|
"bionic_libc_platform_headers",
|
|
"libdebuggerd_common_headers"
|
|
],
|
|
|
|
static_libs: [
|
|
"libbase",
|
|
"libcutils",
|
|
"libevent",
|
|
"liblog",
|
|
],
|
|
|
|
init_rc: ["tombstoned/tombstoned.rc"],
|
|
}
|
|
|
|
prebuilt_etc {
|
|
name: "crash_dump.policy",
|
|
sub_dir: "seccomp_policy",
|
|
filename_from_src: true,
|
|
arch: {
|
|
arm: {
|
|
src: "seccomp_policy/crash_dump.arm.policy",
|
|
},
|
|
arm64: {
|
|
src: "seccomp_policy/crash_dump.arm64.policy",
|
|
},
|
|
x86: {
|
|
src: "seccomp_policy/crash_dump.x86.policy",
|
|
},
|
|
x86_64: {
|
|
src: "seccomp_policy/crash_dump.x86_64.policy",
|
|
},
|
|
},
|
|
required: [
|
|
"crash_dump.policy_other",
|
|
],
|
|
}
|
|
|
|
|
|
// NB -- this installs "the other" architecture. (puts 32 bit config in on 64 bit device)
|
|
// or at least that is the intention so that we get both of them populated
|
|
prebuilt_etc {
|
|
name: "crash_dump.policy_other",
|
|
sub_dir: "seccomp_policy",
|
|
filename_from_src: true,
|
|
arch: {
|
|
arm: {
|
|
src: "seccomp_policy/crash_dump.arm64.policy",
|
|
},
|
|
arm64: {
|
|
src: "seccomp_policy/crash_dump.arm.policy",
|
|
},
|
|
x86: {
|
|
src: "seccomp_policy/crash_dump.x86_64.policy",
|
|
},
|
|
x86_64: {
|
|
src: "seccomp_policy/crash_dump.x86.policy",
|
|
},
|
|
},
|
|
}
|