Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 23 additions & 9 deletions debuggerd/crash_dump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ static bool ptrace_interrupt(pid_t tid, int* received_signal) {
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));
Expand All @@ -165,19 +166,32 @@ static bool activity_manager_notify(pid_t pid, int signal, const std::string& am
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;
Expand Down Expand Up @@ -651,10 +665,10 @@ int main(int argc, char** argv) {
}
}

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);
}
}

Expand Down
31 changes: 12 additions & 19 deletions fastboot/fastboot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1197,7 +1197,8 @@ static uint64_t get_partition_size(const std::string& partition) {
}

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.
Expand Down Expand Up @@ -1559,10 +1560,10 @@ static void CancelSnapshotIfNeeded() {
}
}

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;
Expand All @@ -1581,7 +1582,7 @@ class FlashAllTool {

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);
Expand All @@ -1599,15 +1600,13 @@ void FlashAllTool::Flash() {

// 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
Expand Down Expand Up @@ -1652,18 +1651,12 @@ void FlashAllTool::CheckRequirements() {
::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();
}
Expand All @@ -1677,7 +1670,7 @@ void FlashAllTool::DetermineSlot() {

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;
Expand Down
5 changes: 2 additions & 3 deletions fastboot/fastboot.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,7 @@ struct FlashingPlan {
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;
};
Expand All @@ -103,7 +102,7 @@ struct NetworkSerial {

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);
Expand Down
12 changes: 8 additions & 4 deletions fastboot/task.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ std::unique_ptr<FlashSuperLayoutTask> FlashSuperLayoutTask::Initialize(
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;
}
Expand Down Expand Up @@ -132,7 +132,7 @@ std::unique_ptr<FlashSuperLayoutTask> FlashSuperLayoutTask::Initialize(
}

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)) {
Expand All @@ -145,7 +145,7 @@ std::unique_ptr<FlashSuperLayoutTask> FlashSuperLayoutTask::Initialize(

// 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());
Expand Down Expand Up @@ -201,9 +201,13 @@ WipeTask::WipeTask(FlashingPlan* fp, const std::string& pname) : fp_(fp), pname_
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);
}
15 changes: 6 additions & 9 deletions libprocessgroup/processgroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -446,14 +446,9 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid,

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);
Expand Down Expand Up @@ -590,7 +585,8 @@ static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgr
}

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";
Expand All @@ -608,6 +604,7 @@ int createProcessGroup(uid_t uid, int initialPid, bool memControl) {
}
}

std::string cgroup;
CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cgroup);
return createProcessGroupInternal(uid, initialPid, cgroup, true);
}
Expand Down
5 changes: 5 additions & 0 deletions libstats/expresslog/Histogram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,10 @@ void Histogram::logSample(float sample) const {
stats_write(EXPRESS_HISTOGRAM_SAMPLE_REPORTED, mMetricIdHash, /*count*/ 1, binIndex);
}

void Histogram::logSampleWithUid(int32_t uid, float sample) const {
const int binIndex = mBinOptions->getBinForSample(sample);
stats_write(EXPRESS_UID_HISTOGRAM_SAMPLE_REPORTED, mMetricIdHash, /*count*/ 1, binIndex, uid);
}

} // namespace expresslog
} // namespace android
5 changes: 5 additions & 0 deletions libstats/expresslog/include/Histogram.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ class Histogram final {
*/
void logSample(float sample) const;

/**
* Logs increment sample count for automatically calculated bin with uid
*/
void logSampleWithUid(int32_t uid, float sample) const;

private:
const int64_t mMetricIdHash;
const std::shared_ptr<BinOptions> mBinOptions;
Expand Down