diff options
-rw-r--r-- | cmds/dumpstate/DumpstateService.cpp | 7 | ||||
-rw-r--r-- | cmds/dumpstate/dumpstate.cpp | 19 | ||||
-rw-r--r-- | cmds/dumpstate/dumpstate.h | 5 |
3 files changed, 23 insertions, 8 deletions
diff --git a/cmds/dumpstate/DumpstateService.cpp b/cmds/dumpstate/DumpstateService.cpp index a0b9cbbe20..1824943eb2 100644 --- a/cmds/dumpstate/DumpstateService.cpp +++ b/cmds/dumpstate/DumpstateService.cpp @@ -148,14 +148,13 @@ binder::Status DumpstateService::startBugreport(int32_t calling_uid, } binder::Status DumpstateService::cancelBugreport() { - // This is a no-op since the cancellation is done from java side via setting sys properties. - // See BugreportManagerServiceImpl. - // TODO(b/111441001): maybe make native and java sides use different binder interface - // to avoid these annoyances. + std::lock_guard<std::mutex> lock(lock_); + ds_->Cancel(); return binder::Status::ok(); } status_t DumpstateService::dump(int fd, const Vector<String16>&) { + std::lock_guard<std::mutex> lock(lock_); if (ds_ == nullptr) { dprintf(fd, "Bugreport not in progress yet"); return NO_ERROR; diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp index ec2b92255f..83a34a3af2 100644 --- a/cmds/dumpstate/dumpstate.cpp +++ b/cmds/dumpstate/dumpstate.cpp @@ -239,6 +239,9 @@ static bool CopyFileToFd(const std::string& input_file, int out_fd) { } static bool UnlinkAndLogOnError(const std::string& file) { + if (file.empty()) { + return false; + } if (unlink(file.c_str())) { MYLOGE("Failed to unlink file (%s): %s\n", file.c_str(), strerror(errno)); return false; @@ -246,7 +249,6 @@ static bool UnlinkAndLogOnError(const std::string& file) { return true; } - int64_t GetModuleMetadataVersion() { auto binder = defaultServiceManager()->getService(android::String16("package_native")); if (binder == nullptr) { @@ -2419,6 +2421,17 @@ Dumpstate::RunStatus Dumpstate::Run(int32_t calling_uid, const std::string& call return status; } +void Dumpstate::Cancel() { + CleanupTmpFiles(); + android::os::UnlinkAndLogOnError(log_path_); + for (int i = 0; i < NUM_OF_DUMPS; i++) { + android::os::UnlinkAndLogOnError(ds.bugreport_internal_dir_ + "/" + + kDumpstateBoardFiles[i]); + } + tombstone_data_.clear(); + anr_data_.clear(); +} + /* * Dumps relevant information to a bugreport based on the given options. * @@ -2755,7 +2768,7 @@ bool Dumpstate::CalledByApi() const { return ds.options_->bugreport_fd.get() != -1 ? true : false; } -void Dumpstate::CleanupFiles() { +void Dumpstate::CleanupTmpFiles() { android::os::UnlinkAndLogOnError(tmp_path_); android::os::UnlinkAndLogOnError(screenshot_path_); android::os::UnlinkAndLogOnError(path_); @@ -2763,7 +2776,7 @@ void Dumpstate::CleanupFiles() { Dumpstate::RunStatus Dumpstate::HandleUserConsentDenied() { MYLOGD("User denied consent; deleting files and returning\n"); - CleanupFiles(); + CleanupTmpFiles(); return USER_CONSENT_DENIED; } diff --git a/cmds/dumpstate/dumpstate.h b/cmds/dumpstate/dumpstate.h index 7b8d2821e5..9ce662b255 100644 --- a/cmds/dumpstate/dumpstate.h +++ b/cmds/dumpstate/dumpstate.h @@ -334,6 +334,9 @@ class Dumpstate { RunStatus ParseCommandlineAndRun(int argc, char* argv[]); + /* Deletes in-progress files */ + void Cancel(); + /* Sets runtime options. */ void SetOptions(std::unique_ptr<DumpOptions> options); @@ -502,7 +505,7 @@ class Dumpstate { // Removes the in progress files output files (tmp file, zip/txt file, screenshot), // but leaves the log file alone. - void CleanupFiles(); + void CleanupTmpFiles(); RunStatus HandleUserConsentDenied(); |