Loading init/init.cpp +7 −9 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ #include "service.h" #include "service_parser.h" #include "sigchld_handler.h" #include "subcontext.h" #include "system/core/init/property_service.pb.h" #include "util.h" Loading @@ -100,8 +101,6 @@ static int property_triggers_enabled = 0; static int signal_fd = -1; static int property_fd = -1; static std::unique_ptr<Subcontext> subcontext; struct PendingControlMessage { std::string message; std::string name; Loading Loading @@ -279,9 +278,8 @@ Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) { Parser parser; parser.AddSectionParser("service", std::make_unique<ServiceParser>( &service_list, subcontext.get(), std::nullopt)); parser.AddSectionParser("on", std::make_unique<ActionParser>(&action_manager, subcontext.get())); &service_list, GetSubcontext(), std::nullopt)); parser.AddSectionParser("on", std::make_unique<ActionParser>(&action_manager, GetSubcontext())); parser.AddSectionParser("import", std::make_unique<ImportParser>(&parser)); return parser; Loading @@ -291,9 +289,9 @@ Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) { Parser CreateServiceOnlyParser(ServiceList& service_list, bool from_apex) { Parser parser; parser.AddSectionParser("service", std::make_unique<ServiceParser>(&service_list, subcontext.get(), std::nullopt, from_apex)); parser.AddSectionParser( "service", std::make_unique<ServiceParser>(&service_list, GetSubcontext(), std::nullopt, from_apex)); return parser; } Loading Loading @@ -809,7 +807,7 @@ int SecondStageMain(int argc, char** argv) { PLOG(FATAL) << "SetupMountNamespaces failed"; } subcontext = InitializeSubcontext(); InitializeSubcontext(); ActionManager& am = ActionManager::GetInstance(); ServiceList& sm = ServiceList::GetInstance(); Loading init/subcontext.cpp +15 −17 Original line number Diff line number Diff line Loading @@ -52,6 +52,8 @@ namespace init { namespace { std::string shutdown_command; static bool subcontext_terminated_by_shutdown; static std::unique_ptr<Subcontext> subcontext; class SubcontextProcess { public: Loading Loading @@ -323,34 +325,30 @@ Result<std::vector<std::string>> Subcontext::ExpandArgs(const std::vector<std::s return expanded_args; } static std::vector<Subcontext> subcontexts; static bool shutting_down; std::unique_ptr<Subcontext> InitializeSubcontext() { void InitializeSubcontext() { if (SelinuxGetVendorAndroidVersion() >= __ANDROID_API_P__) { return std::make_unique<Subcontext>(std::vector<std::string>{"/vendor", "/odm"}, kVendorContext); subcontext.reset( new Subcontext(std::vector<std::string>{"/vendor", "/odm"}, kVendorContext)); } } return nullptr; Subcontext* GetSubcontext() { return subcontext.get(); } bool SubcontextChildReap(pid_t pid) { for (auto& subcontext : subcontexts) { if (subcontext.pid() == pid) { if (!shutting_down) { subcontext.Restart(); if (subcontext->pid() == pid) { if (!subcontext_terminated_by_shutdown) { subcontext->Restart(); } return true; } } return false; } void SubcontextTerminate() { shutting_down = true; for (auto& subcontext : subcontexts) { kill(subcontext.pid(), SIGTERM); } subcontext_terminated_by_shutdown = true; kill(subcontext->pid(), SIGTERM); } } // namespace init Loading init/subcontext.h +2 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,8 @@ class Subcontext { }; int SubcontextMain(int argc, char** argv, const BuiltinFunctionMap* function_map); std::unique_ptr<Subcontext> InitializeSubcontext(); void InitializeSubcontext(); Subcontext* GetSubcontext(); bool SubcontextChildReap(pid_t pid); void SubcontextTerminate(); Loading Loading
init/init.cpp +7 −9 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ #include "service.h" #include "service_parser.h" #include "sigchld_handler.h" #include "subcontext.h" #include "system/core/init/property_service.pb.h" #include "util.h" Loading @@ -100,8 +101,6 @@ static int property_triggers_enabled = 0; static int signal_fd = -1; static int property_fd = -1; static std::unique_ptr<Subcontext> subcontext; struct PendingControlMessage { std::string message; std::string name; Loading Loading @@ -279,9 +278,8 @@ Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) { Parser parser; parser.AddSectionParser("service", std::make_unique<ServiceParser>( &service_list, subcontext.get(), std::nullopt)); parser.AddSectionParser("on", std::make_unique<ActionParser>(&action_manager, subcontext.get())); &service_list, GetSubcontext(), std::nullopt)); parser.AddSectionParser("on", std::make_unique<ActionParser>(&action_manager, GetSubcontext())); parser.AddSectionParser("import", std::make_unique<ImportParser>(&parser)); return parser; Loading @@ -291,9 +289,9 @@ Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) { Parser CreateServiceOnlyParser(ServiceList& service_list, bool from_apex) { Parser parser; parser.AddSectionParser("service", std::make_unique<ServiceParser>(&service_list, subcontext.get(), std::nullopt, from_apex)); parser.AddSectionParser( "service", std::make_unique<ServiceParser>(&service_list, GetSubcontext(), std::nullopt, from_apex)); return parser; } Loading Loading @@ -809,7 +807,7 @@ int SecondStageMain(int argc, char** argv) { PLOG(FATAL) << "SetupMountNamespaces failed"; } subcontext = InitializeSubcontext(); InitializeSubcontext(); ActionManager& am = ActionManager::GetInstance(); ServiceList& sm = ServiceList::GetInstance(); Loading
init/subcontext.cpp +15 −17 Original line number Diff line number Diff line Loading @@ -52,6 +52,8 @@ namespace init { namespace { std::string shutdown_command; static bool subcontext_terminated_by_shutdown; static std::unique_ptr<Subcontext> subcontext; class SubcontextProcess { public: Loading Loading @@ -323,34 +325,30 @@ Result<std::vector<std::string>> Subcontext::ExpandArgs(const std::vector<std::s return expanded_args; } static std::vector<Subcontext> subcontexts; static bool shutting_down; std::unique_ptr<Subcontext> InitializeSubcontext() { void InitializeSubcontext() { if (SelinuxGetVendorAndroidVersion() >= __ANDROID_API_P__) { return std::make_unique<Subcontext>(std::vector<std::string>{"/vendor", "/odm"}, kVendorContext); subcontext.reset( new Subcontext(std::vector<std::string>{"/vendor", "/odm"}, kVendorContext)); } } return nullptr; Subcontext* GetSubcontext() { return subcontext.get(); } bool SubcontextChildReap(pid_t pid) { for (auto& subcontext : subcontexts) { if (subcontext.pid() == pid) { if (!shutting_down) { subcontext.Restart(); if (subcontext->pid() == pid) { if (!subcontext_terminated_by_shutdown) { subcontext->Restart(); } return true; } } return false; } void SubcontextTerminate() { shutting_down = true; for (auto& subcontext : subcontexts) { kill(subcontext.pid(), SIGTERM); } subcontext_terminated_by_shutdown = true; kill(subcontext->pid(), SIGTERM); } } // namespace init Loading
init/subcontext.h +2 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,8 @@ class Subcontext { }; int SubcontextMain(int argc, char** argv, const BuiltinFunctionMap* function_map); std::unique_ptr<Subcontext> InitializeSubcontext(); void InitializeSubcontext(); Subcontext* GetSubcontext(); bool SubcontextChildReap(pid_t pid); void SubcontextTerminate(); Loading