Merge "Handle with the nonnull case in a tricky way"
diff --git a/debuggerd/crash_dump.cpp b/debuggerd/crash_dump.cpp
index cf4c5d5..3563436 100644
--- a/debuggerd/crash_dump.cpp
+++ b/debuggerd/crash_dump.cpp
@@ -142,7 +142,8 @@
return false;
}
-static bool activity_manager_notify(pid_t pid, int signal, const std::string& amfd_data) {
+static bool activity_manager_notify(pid_t pid, int signal, const std::string& amfd_data,
+ bool recoverable_gwp_asan_crash) {
ATRACE_CALL();
android::base::unique_fd amfd(socket_local_client(
"/data/system/ndebugsocket", ANDROID_SOCKET_NAMESPACE_FILESYSTEM, SOCK_STREAM));
@@ -165,19 +166,32 @@
return false;
}
- // Activity Manager protocol: binary 32-bit network-byte-order ints for the
- // pid and signal number, followed by the raw text of the dump, culminating
- // in a zero byte that marks end-of-data.
+ // Activity Manager protocol:
+ // - 32-bit network-byte-order: pid
+ // - 32-bit network-byte-order: signal number
+ // - byte: recoverable_gwp_asan_crash
+ // - bytes: raw text of the dump
+ // - null terminator
+
uint32_t datum = htonl(pid);
- if (!android::base::WriteFully(amfd, &datum, 4)) {
+ if (!android::base::WriteFully(amfd, &datum, sizeof(datum))) {
PLOG(ERROR) << "AM pid write failed";
return false;
}
+
datum = htonl(signal);
- if (!android::base::WriteFully(amfd, &datum, 4)) {
- PLOG(ERROR) << "AM signal write failed";
+ if (!android::base::WriteFully(amfd, &datum, sizeof(datum))) {
+ PLOG(ERROR) << "AM signo write failed";
return false;
}
+
+ uint8_t recoverable_gwp_asan_crash_byte = recoverable_gwp_asan_crash ? 1 : 0;
+ if (!android::base::WriteFully(amfd, &recoverable_gwp_asan_crash_byte,
+ sizeof(recoverable_gwp_asan_crash_byte))) {
+ PLOG(ERROR) << "AM recoverable_gwp_asan_crash_byte write failed";
+ return false;
+ }
+
if (!android::base::WriteFully(amfd, amfd_data.c_str(), amfd_data.size() + 1)) {
PLOG(ERROR) << "AM data write failed";
return false;
@@ -651,10 +665,10 @@
}
}
- if (fatal_signal && !recoverable_gwp_asan_crash) {
+ if (fatal_signal) {
// Don't try to notify ActivityManager if it just crashed, or we might hang until timeout.
if (thread_info[target_process].thread_name != "system_server") {
- activity_manager_notify(target_process, signo, amfd_data);
+ activity_manager_notify(target_process, signo, amfd_data, recoverable_gwp_asan_crash);
}
}
diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp
index e76cbc5..b977e31 100644
--- a/fastboot/fastboot.cpp
+++ b/fastboot/fastboot.cpp
@@ -1197,7 +1197,8 @@
}
static void copy_avb_footer(const std::string& partition, struct fastboot_buffer* buf) {
- if (buf->sz < AVB_FOOTER_SIZE || is_logical(partition)) {
+ if (buf->sz < AVB_FOOTER_SIZE || is_logical(partition) ||
+ should_flash_in_userspace(partition)) {
return;
}
// If overflows and negative, it should be < buf->sz.
@@ -1559,10 +1560,10 @@
}
}
-std::string GetPartitionName(const ImageEntry& entry, std::string& current_slot) {
+std::string GetPartitionName(const ImageEntry& entry) {
auto slot = entry.second;
if (slot.empty()) {
- slot = current_slot;
+ slot = get_current_slot();
}
if (slot.empty()) {
return entry.first->part_name;
@@ -1581,7 +1582,7 @@
private:
void CheckRequirements();
- void DetermineSlot();
+ void DetermineSecondarySlot();
void CollectImages();
void FlashImages(const std::vector<std::pair<const Image*, std::string>>& images);
void FlashImage(const Image& image, const std::string& slot, fastboot_buffer* buf);
@@ -1599,15 +1600,13 @@
// Change the slot first, so we boot into the correct recovery image when
// using fastbootd.
- if (fp_->slot == "all") {
+ if (fp_->slot_override == "all") {
set_active("a");
} else {
- set_active(fp_->slot);
+ set_active(fp_->slot_override);
}
- DetermineSlot();
- CollectImages();
-
+ DetermineSecondarySlot();
CancelSnapshotIfNeeded();
// First flash boot partitions. We allow this to happen either in userspace
@@ -1652,18 +1651,12 @@
::CheckRequirements({contents.data(), contents.size()}, fp_->force_flash);
}
-void FlashAllTool::DetermineSlot() {
- if (fp_->slot.empty()) {
- fp_->current_slot = get_current_slot();
- } else {
- fp_->current_slot = fp_->slot;
- }
-
+void FlashAllTool::DetermineSecondarySlot() {
if (fp_->skip_secondary) {
return;
}
- if (fp_->slot != "" && fp_->slot != "all") {
- fp_->secondary_slot = get_other_slot(fp_->slot);
+ if (fp_->slot_override != "" && fp_->slot_override != "all") {
+ fp_->secondary_slot = get_other_slot(fp_->slot_override);
} else {
fp_->secondary_slot = get_other_slot();
}
@@ -1677,7 +1670,7 @@
void FlashAllTool::CollectImages() {
for (size_t i = 0; i < images.size(); ++i) {
- std::string slot = fp_->slot;
+ std::string slot = fp_->slot_override;
if (images[i].IsSecondary()) {
if (fp_->skip_secondary) {
continue;
diff --git a/fastboot/fastboot.h b/fastboot/fastboot.h
index c954487..029b583 100644
--- a/fastboot/fastboot.h
+++ b/fastboot/fastboot.h
@@ -80,8 +80,7 @@
bool skip_secondary = false;
bool force_flash = false;
- std::string slot;
- std::string current_slot;
+ std::string slot_override;
std::string secondary_slot;
fastboot::FastBootDriver* fb;
};
@@ -103,7 +102,7 @@
Result<NetworkSerial, FastbootError> ParseNetworkSerial(const std::string& serial);
bool supports_AB();
-std::string GetPartitionName(const ImageEntry& entry, std::string& current_slot_);
+std::string GetPartitionName(const ImageEntry& entry);
void flash_partition_files(const std::string& partition, const std::vector<SparsePtr>& files);
int64_t get_sparse_limit(int64_t size);
std::vector<SparsePtr> resparse_file(sparse_file* s, int64_t max_size);
diff --git a/fastboot/task.cpp b/fastboot/task.cpp
index 9268b29..3d2c975 100644
--- a/fastboot/task.cpp
+++ b/fastboot/task.cpp
@@ -95,7 +95,7 @@
LOG(VERBOSE) << "Cannot optimize flashing super on non-AB device";
return nullptr;
}
- if (fp->slot == "all") {
+ if (fp->slot_override == "all") {
LOG(VERBOSE) << "Cannot optimize flashing super for all slots";
return nullptr;
}
@@ -132,7 +132,7 @@
}
for (const auto& entry : os_images) {
- auto partition = GetPartitionName(entry, fp->current_slot);
+ auto partition = GetPartitionName(entry);
auto image = entry.first;
if (!helper->AddPartition(partition, image->img_name, image->optional_if_no_image)) {
@@ -145,7 +145,7 @@
// Remove images that we already flashed, just in case we have non-dynamic OS images.
auto remove_if_callback = [&](const ImageEntry& entry) -> bool {
- return helper->WillFlash(GetPartitionName(entry, fp->current_slot));
+ return helper->WillFlash(GetPartitionName(entry));
};
os_images.erase(std::remove_if(os_images.begin(), os_images.end(), remove_if_callback),
os_images.end());
@@ -201,9 +201,13 @@
void WipeTask::Run() {
std::string partition_type;
if (fp_->fb->GetVar("partition-type:" + pname_, &partition_type) != fastboot::SUCCESS) {
+ LOG(ERROR) << "wipe task partition not found: " << pname_;
return;
}
if (partition_type.empty()) return;
- fp_->fb->Erase(pname_);
+ if (fp_->fb->Erase(pname_) != fastboot::SUCCESS) {
+ LOG(ERROR) << "wipe task erase failed with partition: " << pname_;
+ return;
+ }
fb_perform_format(pname_, 1, partition_type, "", fp_->fs_options);
}
diff --git a/libprocessgroup/processgroup.cpp b/libprocessgroup/processgroup.cpp
index f7af08b..38eb92f 100644
--- a/libprocessgroup/processgroup.cpp
+++ b/libprocessgroup/processgroup.cpp
@@ -446,14 +446,9 @@
static int KillProcessGroup(uid_t uid, int initialPid, int signal, int retries,
int* max_processes) {
- if (uid < 0) {
- LOG(ERROR) << __func__ << ": invalid UID " << uid;
- return -1;
- }
- if (initialPid <= 0) {
- LOG(ERROR) << __func__ << ": invalid PID " << initialPid;
- return -1;
- }
+ CHECK_GE(uid, 0);
+ CHECK_GT(initialPid, 0);
+
std::string hierarchy_root_path;
if (CgroupsAvailable()) {
CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &hierarchy_root_path);
@@ -590,7 +585,8 @@
}
int createProcessGroup(uid_t uid, int initialPid, bool memControl) {
- std::string cgroup;
+ CHECK_GE(uid, 0);
+ CHECK_GT(initialPid, 0);
if (memControl && !UsePerAppMemcg()) {
PLOG(ERROR) << "service memory controls are used without per-process memory cgroup support";
@@ -608,6 +604,7 @@
}
}
+ std::string cgroup;
CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cgroup);
return createProcessGroupInternal(uid, initialPid, cgroup, true);
}