diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-06 01:10:45 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-06 01:10:45 +0000 |
commit | 004dd384b19c962cc23e18c1bfa85cd8d1ac2fa1 (patch) | |
tree | 78cadbb95d8ecf7a181d8934e05dc1185ea606b4 | |
parent | b8aff82869a936f63bdf4361a9e1016318bc822d (diff) | |
parent | 1f83bd3f4e0fdd6fc4dbe7a41f0052ae29598bf6 (diff) | |
download | gsid-004dd384b19c962cc23e18c1bfa85cd8d1ac2fa1.tar.gz |
Snap for 8408164 from 1f83bd3f4e0fdd6fc4dbe7a41f0052ae29598bf6 to tm-releaseandroid-vts-13.0_r1android-security-13.0.0_r9android-security-13.0.0_r8android-security-13.0.0_r7android-security-13.0.0_r6android-security-13.0.0_r5android-security-13.0.0_r4android-security-13.0.0_r3android-security-13.0.0_r2android-security-13.0.0_r19android-security-13.0.0_r18android-security-13.0.0_r17android-security-13.0.0_r16android-security-13.0.0_r15android-security-13.0.0_r14android-security-13.0.0_r13android-security-13.0.0_r12android-security-13.0.0_r11android-security-13.0.0_r10android-security-13.0.0_r1android-platform-13.0.0_r2android-platform-13.0.0_r1android-cts-13.0_r1android-13.0.0_r8android-13.0.0_r7android-13.0.0_r6android-13.0.0_r5android-13.0.0_r4android-13.0.0_r31android-13.0.0_r3android-13.0.0_r2android-13.0.0_r12android-13.0.0_r1android13-security-releaseandroid13-s3-releaseandroid13-s2-releaseandroid13-s1-releaseandroid13-release
Change-Id: Icc5b85c20ab19a16dccd4961cd725387703fafc6
-rw-r--r-- | aidl/android/gsi/IGsiService.aidl | 6 | ||||
-rw-r--r-- | gsi_service.cpp | 74 | ||||
-rw-r--r-- | gsi_service.h | 2 |
3 files changed, 39 insertions, 43 deletions
diff --git a/aidl/android/gsi/IGsiService.aidl b/aidl/android/gsi/IGsiService.aidl index c889987..3b5d6c0 100644 --- a/aidl/android/gsi/IGsiService.aidl +++ b/aidl/android/gsi/IGsiService.aidl @@ -74,8 +74,10 @@ interface IGsiService { boolean commitGsiChunkFromAshmem(long bytes); /** - * Complete a GSI installation and mark it as bootable. The caller is - * responsible for rebooting the device as soon as possible. + * Mark a completed DSU installation as bootable. The caller is responsible + * for rebooting the device as soon as possible. + * + * Could leave the installation in "disabled" state if failure. * * @param oneShot If true, the GSI will boot once and then disable itself. * It can still be re-enabled again later with setGsiBootable. diff --git a/gsi_service.cpp b/gsi_service.cpp index 122bbf6..3392a1d 100644 --- a/gsi_service.cpp +++ b/gsi_service.cpp @@ -314,12 +314,10 @@ binder::Status GsiService::setGsiAshmem(const ::android::os::ParcelFileDescripto binder::Status GsiService::enableGsiAsync(bool one_shot, const std::string& dsuSlot, const sp<IGsiServiceCallback>& resultCallback) { - int result; - auto status = enableGsi(one_shot, dsuSlot, &result); - if (!status.isOk()) { - LOG(ERROR) << "Could not enableGsi: " << status.exceptionMessage().string(); - result = IGsiService::INSTALL_ERROR_GENERIC; - } + ENFORCE_SYSTEM_OR_SHELL; + std::lock_guard<std::mutex> guard(lock_); + + const auto result = EnableGsi(one_shot, dsuSlot); resultCallback->onResult(result); return binder::Status::ok(); } @@ -328,20 +326,7 @@ binder::Status GsiService::enableGsi(bool one_shot, const std::string& dsuSlot, ENFORCE_SYSTEM_OR_SHELL; std::lock_guard<std::mutex> guard(lock_); - if (!WriteStringToFile(dsuSlot, kDsuActiveFile)) { - PLOG(ERROR) << "write failed: " << GetDsuSlot(install_dir_); - *_aidl_return = INSTALL_ERROR_GENERIC; - return binder::Status::ok(); - } - RestoreconMetadataFiles(); - - if (installer_) { - LOG(ERROR) << "cannot enable an ongoing installation, was closeInstall() called?"; - *_aidl_return = IGsiService::INSTALL_ERROR_GENERIC; - return binder::Status::ok(); - } - - *_aidl_return = ReenableGsi(one_shot); + *_aidl_return = EnableGsi(one_shot, dsuSlot); return binder::Status::ok(); } @@ -946,26 +931,6 @@ std::string GsiService::GetInstalledImageDir() { return kDefaultDsuImageFolder; } -int GsiService::ReenableGsi(bool one_shot) { - if (!android::gsi::IsGsiInstalled()) { - LOG(ERROR) << "no gsi installed - cannot re-enable"; - return INSTALL_ERROR_GENERIC; - } - std::string boot_key; - if (!GetInstallStatus(&boot_key)) { - PLOG(ERROR) << "read " << kDsuInstallStatusFile; - return INSTALL_ERROR_GENERIC; - } - if (boot_key != kInstallStatusDisabled) { - LOG(ERROR) << "GSI is not currently disabled"; - return INSTALL_ERROR_GENERIC; - } - if (!SetBootMode(one_shot) || !ResetBootAttemptCounter()) { - return IGsiService::INSTALL_ERROR_GENERIC; - } - return IGsiService::INSTALL_OK; -} - static android::sp<android::os::IVold> GetVoldService() { return android::waitForService<android::os::IVold>(android::String16("vold")); } @@ -1021,6 +986,35 @@ bool GsiService::RemoveGsiFiles(const std::string& install_dir) { return ok; } +int GsiService::EnableGsi(bool one_shot, const std::string& dsu_slot) { + if (!android::gsi::IsGsiInstalled()) { + LOG(ERROR) << "no gsi installed - cannot enable"; + return IGsiService::INSTALL_ERROR_GENERIC; + } + if (installer_) { + LOG(ERROR) << "cannot enable an ongoing installation, was closeInstall() called?"; + return IGsiService::INSTALL_ERROR_GENERIC; + } + + if (!DisableGsi()) { + PLOG(ERROR) << "cannot write DSU status file"; + return IGsiService::INSTALL_ERROR_GENERIC; + } + if (!SetBootMode(one_shot)) { + return IGsiService::INSTALL_ERROR_GENERIC; + } + if (!ResetBootAttemptCounter()) { + return IGsiService::INSTALL_ERROR_GENERIC; + } + + if (!WriteStringToFile(dsu_slot, kDsuActiveFile)) { + PLOG(ERROR) << "cannot write active DSU slot (" << dsu_slot << "): " << kDsuActiveFile; + return IGsiService::INSTALL_ERROR_GENERIC; + } + RestoreconMetadataFiles(); + return IGsiService::INSTALL_OK; +} + bool GsiService::DisableGsiInstall() { if (!android::gsi::IsGsiInstalled()) { LOG(ERROR) << "cannot disable gsi install - no install detected"; diff --git a/gsi_service.h b/gsi_service.h index 0ec7620..c50c101 100644 --- a/gsi_service.h +++ b/gsi_service.h @@ -92,8 +92,8 @@ class GsiService : public BinderService<GsiService>, public BnGsiService { GsiService(); static int ValidateInstallParams(std::string& install_dir); + int EnableGsi(bool one_shot, const std::string& dsu_slot); bool DisableGsiInstall(); - int ReenableGsi(bool one_shot); static void CleanCorruptedInstallation(); static int SaveInstallation(const std::string&); static bool IsInstallationComplete(const std::string&); |