summaryrefslogtreecommitdiff
path: root/init/service.cpp
diff options
context:
space:
mode:
authorJooyung Han <jooyung@google.com>2020-06-09 13:44:17 +0900
committerJooyung Han <jooyung@google.com>2020-06-11 15:10:40 +0900
commit4f23d5a236e08ed2d9413cf2681f8ed967d01deb (patch)
tree7bfcca78b214cafaf6d024269d07d0cc4a49831b /init/service.cpp
parent3447cdc741214db36f47dd1138b12215a070efa6 (diff)
init: start ueventd in the default mount namespace
Init starts ueventd in the default mount namespace to support loading firmware from APEXes. Bug: 155023652 Test: devices boots adb$ nsenter -t (pid of ueventd) -m ls /apex => shows all APEXes Change-Id: Ibb8b33a07eb014752275e3bca4541b8b694dc64b
Diffstat (limited to 'init/service.cpp')
-rw-r--r--init/service.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/init/service.cpp b/init/service.cpp
index 165b848a2..68365b3c3 100644
--- a/init/service.cpp
+++ b/init/service.cpp
@@ -465,6 +465,16 @@ Result<void> Service::Start() {
pre_apexd_ = true;
}
+ // For pre-apexd services, override mount namespace as "bootstrap" one before starting.
+ // Note: "ueventd" is supposed to be run in "default" mount namespace even if it's pre-apexd
+ // to support loading firmwares from APEXes.
+ std::optional<MountNamespace> override_mount_namespace;
+ if (name_ == "ueventd") {
+ override_mount_namespace = NS_DEFAULT;
+ } else if (pre_apexd_) {
+ override_mount_namespace = NS_BOOTSTRAP;
+ }
+
post_data_ = ServiceList::GetInstance().IsPostData();
LOG(INFO) << "starting service '" << name_ << "'...";
@@ -496,7 +506,8 @@ Result<void> Service::Start() {
if (pid == 0) {
umask(077);
- if (auto result = EnterNamespaces(namespaces_, name_, pre_apexd_); !result.ok()) {
+ if (auto result = EnterNamespaces(namespaces_, name_, override_mount_namespace);
+ !result.ok()) {
LOG(FATAL) << "Service '" << name_
<< "' failed to set up namespaces: " << result.error();
}