Make init builtin command installkey respect property updates

init used to block on installkey such that it was unable to
process property events. This lead to a deadlock by which
the Keymaster HAL would wait indefinitely for the
hwservicemanager.ready=true. 

This fixes the issue by implementing the builtin in terms of 
do_exec, which allows init to stay responsive to properties 
while waiting for the child to terminate.

Bug: 36278706
Test: Add a 3s delay into hwservicemanager before it sets the property
      hwservicemanager.ready and the device still boots.

Change-Id: Iaefd31156ca01f3a44b4f85a8bf78beee8dfe224
This commit is contained in:
Janis Danisevskis 2017-03-29 14:50:01 -07:00 committed by Tom Cherry
parent 6fb2ef1d03
commit 9cc51728af
1 changed files with 8 additions and 2 deletions

View File

@ -879,8 +879,14 @@ static int do_installkey(const std::vector<std::string>& args) {
if (!is_file_crypto()) {
return 0;
}
return e4crypt_create_device_key(args[1].c_str(),
do_installkeys_ensure_dir_exists);
auto unencrypted_dir = args[1] + e4crypt_unencrypted_folder;
if (do_installkeys_ensure_dir_exists(unencrypted_dir.c_str())) {
PLOG(ERROR) << "Failed to create " << unencrypted_dir;
return -1;
}
std::vector<std::string> exec_args = {"exec", "/system/bin/vdc", "--wait", "cryptfs",
"enablefilecrypto"};
return do_exec(exec_args);
}
static int do_init_user0(const std::vector<std::string>& args) {