Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3e77d38 authored by Tom Cherry's avatar Tom Cherry
Browse files

init: fix restarting of subcontext

When the subcontext code was redone to allow only one subcontext
(vendor_init), the code for restarting it and for terminating it
during shutdown was not updated, resulting in it not working.

Bug: 155203339
Test: kill subcontext init and notice it restart
Test: subcontext init stops during shutdown
Change-Id: Ib77f59d1e7be0ffcfd3f31c8450dc022c20bb322
parent 91fd50c7
Loading
Loading
Loading
Loading
+7 −9
Original line number Diff line number Diff line
@@ -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"

@@ -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;
@@ -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;
@@ -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;
}

@@ -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();
+15 −17
Original line number Diff line number Diff line
@@ -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:
@@ -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
+2 −1
Original line number Diff line number Diff line
@@ -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();