Merge "Add documentation to <dirent.h>."
diff --git a/apex/Android.bp b/apex/Android.bp
index f62f930..f6820d1 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -28,7 +28,10 @@
],
multilib: {
both: {
- binaries: ["linker"],
+ binaries: [
+ "crash_dump",
+ "linker",
+ ],
},
},
key: "com.android.runtime.key",
diff --git a/libc/Android.bp b/libc/Android.bp
index 49654b3..650726a 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -1777,9 +1777,15 @@
native_bridge_supported: true,
apex_available: [
"//apex_available:platform",
- "com.android.runtime",
- "com.android.art.debug",
- "com.android.art.release",
+ "//apex_available:anyapex",
+ ],
+ visibility: [
+ ":__subpackages__", // visible to bionic
+ // ... and only to these places (b/152668052)
+ "//external/gwp_asan",
+ "//external/libunwind_llvm",
+ "//system/core/property_service/libpropertyinfoparser",
+ "//system/extras/toolchain-extras",
],
no_libcrt: true,
diff --git a/libc/bionic/android_profiling_dynamic.cpp b/libc/bionic/android_profiling_dynamic.cpp
index 54f896c..9d92a6d 100644
--- a/libc/bionic/android_profiling_dynamic.cpp
+++ b/libc/bionic/android_profiling_dynamic.cpp
@@ -63,6 +63,14 @@
action.sa_flags = SA_SIGINFO | SA_RESTART;
action.sa_sigaction = HandleProfilingSignal;
sigaction(BIONIC_SIGNAL_PROFILER, &action, nullptr);
+
+ // The perfetto_hprof ART plugin installs a signal handler to handle this signal. That plugin
+ // does not get loaded for a) non-apps, b) non-profilable apps on user. The default signal
+ // disposition is to crash. We do not want the target to crash if we accidentally target a
+ // non-app or non-profilable process.
+ //
+ // This does *not* get run for processes that statically link libc, and those will still crash.
+ signal(BIONIC_SIGNAL_ART_PROFILER, SIG_IGN);
}
static void HandleSigsysSeccompOverride(int, siginfo_t*, void*);
diff --git a/libc/platform/bionic/reserved_signals.h b/libc/platform/bionic/reserved_signals.h
index 3c5bc02..c90fc06 100644
--- a/libc/platform/bionic/reserved_signals.h
+++ b/libc/platform/bionic/reserved_signals.h
@@ -47,8 +47,10 @@
// If you change this, also change __ndk_legacy___libc_current_sigrtmin
// in <android/legacy_signal_inlines.h> to match.
+#define BIONIC_SIGNAL_POSIX_TIMERS (__SIGRTMIN + 0)
#define BIONIC_SIGNAL_DEBUGGER (__SIGRTMIN + 3)
#define BIONIC_SIGNAL_PROFILER (__SIGRTMIN + 4)
+#define BIONIC_SIGNAL_ART_PROFILER (__SIGRTMIN + 6)
#define BIONIC_SIGNAL_FDTRACK (__SIGRTMIN + 7)
#define __SIGRT_RESERVED 8
diff --git a/linker/linker_debuggerd_android.cpp b/linker/linker_debuggerd_android.cpp
index 42ea2b7..6a81673 100644
--- a/linker/linker_debuggerd_android.cpp
+++ b/linker/linker_debuggerd_android.cpp
@@ -33,18 +33,25 @@
#include "linker_gdb_support.h"
+#if defined(__ANDROID_APEX__)
+static debugger_process_info get_process_info() {
+ return {
+ .abort_msg = __libc_shared_globals()->abort_msg,
+ .fdsan_table = &__libc_shared_globals()->fd_table,
+ .gwp_asan_state = __libc_shared_globals()->gwp_asan_state,
+ .gwp_asan_metadata = __libc_shared_globals()->gwp_asan_metadata,
+ };
+}
+#endif
+
void linker_debuggerd_init() {
+ // There may be a version mismatch between the bootstrap linker and the crash_dump in the APEX,
+ // so don't pass in any process info from the bootstrap linker.
debuggerd_callbacks_t callbacks = {
- .get_abort_message = []() {
- return __libc_shared_globals()->abort_msg;
- },
- .post_dump = ¬ify_gdb_of_libraries,
- .get_gwp_asan_state = []() {
- return __libc_shared_globals()->gwp_asan_state;
- },
- .get_gwp_asan_metadata = []() {
- return __libc_shared_globals()->gwp_asan_metadata;
- },
+#if defined(__ANDROID_APEX__)
+ .get_process_info = get_process_info,
+#endif
+ .post_dump = notify_gdb_of_libraries,
};
debuggerd_init(&callbacks);
}
diff --git a/tests/Android.bp b/tests/Android.bp
index d78a204..f1182a7 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -779,17 +779,6 @@
}
cc_test {
- name: "bionic-unit-tests-scudo",
- defaults: [
- "bionic_unit_tests_defaults",
- ],
-
- shared_libs: [
- "libc_scudo",
- ],
-}
-
-cc_test {
name: "bionic-stress-tests",
defaults: [
"bionic_tests_defaults",
diff --git a/tests/spawn_test.cpp b/tests/spawn_test.cpp
index 04b66d3..d7ed970 100644
--- a/tests/spawn_test.cpp
+++ b/tests/spawn_test.cpp
@@ -31,6 +31,8 @@
# if !defined(POSIX_SPAWN_SETSID)
# define POSIX_SPAWN_SETSID 0
# endif
+#else
+#include <platform/bionic/reserved_signals.h>
#endif
TEST(spawn, posix_spawnattr_init_posix_spawnattr_destroy) {
@@ -292,7 +294,7 @@
pid_t sid;
};
-static void GetChildStat(posix_spawnattr_t* sa, ProcStat* ps) {
+static __attribute__((unused)) void GetChildStat(posix_spawnattr_t* sa, ProcStat* ps) {
std::string content;
CatFileToString(sa, "/proc/self/stat", &content);
@@ -307,7 +309,7 @@
uint64_t sigign;
};
-static void GetChildStatus(posix_spawnattr_t* sa, ProcStatus* ps) {
+static void __attribute__((unused)) GetChildStatus(posix_spawnattr_t* sa, ProcStatus* ps) {
std::string content;
CatFileToString(sa, "/proc/self/status", &content);
@@ -377,6 +379,9 @@
}
TEST(spawn, posix_spawn_POSIX_SPAWN_SETSIGMASK) {
+#if defined(__GLIBC__)
+ GTEST_SKIP() << "glibc doesn't ignore the same signals.";
+#else
// Block SIGBUS in the parent...
sigset_t just_SIGBUS;
sigemptyset(&just_SIGBUS);
@@ -400,15 +405,21 @@
// TIMER_SIGNAL should also be blocked.
uint64_t expected_blocked = 0;
SignalSetAdd(&expected_blocked, SIGALRM);
- SignalSetAdd(&expected_blocked, __SIGRTMIN + 0);
+ SignalSetAdd(&expected_blocked, BIONIC_SIGNAL_POSIX_TIMERS);
EXPECT_EQ(expected_blocked, ps.sigblk);
- EXPECT_EQ(static_cast<uint64_t>(0), ps.sigign);
+ uint64_t expected_ignored = 0;
+ SignalSetAdd(&expected_ignored, BIONIC_SIGNAL_ART_PROFILER);
+ EXPECT_EQ(expected_ignored, ps.sigign);
ASSERT_EQ(0, posix_spawnattr_destroy(&sa));
+#endif
}
TEST(spawn, posix_spawn_POSIX_SPAWN_SETSIGDEF) {
+#if defined(__GLIBC__)
+ GTEST_SKIP() << "glibc doesn't ignore the same signals.";
+#else
// Ignore SIGALRM and SIGCONT in the parent...
ASSERT_NE(SIG_ERR, signal(SIGALRM, SIG_IGN));
ASSERT_NE(SIG_ERR, signal(SIGCONT, SIG_IGN));
@@ -430,14 +441,16 @@
// TIMER_SIGNAL should be blocked.
uint64_t expected_blocked = 0;
- SignalSetAdd(&expected_blocked, __SIGRTMIN + 0);
+ SignalSetAdd(&expected_blocked, BIONIC_SIGNAL_POSIX_TIMERS);
EXPECT_EQ(expected_blocked, ps.sigblk);
uint64_t expected_ignored = 0;
SignalSetAdd(&expected_ignored, SIGCONT);
+ SignalSetAdd(&expected_ignored, BIONIC_SIGNAL_ART_PROFILER);
EXPECT_EQ(expected_ignored, ps.sigign);
ASSERT_EQ(0, posix_spawnattr_destroy(&sa));
+#endif
}
TEST(spawn, signal_stress) {