Detect if update is already running when updating with file descriptor am: b00089bc16
Original change: https://android-review.googlesource.com/c/platform/system/update_engine/+/1570540
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: I6edf590556303f5e50bafc927ce229aa2ed38ef0
diff --git a/aosp/update_attempter_android.cc b/aosp/update_attempter_android.cc
index 5c66141..79840e8 100644
--- a/aosp/update_attempter_android.cc
+++ b/aosp/update_attempter_android.cc
@@ -182,7 +182,7 @@
return LogAndSetError(
error, FROM_HERE, "Already processing an update, cancel it first.");
}
- DCHECK(status_ == UpdateStatus::IDLE);
+ DCHECK_EQ(status_, UpdateStatus::IDLE);
std::map<string, string> headers;
if (!ParseKeyValuePairHeaders(key_value_pair_headers, &headers, error)) {
@@ -318,6 +318,18 @@
int64_t payload_size,
const vector<string>& key_value_pair_headers,
brillo::ErrorPtr* error) {
+ // update_engine state must be checked before modifying payload_fd_ otherwise
+ // already running update will be terminated (existing file descriptor will be closed)
+ if (status_ == UpdateStatus::UPDATED_NEED_REBOOT) {
+ return LogAndSetError(
+ error, FROM_HERE, "An update already applied, waiting for reboot");
+ }
+ if (processor_->IsRunning()) {
+ return LogAndSetError(
+ error, FROM_HERE, "Already processing an update, cancel it first.");
+ }
+ DCHECK_EQ(status_, UpdateStatus::IDLE);
+
payload_fd_.reset(dup(fd));
const string payload_url = "fd://" + std::to_string(payload_fd_.get());