From e242a97db547dc73efea1b5287536be66637dc33 Mon Sep 17 00:00:00 2001 From: Paul Crowley Date: Thu, 1 Mar 2018 23:24:20 +0000 Subject: [PATCH] Revert "If enablefilecrypto or init_user0 fails, reboot into recovery." This reverts commit 959b05553576ffc15da4334a5917ce763611ab82. Reason for revert: b/73968735 Bug: 73968735 Test: b/73968735#comment5 Change-Id: Ifce4c029bab7380c60e20cc2b2885beb4a097456 --- init/builtins.cpp | 35 +++++++++++------------------------ init/service.cpp | 6 +----- init/service.h | 8 +------- init/sigchld_handler.cpp | 11 ++++++----- 4 files changed, 19 insertions(+), 41 deletions(-) diff --git a/init/builtins.cpp b/init/builtins.cpp index 0d7762229..413d11eb0 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -285,8 +285,11 @@ static Result do_mkdir(const BuiltinArguments& args) { if (e4crypt_is_native()) { if (e4crypt_set_directory_policy(args[1].c_str())) { - reboot_into_recovery( - {"--prompt_and_wipe_data", "--reason=set_policy_failed:"s + args[1]}); + const std::vector options = { + "--prompt_and_wipe_data", + "--reason=set_policy_failed:"s + args[1]}; + reboot_into_recovery(options); + return Success(); } } return Success(); @@ -982,24 +985,6 @@ static bool is_file_crypto() { return android::base::GetProperty("ro.crypto.type", "") == "file"; } -static Result ExecWithRebootOnFailure(const std::string& reboot_reason, - const std::vector& args) { - auto service = Service::MakeTemporaryOneshotService(args); - if (!service) { - return Error() << "Could not create exec service"; - } - service->AddReapCallback([reboot_reason](const siginfo_t& siginfo) { - if (siginfo.si_code != CLD_EXITED || siginfo.si_status != 0) { - reboot_into_recovery({"--prompt_and_wipe_data", "--reason="s + reboot_reason}); - } - }); - if (auto result = service->ExecStart(); !result) { - return Error() << "Could not start exec service: " << result.error(); - } - ServiceList::GetInstance().AddService(std::move(service)); - return Success(); -} - static Result do_installkey(const BuiltinArguments& args) { if (!is_file_crypto()) return Success(); @@ -1007,13 +992,15 @@ static Result do_installkey(const BuiltinArguments& args) { if (!make_dir(unencrypted_dir, 0700) && errno != EEXIST) { return ErrnoError() << "Failed to create " << unencrypted_dir; } - return ExecWithRebootOnFailure("enablefilecrypto_failed", {"exec", "/system/bin/vdc", "--wait", - "cryptfs", "enablefilecrypto"}); + std::vector exec_args = {"exec", "/system/bin/vdc", "--wait", "cryptfs", + "enablefilecrypto"}; + return do_exec({std::move(exec_args), args.context}); } static Result do_init_user0(const BuiltinArguments& args) { - return ExecWithRebootOnFailure("init_user0_failed", - {"exec", "/system/bin/vdc", "--wait", "cryptfs", "init_user0"}); + std::vector exec_args = {"exec", "/system/bin/vdc", "--wait", "cryptfs", + "init_user0"}; + return do_exec({std::move(exec_args), args.context}); } const BuiltinFunctionMap::Map& BuiltinFunctionMap::map() const { diff --git a/init/service.cpp b/init/service.cpp index bf780aa1a..a4e33f7ec 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -299,7 +299,7 @@ void Service::SetProcessAttributes() { } } -void Service::Reap(const siginfo_t& siginfo) { +void Service::Reap() { if (!(flags_ & SVC_ONESHOT) || (flags_ & SVC_RESTART)) { KillProcessGroup(SIGKILL); } @@ -308,10 +308,6 @@ void Service::Reap(const siginfo_t& siginfo) { std::for_each(descriptors_.begin(), descriptors_.end(), std::bind(&DescriptorInfo::Clean, std::placeholders::_1)); - for (const auto& f : reap_callbacks_) { - f(siginfo); - } - if (flags_ & SVC_EXEC) UnSetExec(); if (flags_ & SVC_TEMPORARY) return; diff --git a/init/service.h b/init/service.h index bcf194386..d46a41349 100644 --- a/init/service.h +++ b/init/service.h @@ -17,7 +17,6 @@ #ifndef _INIT_SERVICE_H #define _INIT_SERVICE_H -#include #include #include @@ -82,7 +81,7 @@ class Service { void Stop(); void Terminate(); void Restart(); - void Reap(const siginfo_t& siginfo); + void Reap(); void DumpState() const; void SetShutdownCritical() { flags_ |= SVC_SHUTDOWN_CRITICAL; } bool IsShutdownCritical() const { return (flags_ & SVC_SHUTDOWN_CRITICAL) != 0; } @@ -90,9 +89,6 @@ class Service { is_exec_service_running_ = false; flags_ &= ~SVC_EXEC; } - void AddReapCallback(std::function callback) { - reap_callbacks_.emplace_back(std::move(callback)); - } static bool is_exec_service_running() { return is_exec_service_running_; } @@ -214,8 +210,6 @@ class Service { std::vector> rlimits_; std::vector args_; - - std::vector> reap_callbacks_; }; class ServiceList { diff --git a/init/sigchld_handler.cpp b/init/sigchld_handler.cpp index badacaf1c..072a0fb0b 100644 --- a/init/sigchld_handler.cpp +++ b/init/sigchld_handler.cpp @@ -84,15 +84,16 @@ static bool ReapOneProcess() { } } - if (siginfo.si_code == CLD_EXITED) { - LOG(INFO) << name << " exited with status " << siginfo.si_status << wait_string; - } else { - LOG(INFO) << name << " received signal " << siginfo.si_status << wait_string; + auto status = siginfo.si_status; + if (WIFEXITED(status)) { + LOG(INFO) << name << " exited with status " << WEXITSTATUS(status) << wait_string; + } else if (WIFSIGNALED(status)) { + LOG(INFO) << name << " killed by signal " << WTERMSIG(status) << wait_string; } if (!service) return true; - service->Reap(siginfo); + service->Reap(); if (service->flags() & SVC_TEMPORARY) { ServiceList::GetInstance().RemoveService(*service);