From 69b048507fa29a5a1b6d1b7e86070ded4cd0c4de Mon Sep 17 00:00:00 2001 From: liulvping Date: Mon, 10 Oct 2022 19:16:23 +0800 Subject: [PATCH] Ignore DE retrieveKey failure for non-user-0 retrieveKey can fail in load_all_de_keys if a user is partially removed, i.e. cases where fscrypt_destroy_user_key() got interrupted. So just ignore the failure, else could reboot into recovery. Test: pm create-user foo pm remove-user 10 adb reboot && check device not enter recovery Signed-off-by: liulvping Change-Id: Iba9d53a0833524d00e65d0427ab03002c5d8d509 --- FsCrypt.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/FsCrypt.cpp b/FsCrypt.cpp index 5bc55d0..f871a32 100644 --- a/FsCrypt.cpp +++ b/FsCrypt.cpp @@ -417,7 +417,11 @@ static bool load_all_de_keys() { userid_t user_id = std::stoi(entry->d_name); auto key_path = de_dir + "/" + entry->d_name; KeyBuffer de_key; - if (!retrieveKey(key_path, kEmptyAuthentication, &de_key)) return false; + if (!retrieveKey(key_path, kEmptyAuthentication, &de_key)) { + // This is probably a partially removed user, so ignore + if (user_id != 0) continue; + return false; + } EncryptionPolicy de_policy; if (!install_storage_key(DATA_MNT_POINT, options, de_key, &de_policy)) return false; auto ret = s_de_policies.insert({user_id, de_policy});