Timeout for decrypt

Sometimes, usually because of proprietary binaries related to keymaster,
decrypt will hang waiting for the keymaster to initialize forever. This patch
enables a timeout so that we don't get stuck trying to decrypt forever.
A timeout is especially important when dealing with the default password
because the user has no option to cancel when TWRP tries to decrypt.

NOTE: This patch only adds a timeout for FDE. FBE will require some special
handling because we need access to some static data and that data is not
available across a fork.

Special thanks to nkk71 for cleaning up some issues in my patch set.

Change-Id: Iccf2fe769ac27a7dcd6bfebfe7d2e9eddd034308
This commit is contained in:
Ethan Yonker
2017-01-19 14:01:57 -06:00
parent a9dd9f0374
commit ddb63e27f2
3 changed files with 56 additions and 3 deletions
+20 -3
View File
@@ -1513,7 +1513,7 @@ void TWPartitionManager::Post_Decrypt(const string& Block_Device) {
int TWPartitionManager::Decrypt_Device(string Password) {
#ifdef TW_INCLUDE_CRYPTO
char crypto_state[PROPERTY_VALUE_MAX], crypto_blkdev[PROPERTY_VALUE_MAX], cPassword[255];
char crypto_state[PROPERTY_VALUE_MAX], crypto_blkdev[PROPERTY_VALUE_MAX];
std::vector<TWPartition*>::iterator iter;
// Mount any partitions that need to be mounted for decrypt
@@ -1549,8 +1549,25 @@ int TWPartitionManager::Decrypt_Device(string Password) {
return -1;
}
strcpy(cPassword, Password.c_str());
int pwret = cryptfs_check_passwd(cPassword);
int pwret = -1;
pid_t pid = fork();
if (pid < 0) {
LOGERR("fork failed\n");
return -1;
} else if (pid == 0) {
// Child process
char cPassword[255];
strcpy(cPassword, Password.c_str());
int ret = cryptfs_check_passwd(cPassword);
exit(ret);
} else {
// Parent
int status;
if (TWFunc::Wait_For_Child_Timeout(pid, &status, "Decrypt", 30))
pwret = -1;
else
pwret = WEXITSTATUS(status) ? -1 : 0;
}
// Unmount any partitions that were needed for decrypt
for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {