From 406a6ff5e69fc037506d4f4a90a4f2d27b94acce Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Mon, 30 Apr 2018 10:05:57 -0700 Subject: recovery: Fix the return value when failing to convert to FBE. Test: Build and flash aosp_angler-userdebug. Choose 'Convert to file encryption' from Developer Options. Converting to FBE still works. Change-Id: I75ac0e266af2d00bfaff0664f8bcee74a5f16b41 --- recovery.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/recovery.cpp b/recovery.cpp index d7bbb13d3..9ee243d9c 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -86,8 +86,6 @@ static const char *COMMAND_FILE = "/cache/recovery/command"; static const char *LOG_FILE = "/cache/recovery/log"; static const char *LAST_INSTALL_FILE = "/cache/recovery/last_install"; static const char *LOCALE_FILE = "/cache/recovery/last_locale"; -static const char *CONVERT_FBE_DIR = "/tmp/convert_fbe"; -static const char *CONVERT_FBE_FILE = "/tmp/convert_fbe/convert_fbe"; static const char *CACHE_ROOT = "/cache"; static const char *DATA_ROOT = "/data"; static const char* METADATA_ROOT = "/metadata"; @@ -551,16 +549,18 @@ static bool erase_volume(const char* volume) { int result; if (is_data && reason && strcmp(reason, "convert_fbe") == 0) { - // Create convert_fbe breadcrumb file to signal to init - // to convert to file based encryption, not full disk encryption + static constexpr const char* CONVERT_FBE_DIR = "/tmp/convert_fbe"; + static constexpr const char* CONVERT_FBE_FILE = "/tmp/convert_fbe/convert_fbe"; + // Create convert_fbe breadcrumb file to signal init to convert to file based encryption, not + // full disk encryption. if (mkdir(CONVERT_FBE_DIR, 0700) != 0) { - ui->Print("Failed to make convert_fbe dir %s\n", strerror(errno)); - return true; + PLOG(ERROR) << "Failed to mkdir " << CONVERT_FBE_DIR; + return false; } FILE* f = fopen(CONVERT_FBE_FILE, "wbe"); if (!f) { - ui->Print("Failed to convert to file encryption %s\n", strerror(errno)); - return true; + PLOG(ERROR) << "Failed to convert to file encryption"; + return false; } fclose(f); result = format_volume(volume, CONVERT_FBE_DIR); -- cgit v1.2.3 From aac9d9fcf8fea7bffa69746f1a34d0ffa555868b Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Sun, 29 Apr 2018 23:38:59 -0700 Subject: recovery: Move a few constants closer to their uses. Test: mmma -j bootable/recovery Change-Id: I78839ed487ef41b4eaa3787cb7b4bf33fb0d164a --- recovery.cpp | 101 ++++++++++++++++++++++++++++------------------------------- 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/recovery.cpp b/recovery.cpp index 9ee243d9c..d2b3eb516 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -75,28 +75,18 @@ #include "stub_ui.h" #include "ui.h" -// More bootreasons can be found in "system/core/bootstat/bootstat.cpp". -static const std::vector bootreason_blacklist { - "kernel_panic", - "Panic", -}; - -static const char *CACHE_LOG_DIR = "/cache/recovery"; -static const char *COMMAND_FILE = "/cache/recovery/command"; -static const char *LOG_FILE = "/cache/recovery/log"; -static const char *LAST_INSTALL_FILE = "/cache/recovery/last_install"; -static const char *LOCALE_FILE = "/cache/recovery/last_locale"; -static const char *CACHE_ROOT = "/cache"; -static const char *DATA_ROOT = "/data"; -static const char* METADATA_ROOT = "/metadata"; -static const char *SDCARD_ROOT = "/sdcard"; -static const char *LAST_KMSG_FILE = "/cache/recovery/last_kmsg"; -static const char *LAST_LOG_FILE = "/cache/recovery/last_log"; -// We will try to apply the update package 5 times at most in case of an I/O error or -// bspatch | imgpatch error. -static const int RETRY_LIMIT = 4; -static constexpr const char* RECOVERY_WIPE = "/etc/recovery.wipe"; -static constexpr const char* DEFAULT_LOCALE = "en-US"; +static constexpr const char* CACHE_LOG_DIR = "/cache/recovery"; +static constexpr const char* COMMAND_FILE = "/cache/recovery/command"; +static constexpr const char* LOG_FILE = "/cache/recovery/log"; +static constexpr const char* LAST_INSTALL_FILE = "/cache/recovery/last_install"; +static constexpr const char* LAST_KMSG_FILE = "/cache/recovery/last_kmsg"; +static constexpr const char* LAST_LOG_FILE = "/cache/recovery/last_log"; +static constexpr const char* LOCALE_FILE = "/cache/recovery/last_locale"; + +static constexpr const char* CACHE_ROOT = "/cache"; +static constexpr const char* DATA_ROOT = "/data"; +static constexpr const char* METADATA_ROOT = "/metadata"; +static constexpr const char* SDCARD_ROOT = "/sdcard"; // We define RECOVERY_API_VERSION in Android.mk, which will be picked up by build system and packed // into target_files.zip. Assert the version defined in code and in Android.mk are consistent. @@ -547,7 +537,6 @@ static bool erase_volume(const char* volume) { ensure_path_unmounted(volume); int result; - if (is_data && reason && strcmp(reason, "convert_fbe") == 0) { static constexpr const char* CONVERT_FBE_DIR = "/tmp/convert_fbe"; static constexpr const char* CONVERT_FBE_FILE = "/tmp/convert_fbe/convert_fbe"; @@ -887,34 +876,34 @@ static bool check_wipe_package(size_t wipe_package_size) { return ota_type_matched && device_type_matched && (!has_serial_number || serial_number_matched); } -// Wipe the current A/B device, with a secure wipe of all the partitions in -// RECOVERY_WIPE. +// Wipes the current A/B device, with a secure wipe of all the partitions in RECOVERY_WIPE. static bool wipe_ab_device(size_t wipe_package_size) { - ui->SetBackground(RecoveryUI::ERASING); - ui->SetProgressType(RecoveryUI::INDETERMINATE); - - if (!check_wipe_package(wipe_package_size)) { - LOG(ERROR) << "Failed to verify wipe package"; - return false; - } - std::string partition_list; - if (!android::base::ReadFileToString(RECOVERY_WIPE, &partition_list)) { - LOG(ERROR) << "failed to read \"" << RECOVERY_WIPE << "\""; - return false; - } + ui->SetBackground(RecoveryUI::ERASING); + ui->SetProgressType(RecoveryUI::INDETERMINATE); - std::vector lines = android::base::Split(partition_list, "\n"); - for (const std::string& line : lines) { - std::string partition = android::base::Trim(line); - // Ignore '#' comment or empty lines. - if (android::base::StartsWith(partition, "#") || partition.empty()) { - continue; - } + if (!check_wipe_package(wipe_package_size)) { + LOG(ERROR) << "Failed to verify wipe package"; + return false; + } + static constexpr const char* RECOVERY_WIPE = "/etc/recovery.wipe"; + std::string partition_list; + if (!android::base::ReadFileToString(RECOVERY_WIPE, &partition_list)) { + LOG(ERROR) << "failed to read \"" << RECOVERY_WIPE << "\""; + return false; + } - // Proceed anyway even if it fails to wipe some partition. - secure_wipe_partition(partition); + std::vector lines = android::base::Split(partition_list, "\n"); + for (const std::string& line : lines) { + std::string partition = android::base::Trim(line); + // Ignore '#' comment or empty lines. + if (android::base::StartsWith(partition, "#") || partition.empty()) { + continue; } - return true; + + // Proceed anyway even if it fails to wipe some partition. + secure_wipe_partition(partition); + } + return true; } static void choose_recovery_file(Device* device) { @@ -1322,10 +1311,13 @@ static void set_retry_bootloader_message(int retry_count, const std::vector kBootreasonBlacklist{ + "kernel_panic", + "Panic", + }; + for (const auto& str : kBootreasonBlacklist) { + if (android::base::EqualsIgnoreCase(str, bootreason)) return true; } } return false; @@ -1477,6 +1469,7 @@ int main(int argc, char **argv) { } if (locale.empty()) { + static constexpr const char* DEFAULT_LOCALE = "en-US"; locale = DEFAULT_LOCALE; } } @@ -1562,8 +1555,10 @@ int main(int argc, char **argv) { } if (status != INSTALL_SUCCESS) { ui->Print("Installation aborted.\n"); - // When I/O error happens, reboot and retry installation RETRY_LIMIT - // times before we abandon this OTA update. + + // When I/O error or bspatch/imgpatch error happens, reboot and retry installation + // RETRY_LIMIT times before we abandon this OTA update. + static constexpr int RETRY_LIMIT = 4; if (status == INSTALL_RETRY && retry_count < RETRY_LIMIT) { copy_logs(); retry_count += 1; -- cgit v1.2.3