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
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index 908730e..c1b857c 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -1513,7 +1513,7 @@
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 @@
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++) {