Merge "Fix bug in stats_event_benchmark"
diff --git a/adb/apex/ld.config.txt b/adb/apex/ld.config.txt
index 85f9b29..13d66b6 100644
--- a/adb/apex/ld.config.txt
+++ b/adb/apex/ld.config.txt
@@ -5,22 +5,14 @@
dir.adbd = /apex/com.android.adbd/bin/
[adbd]
-additional.namespaces = platform,art,adbd
+additional.namespaces = platform,art
namespace.default.isolated = true
-namespace.default.links = art,adbd,platform
+namespace.default.search.paths = /apex/com.android.adbd/${LIB}
+namespace.default.asan.search.paths = /apex/com.android.adbd/${LIB}
+namespace.default.links = art,platform
namespace.default.link.art.shared_libs = libadbconnection_server.so
-namespace.default.link.platform.allow_all_shared_libs = true
-namespace.default.link.adbd.allow_all_shared_libs = true
-
-###############################################################################
-# "adbd" APEX namespace
-###############################################################################
-namespace.adbd.isolated = true
-namespace.adbd.search.paths = /apex/com.android.adbd/${LIB}
-namespace.adbd.asan.search.paths = /apex/com.android.adbd/${LIB}
-namespace.adbd.links = platform
-namespace.adbd.link.platform.allow_all_shared_libs = true
+namespace.default.link.platform.shared_libs = libc.so:libdl.so:libm.so:libclang_rt.hwasan-aarch64-android.so
###############################################################################
# "art" APEX namespace: used for libadbdconnection_server
diff --git a/debuggerd/Android.bp b/debuggerd/Android.bp
index 0602e0a..780e48d 100644
--- a/debuggerd/Android.bp
+++ b/debuggerd/Android.bp
@@ -74,6 +74,7 @@
header_libs: [
"libbase_headers",
"libdebuggerd_common_headers",
+ "bionic_libc_platform_headers",
],
whole_static_libs: [
@@ -92,6 +93,9 @@
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",
],
@@ -119,6 +123,10 @@
"liblzma",
"libcutils",
],
+
+ header_libs: ["bionic_libc_platform_headers"],
+ export_header_lib_headers: ["bionic_libc_platform_headers"],
+
target: {
recovery: {
exclude_static_libs: [
@@ -138,15 +146,21 @@
"util.cpp",
],
- header_libs: ["libdebuggerd_common_headers"],
-
shared_libs: [
"libbase",
"libcutils",
"libprocinfo",
],
- export_header_lib_headers: ["libdebuggerd_common_headers"],
+ header_libs: [
+ "libdebuggerd_common_headers",
+ "bionic_libc_platform_headers",
+ ],
+ export_header_lib_headers: [
+ "libdebuggerd_common_headers",
+ "bionic_libc_platform_headers",
+ ],
+
export_include_dirs: ["include"],
}
@@ -167,6 +181,7 @@
// Needed for private/bionic_fdsan.h
include_dirs: ["bionic/libc"],
+ header_libs: ["bionic_libc_platform_headers"],
static_libs: [
"libdexfile_support_static", // libunwindstack dependency
@@ -176,6 +191,7 @@
"libcutils",
"liblog",
],
+
target: {
recovery: {
exclude_static_libs: [
@@ -232,6 +248,10 @@
"libdebuggerd",
],
+ header_libs: [
+ "bionic_libc_platform_headers",
+ ],
+
local_include_dirs: [
"libdebuggerd",
],
@@ -277,6 +297,10 @@
},
},
+ header_libs: [
+ "bionic_libc_platform_headers",
+ ],
+
static_libs: [
"libtombstoned_client_static",
"libdebuggerd",
@@ -317,7 +341,10 @@
],
defaults: ["debuggerd_defaults"],
- header_libs: ["libdebuggerd_common_headers"],
+ header_libs: [
+ "bionic_libc_platform_headers",
+ "libdebuggerd_common_headers"
+ ],
static_libs: [
"libbase",
diff --git a/debuggerd/client/debuggerd_client.cpp b/debuggerd/client/debuggerd_client.cpp
index 7e35a2f..5c02738 100644
--- a/debuggerd/client/debuggerd_client.cpp
+++ b/debuggerd/client/debuggerd_client.cpp
@@ -35,6 +35,7 @@
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
+#include <bionic/reserved_signals.h>
#include <cutils/sockets.h>
#include <procinfo/process.h>
@@ -50,7 +51,7 @@
using android::base::WriteStringToFd;
static bool send_signal(pid_t pid, const DebuggerdDumpType dump_type) {
- const int signal = (dump_type == kDebuggerdJavaBacktrace) ? SIGQUIT : DEBUGGER_SIGNAL;
+ const int signal = (dump_type == kDebuggerdJavaBacktrace) ? SIGQUIT : BIONIC_SIGNAL_DEBUGGER;
sigval val;
val.sival_int = (dump_type == kDebuggerdNativeBacktrace) ? 1 : 0;
diff --git a/debuggerd/crash_dump.cpp b/debuggerd/crash_dump.cpp
index cb55745..e8f366f 100644
--- a/debuggerd/crash_dump.cpp
+++ b/debuggerd/crash_dump.cpp
@@ -40,6 +40,7 @@
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
+#include <bionic/reserved_signals.h>
#include <cutils/sockets.h>
#include <log/log.h>
#include <private/android_filesystem_config.h>
@@ -511,13 +512,13 @@
// Defer the message until later, for readability.
bool wait_for_gdb = android::base::GetBoolProperty("debug.debuggerd.wait_for_gdb", false);
- if (siginfo.si_signo == DEBUGGER_SIGNAL) {
+ if (siginfo.si_signo == BIONIC_SIGNAL_DEBUGGER) {
wait_for_gdb = false;
}
// Detach from all of our attached threads before resuming.
for (const auto& [tid, thread] : thread_info) {
- int resume_signal = thread.signo == DEBUGGER_SIGNAL ? 0 : thread.signo;
+ int resume_signal = thread.signo == BIONIC_SIGNAL_DEBUGGER ? 0 : thread.signo;
if (wait_for_gdb) {
resume_signal = 0;
if (tgkill(target_process, tid, SIGSTOP) != 0) {
@@ -555,10 +556,10 @@
<< " (target tid = " << g_target_thread << ")";
int signo = siginfo.si_signo;
- bool fatal_signal = signo != DEBUGGER_SIGNAL;
+ bool fatal_signal = signo != BIONIC_SIGNAL_DEBUGGER;
bool backtrace = false;
- // si_value is special when used with DEBUGGER_SIGNAL.
+ // si_value is special when used with BIONIC_SIGNAL_DEBUGGER.
// 0: dump tombstone
// 1: dump backtrace
if (!fatal_signal) {
diff --git a/debuggerd/crasher/Android.bp b/debuggerd/crasher/Android.bp
index 7bec470..e86f499 100644
--- a/debuggerd/crasher/Android.bp
+++ b/debuggerd/crasher/Android.bp
@@ -44,6 +44,7 @@
name: "crasher",
defaults: ["crasher-defaults"],
+ header_libs: ["bionic_libc_platform_headers"],
shared_libs: [
"libbase",
"liblog",
@@ -65,6 +66,7 @@
defaults: ["crasher-defaults"],
cppflags: ["-DSTATIC_CRASHER"],
static_executable: true,
+ header_libs: ["bionic_libc_platform_headers"],
static_libs: [
"libdebuggerd_handler",
"libbase",
diff --git a/debuggerd/debuggerd_test.cpp b/debuggerd/debuggerd_test.cpp
index 99729dc..6a8cc56 100644
--- a/debuggerd/debuggerd_test.cpp
+++ b/debuggerd/debuggerd_test.cpp
@@ -31,6 +31,7 @@
#include <android/fdsan.h>
#include <android/set_abort_message.h>
+#include <bionic/reserved_signals.h>
#include <android-base/cmsg.h>
#include <android-base/file.h>
@@ -398,7 +399,7 @@
unique_fd output_fd;
StartProcess([]() {
android_set_abort_message("not actually aborting");
- raise(DEBUGGER_SIGNAL);
+ raise(BIONIC_SIGNAL_DEBUGGER);
exit(0);
});
StartIntercept(&output_fd);
@@ -466,7 +467,7 @@
sigval val;
val.sival_int = 1;
- ASSERT_EQ(0, sigqueue(crasher_pid, DEBUGGER_SIGNAL, val)) << strerror(errno);
+ ASSERT_EQ(0, sigqueue(crasher_pid, BIONIC_SIGNAL_DEBUGGER, val)) << strerror(errno);
FinishIntercept(&intercept_result);
ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
ConsumeFd(std::move(output_fd), &result);
@@ -734,7 +735,7 @@
siginfo.si_value.sival_int = dump_type == kDebuggerdNativeBacktrace;
- if (syscall(__NR_rt_tgsigqueueinfo, getpid(), gettid(), DEBUGGER_SIGNAL, &siginfo) != 0) {
+ if (syscall(__NR_rt_tgsigqueueinfo, getpid(), gettid(), BIONIC_SIGNAL_DEBUGGER, &siginfo) != 0) {
PLOG(ERROR) << "libdebuggerd_client: failed to send signal to self";
return false;
}
@@ -887,7 +888,7 @@
errx(2, "first waitpid returned %d (%s), expected failure with ECHILD", rc, strerror(errno));
}
- raise(DEBUGGER_SIGNAL);
+ raise(BIONIC_SIGNAL_DEBUGGER);
errno = 0;
rc = TEMP_FAILURE_RETRY(waitpid(-1, &status, __WALL | __WNOTHREAD));
diff --git a/debuggerd/handler/debuggerd_fallback.cpp b/debuggerd/handler/debuggerd_fallback.cpp
index bbec612..9bcbdb3 100644
--- a/debuggerd/handler/debuggerd_fallback.cpp
+++ b/debuggerd/handler/debuggerd_fallback.cpp
@@ -42,6 +42,7 @@
#include <android-base/file.h>
#include <android-base/unique_fd.h>
#include <async_safe/log.h>
+#include <bionic/reserved_signals.h>
#include <unwindstack/DexFiles.h>
#include <unwindstack/JitDebug.h>
#include <unwindstack/Maps.h>
@@ -272,7 +273,7 @@
siginfo.si_pid = getpid();
siginfo.si_uid = getuid();
- if (syscall(__NR_rt_tgsigqueueinfo, getpid(), tid, DEBUGGER_SIGNAL, &siginfo) != 0) {
+ if (syscall(__NR_rt_tgsigqueueinfo, getpid(), tid, BIONIC_SIGNAL_DEBUGGER, &siginfo) != 0) {
async_safe_format_log(ANDROID_LOG_ERROR, "libc", "failed to send trace signal to %d: %s",
tid, strerror(errno));
return false;
@@ -340,7 +341,7 @@
extern "C" void debuggerd_fallback_handler(siginfo_t* info, ucontext_t* ucontext,
void* abort_message) {
- if (info->si_signo == DEBUGGER_SIGNAL && info->si_value.sival_ptr != nullptr) {
+ if (info->si_signo == BIONIC_SIGNAL_DEBUGGER && info->si_value.sival_ptr != nullptr) {
return trace_handler(info, ucontext);
} else {
return crash_handler(info, ucontext, abort_message);
diff --git a/debuggerd/handler/debuggerd_handler.cpp b/debuggerd/handler/debuggerd_handler.cpp
index b90ca80..6e01289 100644
--- a/debuggerd/handler/debuggerd_handler.cpp
+++ b/debuggerd/handler/debuggerd_handler.cpp
@@ -51,6 +51,7 @@
#include <android-base/unique_fd.h>
#include <async_safe/log.h>
+#include <bionic/reserved_signals.h>
#include <cutils/properties.h>
#include <libdebuggerd/utility.h>
@@ -175,7 +176,7 @@
thread_name[MAX_TASK_NAME_LEN] = 0;
}
- if (info->si_signo == DEBUGGER_SIGNAL) {
+ if (info->si_signo == BIONIC_SIGNAL_DEBUGGER) {
async_safe_format_log(ANDROID_LOG_INFO, "libc", "Requested dump for tid %d (%s)", __gettid(),
thread_name);
return;
@@ -307,7 +308,7 @@
static void* pseudothread_stack;
static DebuggerdDumpType get_dump_type(const debugger_thread_info* thread_info) {
- if (thread_info->siginfo->si_signo == DEBUGGER_SIGNAL &&
+ if (thread_info->siginfo->si_signo == BIONIC_SIGNAL_DEBUGGER &&
thread_info->siginfo->si_value.sival_int) {
return kDebuggerdNativeBacktrace;
}
@@ -429,7 +430,7 @@
async_safe_format_log(ANDROID_LOG_FATAL, "libc", "crash_dump helper crashed or stopped");
}
- if (thread_info->siginfo->si_signo != DEBUGGER_SIGNAL) {
+ if (thread_info->siginfo->si_signo != BIONIC_SIGNAL_DEBUGGER) {
// For crashes, we don't need to minimize pause latency.
// Wait for the dump to complete before having the process exit, to avoid being murdered by
// ActivityManager or init.
@@ -446,7 +447,7 @@
// exited with the correct exit status (e.g. so that sh will report
// "Segmentation fault" instead of "Killed"). For this to work, we need
// to deregister our signal handler for that signal before continuing.
- if (info->si_signo != DEBUGGER_SIGNAL) {
+ if (info->si_signo != BIONIC_SIGNAL_DEBUGGER) {
signal(info->si_signo, SIG_DFL);
int rc = syscall(SYS_rt_tgsigqueueinfo, __getpid(), __gettid(), info->si_signo, info);
if (rc != 0) {
@@ -485,7 +486,7 @@
void* abort_message = nullptr;
uintptr_t si_val = reinterpret_cast<uintptr_t>(info->si_ptr);
- if (signal_number == DEBUGGER_SIGNAL) {
+ if (signal_number == BIONIC_SIGNAL_DEBUGGER) {
if (info->si_code == SI_QUEUE && info->si_pid == __getpid()) {
// Allow for the abort message to be explicitly specified via the sigqueue value.
// Keep the bottom bit intact for representing whether we want a backtrace or a tombstone.
@@ -576,7 +577,7 @@
fatal_errno("failed to restore traceable");
}
- if (info->si_signo == DEBUGGER_SIGNAL) {
+ if (info->si_signo == BIONIC_SIGNAL_DEBUGGER) {
// If the signal is fatal, don't unlock the mutex to prevent other crashing threads from
// starting to dump right before our death.
pthread_mutex_unlock(&crash_mutex);
diff --git a/debuggerd/include/debuggerd/handler.h b/debuggerd/include/debuggerd/handler.h
index 7196e0a..cd6fc05 100644
--- a/debuggerd/include/debuggerd/handler.h
+++ b/debuggerd/include/debuggerd/handler.h
@@ -16,6 +16,7 @@
#pragma once
+#include <bionic/reserved_signals.h>
#include <signal.h>
#include <stdint.h>
#include <sys/cdefs.h>
@@ -33,11 +34,11 @@
void debuggerd_init(debuggerd_callbacks_t* callbacks);
// DEBUGGER_ACTION_DUMP_TOMBSTONE and DEBUGGER_ACTION_DUMP_BACKTRACE are both
-// triggered via DEBUGGER_SIGNAL. The debugger_action_t is sent via si_value
+// triggered via BIONIC_SIGNAL_DEBUGGER. The debugger_action_t is sent via si_value
// using sigqueue(2) or equivalent. If no si_value is specified (e.g. if the
// signal is sent by kill(2)), the default behavior is to print the backtrace
// to the log.
-#define DEBUGGER_SIGNAL (__SIGRTMIN + 3)
+#define DEBUGGER_SIGNAL BIONIC_SIGNAL_DEBUGGER
static void __attribute__((__unused__)) debuggerd_register_handlers(struct sigaction* action) {
sigaction(SIGABRT, action, nullptr);
@@ -50,7 +51,7 @@
#endif
sigaction(SIGSYS, action, nullptr);
sigaction(SIGTRAP, action, nullptr);
- sigaction(DEBUGGER_SIGNAL, action, nullptr);
+ sigaction(BIONIC_SIGNAL_DEBUGGER, action, nullptr);
}
__END_DECLS
diff --git a/debuggerd/libdebuggerd/tombstone.cpp b/debuggerd/libdebuggerd/tombstone.cpp
index 236fcf7..b64e260 100644
--- a/debuggerd/libdebuggerd/tombstone.cpp
+++ b/debuggerd/libdebuggerd/tombstone.cpp
@@ -52,9 +52,6 @@
#include <unwindstack/Regs.h>
#include <unwindstack/Unwinder.h>
-// Needed to get DEBUGGER_SIGNAL.
-#include "debuggerd/handler.h"
-
#include "libdebuggerd/backtrace.h"
#include "libdebuggerd/open_files_list.h"
#include "libdebuggerd/utility.h"
diff --git a/debuggerd/libdebuggerd/utility.cpp b/debuggerd/libdebuggerd/utility.cpp
index 5ce26fc..0a1d2a4 100644
--- a/debuggerd/libdebuggerd/utility.cpp
+++ b/debuggerd/libdebuggerd/utility.cpp
@@ -35,6 +35,7 @@
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
+#include <bionic/reserved_signals.h>
#include <debuggerd/handler.h>
#include <log/log.h>
#include <unwindstack/Memory.h>
@@ -296,7 +297,8 @@
case SIGSTOP: return "SIGSTOP";
case SIGSYS: return "SIGSYS";
case SIGTRAP: return "SIGTRAP";
- case DEBUGGER_SIGNAL: return "<debuggerd signal>";
+ case BIONIC_SIGNAL_DEBUGGER:
+ return "<debuggerd signal>";
default: return "?";
}
}
diff --git a/fs_mgr/fs_mgr_overlayfs.cpp b/fs_mgr/fs_mgr_overlayfs.cpp
index 27971da..c043754 100644
--- a/fs_mgr/fs_mgr_overlayfs.cpp
+++ b/fs_mgr/fs_mgr_overlayfs.cpp
@@ -811,66 +811,48 @@
return "auto";
}
-enum class ScratchStrategy {
- kNone,
- // DAP device, use logical partitions.
- kDynamicPartition,
- // Retrofit DAP device, use super_<other>.
- kSuperOther,
- // Pre-DAP device, uses the other slot.
- kSystemOther
-};
-
-// Return the strategy this device must use for creating a scratch partition.
-static ScratchStrategy GetScratchStrategy(std::string* backing_device = nullptr) {
+// Note: we do not check access() here except for the super partition, since
+// in first-stage init we wouldn't have registed by-name symlinks for "other"
+// partitions that won't be mounted.
+static std::string GetPhysicalScratchDevice() {
auto slot_number = fs_mgr_overlayfs_slot_number();
auto super_device = fs_mgr_overlayfs_super_device(slot_number);
auto path = fs_mgr_overlayfs_super_device(slot_number == 0);
if (super_device != path) {
- // Note: we do not check access() here, since in first-stage init we
- // wouldn't have registed by-name symlinks for the device as it's
- // normally not needed. The access checks elsewhere in this function
- // are safe because system/super are always required.
- if (backing_device) *backing_device = path;
- return ScratchStrategy::kSuperOther;
+ return path;
}
if (fs_mgr_access(super_device)) {
- if (backing_device) *backing_device = super_device;
- return ScratchStrategy::kDynamicPartition;
+ // Do not try to use system_other on a DAP device.
+ return "";
}
auto other_slot = fs_mgr_get_other_slot_suffix();
if (!other_slot.empty()) {
- path = kPhysicalDevice + "system" + other_slot;
- if (fs_mgr_access(path)) {
- if (backing_device) *backing_device = path;
- return ScratchStrategy::kSystemOther;
- }
+ return kPhysicalDevice + "system" + other_slot;
}
- return ScratchStrategy::kNone;
+ return "";
}
-// Return the scratch device if it exists.
-static std::string GetScratchDevice() {
- std::string device;
- ScratchStrategy strategy = GetScratchStrategy(&device);
+// This returns the scratch device that was detected during early boot (first-
+// stage init). If the device was created later, for example during setup for
+// the adb remount command, it can return an empty string since it does not
+// query ImageManager.
+static std::string GetBootScratchDevice() {
+ auto& dm = DeviceMapper::Instance();
- switch (strategy) {
- case ScratchStrategy::kSuperOther:
- case ScratchStrategy::kSystemOther:
- return device;
- case ScratchStrategy::kDynamicPartition: {
- auto& dm = DeviceMapper::Instance();
- auto partition_name = android::base::Basename(kScratchMountPoint);
- if (dm.GetState(partition_name) != DmDeviceState::INVALID &&
- dm.GetDmDevicePathByName(partition_name, &device)) {
- return device;
- }
- return "";
- }
- default:
- return "";
+ // If there is a scratch partition allocated in /data or on super, we
+ // automatically prioritize that over super_other or system_other.
+ // Some devices, for example, have a write-protected eMMC and the
+ // super partition cannot be used even if it exists.
+ std::string device;
+ auto partition_name = android::base::Basename(kScratchMountPoint);
+ if (dm.GetState(partition_name) != DmDeviceState::INVALID &&
+ dm.GetDmDevicePathByName(partition_name, &device)) {
+ return device;
}
+
+ // There is no dynamic scratch, so try and find a physical one.
+ return GetPhysicalScratchDevice();
}
bool fs_mgr_overlayfs_make_scratch(const std::string& scratch_device, const std::string& mnt_type) {
@@ -915,8 +897,8 @@
}
// Create or update a scratch partition within super.
-static bool CreateDynamicScratch(const Fstab& fstab, std::string* scratch_device,
- bool* partition_exists, bool* change) {
+static bool CreateDynamicScratch(std::string* scratch_device, bool* partition_exists,
+ bool* change) {
const auto partition_name = android::base::Basename(kScratchMountPoint);
auto& dm = DeviceMapper::Instance();
@@ -925,8 +907,6 @@
auto partition_create = !*partition_exists;
auto slot_number = fs_mgr_overlayfs_slot_number();
auto super_device = fs_mgr_overlayfs_super_device(slot_number);
- if (!fs_mgr_rw_access(super_device)) return false;
- if (!fs_mgr_overlayfs_has_logical(fstab)) return false;
auto builder = MetadataBuilder::New(super_device, slot_number);
if (!builder) {
LERROR << "open " << super_device << " metadata";
@@ -1012,25 +992,33 @@
return true;
}
-bool fs_mgr_overlayfs_create_scratch(const Fstab& fstab, std::string* scratch_device,
- bool* partition_exists, bool* change) {
- auto strategy = GetScratchStrategy();
- if (strategy == ScratchStrategy::kDynamicPartition) {
- return CreateDynamicScratch(fstab, scratch_device, partition_exists, change);
- }
-
- // The scratch partition can only be landed on a physical partition if we
- // get here. If there are no viable candidates that are R/W, just return
- // that there is no device.
- *scratch_device = GetScratchDevice();
- if (scratch_device->empty()) {
- errno = ENXIO;
+static bool CanUseSuperPartition(const Fstab& fstab) {
+ auto slot_number = fs_mgr_overlayfs_slot_number();
+ auto super_device = fs_mgr_overlayfs_super_device(slot_number);
+ if (!fs_mgr_rw_access(super_device) || !fs_mgr_overlayfs_has_logical(fstab)) {
return false;
}
- *partition_exists = true;
return true;
}
+bool fs_mgr_overlayfs_create_scratch(const Fstab& fstab, std::string* scratch_device,
+ bool* partition_exists, bool* change) {
+ // Try a physical partition first.
+ *scratch_device = GetPhysicalScratchDevice();
+ if (!scratch_device->empty() && fs_mgr_rw_access(*scratch_device)) {
+ *partition_exists = true;
+ return true;
+ }
+
+ // If that fails, see if we can land on super.
+ if (CanUseSuperPartition(fstab)) {
+ return CreateDynamicScratch(scratch_device, partition_exists, change);
+ }
+
+ errno = ENXIO;
+ return false;
+}
+
// Create and mount kScratchMountPoint storage if we have logical partitions
bool fs_mgr_overlayfs_setup_scratch(const Fstab& fstab, bool* change) {
if (fs_mgr_overlayfs_already_mounted(kScratchMountPoint, false)) return true;
@@ -1120,7 +1108,12 @@
}
static void TryMountScratch() {
- auto scratch_device = GetScratchDevice();
+ // Note we get the boot scratch device here, which means if scratch was
+ // just created through ImageManager, this could fail. In practice this
+ // should not happen because "remount" detects this scenario (by checking
+ // if verity is still disabled, i.e. no reboot occurred), and skips calling
+ // fs_mgr_overlayfs_mount_all().
+ auto scratch_device = GetBootScratchDevice();
if (!fs_mgr_overlayfs_scratch_can_be_mounted(scratch_device)) {
return;
}
@@ -1166,11 +1159,23 @@
return {};
}
+ bool want_scratch = false;
for (const auto& entry : fs_mgr_overlayfs_candidate_list(*fstab)) {
- if (fs_mgr_is_verity_enabled(entry)) continue;
- if (fs_mgr_overlayfs_already_mounted(fs_mgr_mount_point(entry.mount_point))) continue;
- auto device = GetScratchDevice();
- if (!fs_mgr_overlayfs_scratch_can_be_mounted(device)) break;
+ if (fs_mgr_is_verity_enabled(entry)) {
+ continue;
+ }
+ if (fs_mgr_overlayfs_already_mounted(fs_mgr_mount_point(entry.mount_point))) {
+ continue;
+ }
+ want_scratch = true;
+ break;
+ }
+ if (!want_scratch) {
+ return {};
+ }
+
+ auto device = GetBootScratchDevice();
+ if (!device.empty()) {
return {device};
}
return {};
@@ -1241,25 +1246,39 @@
return ret;
}
-static bool GetAndMapScratchDeviceIfNeeded(std::string* device) {
- *device = GetScratchDevice();
+static bool GetAndMapScratchDeviceIfNeeded(std::string* device, bool* mapped) {
+ *mapped = false;
+ *device = GetBootScratchDevice();
if (!device->empty()) {
return true;
}
- auto strategy = GetScratchStrategy();
- if (strategy == ScratchStrategy::kDynamicPartition) {
- auto metadata_slot = fs_mgr_overlayfs_slot_number();
- CreateLogicalPartitionParams params = {
- .block_device = fs_mgr_overlayfs_super_device(metadata_slot),
- .metadata_slot = metadata_slot,
- .partition_name = android::base::Basename(kScratchMountPoint),
- .force_writable = true,
- .timeout_ms = 10s,
- };
- return CreateLogicalPartition(params, device);
+ // Avoid uart spam by first checking for a scratch partition.
+ auto metadata_slot = fs_mgr_overlayfs_slot_number();
+ auto super_device = fs_mgr_overlayfs_super_device(metadata_slot);
+ auto metadata = ReadCurrentMetadata(super_device);
+ if (!metadata) {
+ return false;
}
- return false;
+
+ auto partition_name = android::base::Basename(kScratchMountPoint);
+ auto partition = FindPartition(*metadata.get(), partition_name);
+ if (!partition) {
+ return false;
+ }
+
+ CreateLogicalPartitionParams params = {
+ .block_device = super_device,
+ .metadata = metadata.get(),
+ .partition = partition,
+ .force_writable = true,
+ .timeout_ms = 10s,
+ };
+ if (!CreateLogicalPartition(params, device)) {
+ return false;
+ }
+ *mapped = true;
+ return true;
}
// Returns false if teardown not permitted, errno set to last error.
@@ -1267,12 +1286,14 @@
bool fs_mgr_overlayfs_teardown(const char* mount_point, bool* change) {
if (change) *change = false;
auto ret = true;
+
// If scratch exists, but is not mounted, lets gain access to clean
// specific override entries.
auto mount_scratch = false;
+ bool unmap = false;
if ((mount_point != nullptr) && !fs_mgr_overlayfs_already_mounted(kScratchMountPoint, false)) {
std::string scratch_device;
- if (GetAndMapScratchDeviceIfNeeded(&scratch_device)) {
+ if (GetAndMapScratchDeviceIfNeeded(&scratch_device, &unmap)) {
mount_scratch = fs_mgr_overlayfs_mount_scratch(scratch_device,
fs_mgr_overlayfs_scratch_mount_type());
}
@@ -1294,8 +1315,12 @@
PERROR << "teardown";
ret = false;
}
- if (mount_scratch) fs_mgr_overlayfs_umount_scratch();
-
+ if (mount_scratch) {
+ fs_mgr_overlayfs_umount_scratch();
+ }
+ if (unmap) {
+ DestroyLogicalPartition(android::base::Basename(kScratchMountPoint));
+ }
return ret;
}
diff --git a/fs_mgr/tests/AndroidTest.xml b/fs_mgr/tests/AndroidTest.xml
index 91c3fb9..0ff8995 100644
--- a/fs_mgr/tests/AndroidTest.xml
+++ b/fs_mgr/tests/AndroidTest.xml
@@ -15,6 +15,7 @@
<option name="config-descriptor:metadata" key="component" value="systems" />
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
+ <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
<option name="cleanup" value="true" />
<option name="push" value="CtsFsMgrTestCases->/data/local/tmp/CtsFsMgrTestCases" />
diff --git a/init/AndroidTest.xml b/init/AndroidTest.xml
index 667911d..920dc6c 100644
--- a/init/AndroidTest.xml
+++ b/init/AndroidTest.xml
@@ -18,6 +18,7 @@
<option name="config-descriptor:metadata" key="component" value="systems" />
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+ <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
<option name="cleanup" value="true" />
<option name="push" value="CtsInitTestCases->/data/local/tmp/CtsInitTestCases" />
diff --git a/init/builtins.cpp b/init/builtins.cpp
index 3c32d8b..2a6df84 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -60,6 +60,7 @@
#include <fscrypt/fscrypt.h>
#include <libgsi/libgsi.h>
#include <logwrap/logwrap.h>
+#include <private/android_filesystem_config.h>
#include <selinux/android.h>
#include <selinux/label.h>
#include <selinux/selinux.h>
@@ -1179,7 +1180,7 @@
static Result<void> GenerateLinkerConfiguration() {
const char* linkerconfig_binary = "/system/bin/linkerconfig";
- const char* linkerconfig_target = "/linkerconfig/ld.config.txt";
+ const char* linkerconfig_target = "/linkerconfig";
const char* arguments[] = {linkerconfig_binary, "--target", linkerconfig_target};
if (logwrap_fork_execvp(arraysize(arguments), arguments, nullptr, false, LOG_KLOG, false,
@@ -1187,11 +1188,6 @@
return ErrnoError() << "failed to execute linkerconfig";
}
- mode_t mode = get_mode("0444");
- if (fchmodat(AT_FDCWD, linkerconfig_target, mode, AT_SYMLINK_NOFOLLOW) < 0) {
- return ErrnoErrorIgnoreEnoent() << "fchmodat() failed";
- }
-
LOG(INFO) << "linkerconfig generated " << linkerconfig_target
<< " with mounted APEX modules info";
@@ -1271,9 +1267,7 @@
if (strchr(name, '@') != nullptr) continue;
auto path = "/data/misc/apexdata/" + std::string(name);
- auto system_uid = DecodeUid("system");
- auto options =
- MkdirOptions{path, 0700, *system_uid, *system_uid, FscryptAction::kNone, "ref"};
+ auto options = MkdirOptions{path, 0770, AID_ROOT, AID_SYSTEM, FscryptAction::kNone, "ref"};
make_dir_with_options(options);
}
return {};
diff --git a/liblog/tests/AndroidTest.xml b/liblog/tests/AndroidTest.xml
index c167478..fcb46b1 100644
--- a/liblog/tests/AndroidTest.xml
+++ b/liblog/tests/AndroidTest.xml
@@ -18,6 +18,7 @@
<option name="config-descriptor:metadata" key="component" value="systems" />
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
+ <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
<option name="cleanup" value="true" />
<option name="push" value="CtsLiblogTestCases->/data/local/tmp/CtsLiblogTestCases" />
diff --git a/libstats/socket/Android.bp b/libstats/socket/Android.bp
index 94c405d..3b6efbb 100644
--- a/libstats/socket/Android.bp
+++ b/libstats/socket/Android.bp
@@ -40,6 +40,14 @@
"libcutils",
"liblog",
],
+
+ // enumerate stable entry points for APEX use
+ stubs: {
+ symbol_file: "libstatssocket.map.txt",
+ versions: [
+ "1",
+ ],
+ }
}
cc_library_headers {
diff --git a/libstats/socket/libstatssocket.map.txt b/libstats/socket/libstatssocket.map.txt
new file mode 100644
index 0000000..55bfbda
--- /dev/null
+++ b/libstats/socket/libstatssocket.map.txt
@@ -0,0 +1,23 @@
+LIBSTATSSOCKET {
+ global:
+ stats_event_obtain; # apex # introduced=1
+ stats_event_build; # apex # introduced=1
+ stats_event_write; # apex # introduced=1
+ stats_event_release; # apex # introduced=1
+ stats_event_set_atom_id; # apex # introduced=1
+ stats_event_write_int32; # apex # introduced=1
+ stats_event_write_int64; # apex # introduced=1
+ stats_event_write_float; # apex # introduced=1
+ stats_event_write_bool; # apex # introduced=1
+ stats_event_write_byte_array; # apex # introduced=1
+ stats_event_write_string8; # apex # introduced=1
+ stats_event_write_attribution_chain; # apex # introduced=1
+ stats_event_write_key_value_pairs; # apex # introduced=1
+ stats_event_add_bool_annotation; # apex # introduced=1
+ stats_event_add_int32_annotation; # apex # introduced=1
+ stats_event_get_atom_id; # apex # introduced=1
+ stats_event_get_buffer; # apex # introduced=1
+ stats_event_get_errors; # apex # introduced=1
+ local:
+ *;
+};
diff --git a/logd/tests/AndroidTest.xml b/logd/tests/AndroidTest.xml
index 9a18edb..a25dc44 100644
--- a/logd/tests/AndroidTest.xml
+++ b/logd/tests/AndroidTest.xml
@@ -18,6 +18,7 @@
<option name="config-descriptor:metadata" key="component" value="systems" />
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
+ <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
<option name="cleanup" value="true" />
<option name="push" value="CtsLogdTestCases->/data/local/tmp/CtsLogdTestCases" />
diff --git a/rootdir/init.rc b/rootdir/init.rc
index fdfcde8..7a3339d 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -43,7 +43,7 @@
mkdir /linkerconfig/default 0755
# Generate ld.config.txt for early executed processes
- exec -- /system/bin/linkerconfig --target /linkerconfig/bootstrap/ld.config.txt
+ exec -- /system/bin/linkerconfig --target /linkerconfig/bootstrap
chmod 644 /linkerconfig/bootstrap/ld.config.txt
copy /linkerconfig/bootstrap/ld.config.txt /linkerconfig/default/ld.config.txt
chmod 644 /linkerconfig/default/ld.config.txt
@@ -983,6 +983,7 @@
setprop sys.init.updatable_crashing_process_name ""
setprop apexd.status ""
setprop sys.user.0.ce_available ""
+ setprop sys.shutdown.requested ""
on userspace-reboot-fs-remount
# Make sure that vold is running.
diff --git a/trusty/storage/proxy/proxy.c b/trusty/storage/proxy/proxy.c
index 5f56408..e230941 100644
--- a/trusty/storage/proxy/proxy.c
+++ b/trusty/storage/proxy/proxy.c
@@ -48,6 +48,8 @@
return VIRT_RPMB;
} else if (!strcmp(dev_type_name, "sock")) {
return SOCK_RPMB;
+ } else if (!strcmp(dev_type_name, "ufs")) {
+ return UFS_RPMB;
} else {
return UNKNOWN_RPMB;
}