From 9cc51728af87d476de1b90e0f8dba62b3fc8711f Mon Sep 17 00:00:00 2001 From: Janis Danisevskis Date: Wed, 29 Mar 2017 14:50:01 -0700 Subject: [PATCH] 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 --- init/builtins.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/init/builtins.cpp b/init/builtins.cpp index 02e314f64..ccc4fd1a7 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -879,8 +879,14 @@ static int do_installkey(const std::vector& 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 exec_args = {"exec", "/system/bin/vdc", "--wait", "cryptfs", + "enablefilecrypto"}; + return do_exec(exec_args); } static int do_init_user0(const std::vector& args) {