diff options
author | Paul Crowley <paulcrowley@google.com> | 2016-05-10 22:17:08 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-05-10 22:17:08 +0000 |
commit | 71bac3fa4b519ff9aa537a3ef6b7242b5c8f848c (patch) | |
tree | b0a2a3adefb32e28ceddad8aabe2456c728db9a8 /init/builtins.cpp | |
parent | b3bf7a5b883eeb1ee49f4635037aa796bb406abc (diff) | |
parent | 8a59fa85243a5f748108279f6d30b01292518b0a (diff) |
Merge "Wipe device on policy error" into nyc-dev
am: 8a59fa8524
* commit '8a59fa85243a5f748108279f6d30b01292518b0a':
Wipe device on policy error
Change-Id: I35205b2ddf8b3e8d049525e3717d27836d6c59a2
Diffstat (limited to 'init/builtins.cpp')
-rw-r--r-- | init/builtins.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/init/builtins.cpp b/init/builtins.cpp index e56ec4e07..63cc3bc1f 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -36,6 +36,7 @@ #include <sys/wait.h> #include <unistd.h> #include <linux/loop.h> +#include <ext4_crypt.h> #include <ext4_crypt_init_extensions.h> #include <selinux/selinux.h> @@ -134,6 +135,17 @@ static void turnOffBacklight() { } } +static int wipe_data_via_recovery(const std::string& reason) { + const std::vector<std::string> options = {"--wipe_data", std::string() + "--reason=" + reason}; + std::string err; + if (!write_bootloader_message(options, &err)) { + ERROR("failed to set bootloader message: %s", err.c_str()); + return -1; + } + android_reboot(ANDROID_RB_RESTART2, 0, "recovery"); + while (1) { pause(); } // never reached +} + static void unmount_and_fsck(const struct mntent *entry) { if (strcmp(entry->mnt_type, "f2fs") && strcmp(entry->mnt_type, "ext4")) return; @@ -323,7 +335,13 @@ static int do_mkdir(const std::vector<std::string>& args) { } } - return e4crypt_set_directory_policy(args[1].c_str()); + if (e4crypt_is_native()) { + if (e4crypt_set_directory_policy(args[1].c_str())) { + wipe_data_via_recovery(std::string() + "set_policy_failed:" + args[1]); + return -1; + } + } + return 0; } static struct { @@ -451,17 +469,6 @@ exit_success: } -static int wipe_data_via_recovery() { - const std::vector<std::string> options = {"--wipe_data", "--reason=wipe_data_via_recovery"}; - std::string err; - if (!write_bootloader_message(options, &err)) { - ERROR("failed to set bootloader message: %s", err.c_str()); - return -1; - } - android_reboot(ANDROID_RB_RESTART2, 0, "recovery"); - while (1) { pause(); } // never reached -} - /* Imports .rc files from the specified paths. Default ones are applied if none is given. * * start_index: index of the first path in the args list @@ -552,7 +559,7 @@ static int do_mount_all(const std::vector<std::string>& args) { } else if (ret == FS_MGR_MNTALL_DEV_NEEDS_RECOVERY) { /* Setup a wipe via recovery, and reboot into recovery */ ERROR("fs_mgr_mount_all suggested recovery, so wiping data via recovery.\n"); - ret = wipe_data_via_recovery(); + ret = wipe_data_via_recovery("wipe_data_via_recovery"); /* If reboot worked, there is no return. */ } else if (ret == FS_MGR_MNTALL_DEV_FILE_ENCRYPTED) { if (e4crypt_install_keyring()) { |