From 92c49bcb3098050d41dd32a782a97cbd7a88675a Mon Sep 17 00:00:00 2001 From: Luis Hector Chavez Date: Fri, 27 Jul 2018 11:19:25 -0700 Subject: [PATCH] init: Cleanly shut down subcontext processes This change adds an explicit cleanup for the subcontext processes and avoids them from respawning, which causes a bunch of LOG(FATAL)s when the system is going down. Bug: 80425914 Test: kill -TERM $INIT_PID, no crashes for subcontext inits Change-Id: I135191d959c1dd921b102af316b24d2bc161d6c9 --- init/reboot.cpp | 1 + init/subcontext.cpp | 12 +++++++++++- init/subcontext.h | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/init/reboot.cpp b/init/reboot.cpp index 6f6e39f25..11507f489 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -443,6 +443,7 @@ void DoReboot(unsigned int cmd, const std::string& reason, const std::string& re for (const auto& s : ServiceList::GetInstance().services_in_shutdown_order()) { if (!s->IsShutdownCritical()) s->Stop(); } + SubcontextTerminate(); ReapAnyOutstandingChildren(); // 3. send volume shutdown to vold diff --git a/init/subcontext.cpp b/init/subcontext.cpp index 267d530f0..ee7251328 100644 --- a/init/subcontext.cpp +++ b/init/subcontext.cpp @@ -352,6 +352,7 @@ Result> Subcontext::ExpandArgs(const std::vector subcontexts; +static bool shutting_down; std::vector* InitializeSubcontexts() { if (SelinuxHasVendorInit()) { @@ -365,12 +366,21 @@ std::vector* InitializeSubcontexts() { bool SubcontextChildReap(pid_t pid) { for (auto& subcontext : subcontexts) { if (subcontext.pid() == pid) { - subcontext.Restart(); + if (!shutting_down) { + subcontext.Restart(); + } return true; } } return false; } +void SubcontextTerminate() { + shutting_down = true; + for (auto& subcontext : subcontexts) { + kill(subcontext.pid(), SIGTERM); + } +} + } // namespace init } // namespace android diff --git a/init/subcontext.h b/init/subcontext.h index 22d7d43bd..628fd50e7 100644 --- a/init/subcontext.h +++ b/init/subcontext.h @@ -63,6 +63,7 @@ class Subcontext { int SubcontextMain(int argc, char** argv, const KeywordFunctionMap* function_map); std::vector* InitializeSubcontexts(); bool SubcontextChildReap(pid_t pid); +void SubcontextTerminate(); } // namespace init } // namespace android