blob: bec262e25a0e13de22a31126074e806db8455e5d [file] [log] [blame]
Steven Moreland80e1e6d2019-06-21 12:35:59 -07001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "ServiceManager.h"
18
19#include <android-base/logging.h>
Jon Spivack0d844302019-07-22 18:40:34 -070020#include <android-base/properties.h>
Jon Spivack9f503a42019-10-22 16:49:19 -070021#include <binder/BpBinder.h>
22#include <binder/IPCThreadState.h>
23#include <binder/ProcessState.h>
Steven Moreland86a17f82019-09-10 10:18:00 -070024#include <binder/Stability.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070025#include <cutils/android_filesystem_config.h>
26#include <cutils/multiuser.h>
Jon Spivack0d844302019-07-22 18:40:34 -070027#include <thread>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070028
Steven Moreland86a17f82019-09-10 10:18:00 -070029#ifndef VENDORSERVICEMANAGER
30#include <vintf/VintfObject.h>
Yifan Hong0a9b56e2021-11-30 16:45:40 -080031#ifdef __ANDROID_RECOVERY__
32#include <vintf/VintfObjectRecovery.h>
33#endif // __ANDROID_RECOVERY__
Steven Moreland86a17f82019-09-10 10:18:00 -070034#include <vintf/constants.h>
35#endif // !VENDORSERVICEMANAGER
36
Steven Moreland80e1e6d2019-06-21 12:35:59 -070037using ::android::binder::Status;
Steven Moreland86a17f82019-09-10 10:18:00 -070038using ::android::internal::Stability;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070039
40namespace android {
41
Steven Moreland86a17f82019-09-10 10:18:00 -070042#ifndef VENDORSERVICEMANAGER
Yifan Hong0a9b56e2021-11-30 16:45:40 -080043
Steven Moreland2e293aa2020-09-23 00:25:16 +000044struct ManifestWithDescription {
45 std::shared_ptr<const vintf::HalManifest> manifest;
46 const char* description;
47};
Yifan Hong0a9b56e2021-11-30 16:45:40 -080048static std::vector<ManifestWithDescription> GetManifestsWithDescription() {
49#ifdef __ANDROID_RECOVERY__
50 auto vintfObject = vintf::VintfObjectRecovery::GetInstance();
51 if (vintfObject == nullptr) {
Pawan Wagh37526162022-09-29 21:55:26 +000052 ALOGE("NULL VintfObjectRecovery!");
Yifan Hong0a9b56e2021-11-30 16:45:40 -080053 return {};
54 }
55 return {ManifestWithDescription{vintfObject->getRecoveryHalManifest(), "recovery"}};
56#else
57 auto vintfObject = vintf::VintfObject::GetInstance();
58 if (vintfObject == nullptr) {
Pawan Wagh37526162022-09-29 21:55:26 +000059 ALOGE("NULL VintfObject!");
Yifan Hong0a9b56e2021-11-30 16:45:40 -080060 return {};
61 }
62 return {ManifestWithDescription{vintfObject->getDeviceHalManifest(), "device"},
63 ManifestWithDescription{vintfObject->getFrameworkHalManifest(), "framework"}};
64#endif
65}
66
Steven Moreland2e293aa2020-09-23 00:25:16 +000067// func true -> stop search and forEachManifest will return true
68static bool forEachManifest(const std::function<bool(const ManifestWithDescription&)>& func) {
Yifan Hong0a9b56e2021-11-30 16:45:40 -080069 for (const ManifestWithDescription& mwd : GetManifestsWithDescription()) {
Steven Moreland2e293aa2020-09-23 00:25:16 +000070 if (mwd.manifest == nullptr) {
Pawan Wagh37526162022-09-29 21:55:26 +000071 ALOGE("NULL VINTF MANIFEST!: %s", mwd.description);
72 // note, we explicitly do not retry here, so that we can detect VINTF
73 // or other bugs (b/151696835)
74 continue;
Steven Moreland2e293aa2020-09-23 00:25:16 +000075 }
76 if (func(mwd)) return true;
77 }
78 return false;
79}
80
Steven Morelandedd4e072021-04-21 00:27:29 +000081struct AidlName {
82 std::string package;
83 std::string iface;
84 std::string instance;
Steven Moreland86a17f82019-09-10 10:18:00 -070085
Steven Morelandedd4e072021-04-21 00:27:29 +000086 static bool fill(const std::string& name, AidlName* aname) {
87 size_t firstSlash = name.find('/');
88 size_t lastDot = name.rfind('.', firstSlash);
89 if (firstSlash == std::string::npos || lastDot == std::string::npos) {
Pawan Wagh37526162022-09-29 21:55:26 +000090 ALOGE("VINTF HALs require names in the format type/instance (e.g. "
91 "some.package.foo.IFoo/default) but got: %s",
92 name.c_str());
Steven Morelandedd4e072021-04-21 00:27:29 +000093 return false;
94 }
95 aname->package = name.substr(0, lastDot);
96 aname->iface = name.substr(lastDot + 1, firstSlash - lastDot - 1);
97 aname->instance = name.substr(firstSlash + 1);
98 return true;
99 }
100};
101
102static bool isVintfDeclared(const std::string& name) {
103 AidlName aname;
104 if (!AidlName::fill(name, &aname)) return false;
105
106 bool found = forEachManifest([&](const ManifestWithDescription& mwd) {
107 if (mwd.manifest->hasAidlInstance(aname.package, aname.iface, aname.instance)) {
Pawan Wagh37526162022-09-29 21:55:26 +0000108 ALOGI("Found %s in %s VINTF manifest.", name.c_str(), mwd.description);
Steven Morelandedd4e072021-04-21 00:27:29 +0000109 return true; // break
Steven Moreland86a17f82019-09-10 10:18:00 -0700110 }
Steven Moreland2e293aa2020-09-23 00:25:16 +0000111 return false; // continue
112 });
113
114 if (!found) {
115 // Although it is tested, explicitly rebuilding qualified name, in case it
116 // becomes something unexpected.
Pawan Wagh37526162022-09-29 21:55:26 +0000117 ALOGI("Could not find %s.%s/%s in the VINTF manifest.", aname.package.c_str(),
118 aname.iface.c_str(), aname.instance.c_str());
Steven Moreland86a17f82019-09-10 10:18:00 -0700119 }
Steven Moreland2edde8e2020-04-30 17:04:54 -0700120
Steven Moreland2e293aa2020-09-23 00:25:16 +0000121 return found;
122}
123
Steven Morelandedd4e072021-04-21 00:27:29 +0000124static std::optional<std::string> getVintfUpdatableApex(const std::string& name) {
125 AidlName aname;
126 if (!AidlName::fill(name, &aname)) return std::nullopt;
127
128 std::optional<std::string> updatableViaApex;
129
130 forEachManifest([&](const ManifestWithDescription& mwd) {
131 mwd.manifest->forEachInstance([&](const auto& manifestInstance) {
132 if (manifestInstance.format() != vintf::HalFormat::AIDL) return true;
133 if (manifestInstance.package() != aname.package) return true;
134 if (manifestInstance.interface() != aname.iface) return true;
135 if (manifestInstance.instance() != aname.instance) return true;
136 updatableViaApex = manifestInstance.updatableViaApex();
137 return false; // break (libvintf uses opposite convention)
138 });
Jooyung Hance94b752022-11-14 18:55:06 +0900139 if (updatableViaApex.has_value()) return true; // break (found match)
Steven Morelandedd4e072021-04-21 00:27:29 +0000140 return false; // continue
141 });
142
143 return updatableViaApex;
144}
145
Jooyung Han76944fe2022-10-25 17:02:45 +0900146static std::vector<std::string> getVintfUpdatableInstances(const std::string& apexName) {
147 std::vector<std::string> instances;
148
149 forEachManifest([&](const ManifestWithDescription& mwd) {
150 mwd.manifest->forEachInstance([&](const auto& manifestInstance) {
151 if (manifestInstance.format() == vintf::HalFormat::AIDL &&
152 manifestInstance.updatableViaApex().has_value() &&
153 manifestInstance.updatableViaApex().value() == apexName) {
154 std::string aname = manifestInstance.package() + "." +
155 manifestInstance.interface() + "/" + manifestInstance.instance();
156 instances.push_back(aname);
157 }
Jooyung Hance94b752022-11-14 18:55:06 +0900158 return true; // continue (libvintf uses opposite convention)
Jooyung Han76944fe2022-10-25 17:02:45 +0900159 });
160 return false; // continue
161 });
162
163 return instances;
164}
165
Devin Moore5e4c2f12021-09-09 22:36:33 +0000166static std::optional<ConnectionInfo> getVintfConnectionInfo(const std::string& name) {
167 AidlName aname;
168 if (!AidlName::fill(name, &aname)) return std::nullopt;
169
170 std::optional<std::string> ip;
171 std::optional<uint64_t> port;
172 forEachManifest([&](const ManifestWithDescription& mwd) {
173 mwd.manifest->forEachInstance([&](const auto& manifestInstance) {
174 if (manifestInstance.format() != vintf::HalFormat::AIDL) return true;
175 if (manifestInstance.package() != aname.package) return true;
176 if (manifestInstance.interface() != aname.iface) return true;
177 if (manifestInstance.instance() != aname.instance) return true;
178 ip = manifestInstance.ip();
179 port = manifestInstance.port();
180 return false; // break (libvintf uses opposite convention)
181 });
182 return false; // continue
183 });
184
185 if (ip.has_value() && port.has_value()) {
186 ConnectionInfo info;
187 info.ipAddress = *ip;
188 info.port = *port;
189 return std::make_optional<ConnectionInfo>(info);
190 } else {
191 return std::nullopt;
192 }
193}
194
Steven Moreland2e293aa2020-09-23 00:25:16 +0000195static std::vector<std::string> getVintfInstances(const std::string& interface) {
196 size_t lastDot = interface.rfind('.');
197 if (lastDot == std::string::npos) {
Pawan Wagh37526162022-09-29 21:55:26 +0000198 ALOGE("VINTF interfaces require names in Java package format (e.g. some.package.foo.IFoo) "
199 "but got: %s",
200 interface.c_str());
Steven Moreland2e293aa2020-09-23 00:25:16 +0000201 return {};
202 }
203 const std::string package = interface.substr(0, lastDot);
204 const std::string iface = interface.substr(lastDot+1);
205
206 std::vector<std::string> ret;
207 (void)forEachManifest([&](const ManifestWithDescription& mwd) {
208 auto instances = mwd.manifest->getAidlInstances(package, iface);
209 ret.insert(ret.end(), instances.begin(), instances.end());
210 return false; // continue
211 });
212
213 return ret;
Steven Moreland86a17f82019-09-10 10:18:00 -0700214}
Steven Morelandb82b8f82019-10-28 10:52:34 -0700215
216static bool meetsDeclarationRequirements(const sp<IBinder>& binder, const std::string& name) {
217 if (!Stability::requiresVintfDeclaration(binder)) {
218 return true;
219 }
220
221 return isVintfDeclared(name);
222}
Steven Moreland86a17f82019-09-10 10:18:00 -0700223#endif // !VENDORSERVICEMANAGER
224
Steven Morelandb8361902023-02-01 23:18:04 +0000225ServiceManager::Service::~Service() {
Steven Morelandcb591562023-03-06 15:53:44 +0000226 if (hasClients) {
227 // only expected to happen on process death, we don't store the service
228 // name this late (it's in the map that holds this service), but if it
229 // is happening, we might want to change 'unlinkToDeath' to explicitly
230 // clear this bit so that we can abort in other cases, where it would
231 // mean inconsistent logic in servicemanager (unexpected and tested, but
232 // the original lazy service impl here had that bug).
Steven Morelandb8361902023-02-01 23:18:04 +0000233 LOG(WARNING) << "a service was removed when there are clients";
234 }
235}
236
Steven Morelandd13f08b2019-11-18 14:23:09 -0800237ServiceManager::ServiceManager(std::unique_ptr<Access>&& access) : mAccess(std::move(access)) {
Steven Moreland8d0c9a72020-04-30 16:51:56 -0700238// TODO(b/151696835): reenable performance hack when we solve bug, since with
239// this hack and other fixes, it is unlikely we will see even an ephemeral
240// failure when the manifest parse fails. The goal is that the manifest will
241// be read incorrectly and cause the process trying to register a HAL to
242// fail. If this is in fact an early boot kernel contention issue, then we
243// will get no failure, and by its absence, be signalled to invest more
244// effort in re-adding this performance hack.
245// #ifndef VENDORSERVICEMANAGER
246// // can process these at any times, don't want to delay first VINTF client
247// std::thread([] {
248// vintf::VintfObject::GetDeviceHalManifest();
249// vintf::VintfObject::GetFrameworkHalManifest();
250// }).detach();
251// #endif // !VENDORSERVICEMANAGER
Steven Morelandd13f08b2019-11-18 14:23:09 -0800252}
Steven Moreland130242d2019-08-26 17:41:32 -0700253ServiceManager::~ServiceManager() {
254 // this should only happen in tests
255
Jon Spivackf288b1d2019-12-19 17:15:51 -0800256 for (const auto& [name, callbacks] : mNameToRegistrationCallback) {
Steven Moreland27cfab02019-08-12 14:34:16 -0700257 CHECK(!callbacks.empty()) << name;
258 for (const auto& callback : callbacks) {
259 CHECK(callback != nullptr) << name;
260 }
261 }
262
Steven Moreland130242d2019-08-26 17:41:32 -0700263 for (const auto& [name, service] : mNameToService) {
264 CHECK(service.binder != nullptr) << name;
265 }
266}
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700267
268Status ServiceManager::getService(const std::string& name, sp<IBinder>* outBinder) {
Jon Spivack0d844302019-07-22 18:40:34 -0700269 *outBinder = tryGetService(name, true);
270 // returns ok regardless of result for legacy reasons
271 return Status::ok();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700272}
273
274Status ServiceManager::checkService(const std::string& name, sp<IBinder>* outBinder) {
Jon Spivack0d844302019-07-22 18:40:34 -0700275 *outBinder = tryGetService(name, false);
276 // returns ok regardless of result for legacy reasons
277 return Status::ok();
278}
279
280sp<IBinder> ServiceManager::tryGetService(const std::string& name, bool startIfNotFound) {
Steven Morelanda9fe4742019-07-18 14:45:20 -0700281 auto ctx = mAccess->getCallingContext();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700282
Jon Spivack0d844302019-07-22 18:40:34 -0700283 sp<IBinder> out;
Jon Spivack9f503a42019-10-22 16:49:19 -0700284 Service* service = nullptr;
Jon Spivack0d844302019-07-22 18:40:34 -0700285 if (auto it = mNameToService.find(name); it != mNameToService.end()) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700286 service = &(it->second);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700287
Jon Spivack9f503a42019-10-22 16:49:19 -0700288 if (!service->allowIsolated) {
Jon Spivack0d844302019-07-22 18:40:34 -0700289 uid_t appid = multiuser_get_app_id(ctx.uid);
290 bool isIsolated = appid >= AID_ISOLATED_START && appid <= AID_ISOLATED_END;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700291
Jon Spivack0d844302019-07-22 18:40:34 -0700292 if (isIsolated) {
293 return nullptr;
294 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700295 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700296 out = service->binder;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700297 }
298
Steven Morelanda9fe4742019-07-18 14:45:20 -0700299 if (!mAccess->canFind(ctx, name)) {
Jon Spivack0d844302019-07-22 18:40:34 -0700300 return nullptr;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700301 }
302
Jon Spivack0d844302019-07-22 18:40:34 -0700303 if (!out && startIfNotFound) {
304 tryStartService(name);
305 }
306
Jon Spivack9f503a42019-10-22 16:49:19 -0700307 if (out) {
Steven Morelandb8361902023-02-01 23:18:04 +0000308 // Force onClients to get sent, and then make sure the timerfd won't clear it
309 // by setting guaranteeClient again. This logic could be simplified by using
310 // a time-based guarantee. However, forcing onClients(true) to get sent
311 // right here is always going to be important for processes serving multiple
312 // lazy interfaces.
313 service->guaranteeClient = true;
314 CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false));
Jon Spivack9f503a42019-10-22 16:49:19 -0700315 service->guaranteeClient = true;
316 }
317
Jon Spivack0d844302019-07-22 18:40:34 -0700318 return out;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700319}
320
Steven Moreland905e2e82019-07-17 11:05:45 -0700321bool isValidServiceName(const std::string& name) {
322 if (name.size() == 0) return false;
323 if (name.size() > 127) return false;
324
325 for (char c : name) {
Steven Morelandbb7951d2019-08-20 16:58:25 -0700326 if (c == '_' || c == '-' || c == '.' || c == '/') continue;
Steven Moreland905e2e82019-07-17 11:05:45 -0700327 if (c >= 'a' && c <= 'z') continue;
328 if (c >= 'A' && c <= 'Z') continue;
329 if (c >= '0' && c <= '9') continue;
330 return false;
331 }
332
333 return true;
334}
335
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700336Status ServiceManager::addService(const std::string& name, const sp<IBinder>& binder, bool allowIsolated, int32_t dumpPriority) {
Steven Morelanda9fe4742019-07-18 14:45:20 -0700337 auto ctx = mAccess->getCallingContext();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700338
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700339 if (multiuser_get_app_id(ctx.uid) >= AID_APP) {
Steven Morelandac2d2852022-03-18 18:15:20 +0000340 return Status::fromExceptionCode(Status::EX_SECURITY, "App UIDs cannot add services");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700341 }
342
Steven Morelanda9fe4742019-07-18 14:45:20 -0700343 if (!mAccess->canAdd(ctx, name)) {
Steven Morelandac2d2852022-03-18 18:15:20 +0000344 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denial");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700345 }
346
347 if (binder == nullptr) {
Steven Morelandac2d2852022-03-18 18:15:20 +0000348 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Null binder");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700349 }
350
Steven Moreland905e2e82019-07-17 11:05:45 -0700351 if (!isValidServiceName(name)) {
Pawan Wagh37526162022-09-29 21:55:26 +0000352 ALOGE("Invalid service name: %s", name.c_str());
Steven Morelandac2d2852022-03-18 18:15:20 +0000353 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Invalid service name");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700354 }
355
Steven Moreland86a17f82019-09-10 10:18:00 -0700356#ifndef VENDORSERVICEMANAGER
357 if (!meetsDeclarationRequirements(binder, name)) {
358 // already logged
Steven Morelandac2d2852022-03-18 18:15:20 +0000359 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "VINTF declaration error");
Steven Moreland86a17f82019-09-10 10:18:00 -0700360 }
361#endif // !VENDORSERVICEMANAGER
362
Steven Moreland88860b02019-08-12 14:24:14 -0700363 // implicitly unlinked when the binder is removed
Steven Morelandb0983182021-04-02 03:14:04 +0000364 if (binder->remoteBinder() != nullptr &&
365 binder->linkToDeath(sp<ServiceManager>::fromExisting(this)) != OK) {
Pawan Wagh37526162022-09-29 21:55:26 +0000366 ALOGE("Could not linkToDeath when adding %s", name.c_str());
Steven Morelandac2d2852022-03-18 18:15:20 +0000367 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "linkToDeath failure");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700368 }
369
Steven Moreland7ee423b2022-09-24 03:52:08 +0000370 auto it = mNameToService.find(name);
371 if (it != mNameToService.end()) {
372 const Service& existing = it->second;
373
374 // We could do better than this because if the other service dies, it
375 // may not have an entry here. However, this case is unlikely. We are
376 // only trying to detect when two different services are accidentally installed.
377
378 if (existing.ctx.uid != ctx.uid) {
Pawan Wagh37526162022-09-29 21:55:26 +0000379 ALOGW("Service '%s' originally registered from UID %u but it is now being registered "
380 "from UID %u. Multiple instances installed?",
381 name.c_str(), existing.ctx.uid, ctx.uid);
Steven Moreland7ee423b2022-09-24 03:52:08 +0000382 }
383
384 if (existing.ctx.sid != ctx.sid) {
Pawan Wagh37526162022-09-29 21:55:26 +0000385 ALOGW("Service '%s' originally registered from SID %s but it is now being registered "
386 "from SID %s. Multiple instances installed?",
387 name.c_str(), existing.ctx.sid.c_str(), ctx.sid.c_str());
Steven Moreland7ee423b2022-09-24 03:52:08 +0000388 }
389
Pawan Wagh37526162022-09-29 21:55:26 +0000390 ALOGI("Service '%s' originally registered from PID %d but it is being registered again "
391 "from PID %d. Bad state? Late death notification? Multiple instances installed?",
392 name.c_str(), existing.ctx.debugPid, ctx.debugPid);
Steven Moreland7ee423b2022-09-24 03:52:08 +0000393 }
394
Devin Moore05ffe522020-08-06 13:58:29 -0700395 // Overwrite the old service if it exists
Steven Moreland7ee423b2022-09-24 03:52:08 +0000396 mNameToService[name] = Service{
397 .binder = binder,
398 .allowIsolated = allowIsolated,
399 .dumpPriority = dumpPriority,
400 .ctx = ctx,
Devin Moore05ffe522020-08-06 13:58:29 -0700401 };
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700402
Steven Moreland7ee423b2022-09-24 03:52:08 +0000403 if (auto it = mNameToRegistrationCallback.find(name); it != mNameToRegistrationCallback.end()) {
Steven Morelandb8361902023-02-01 23:18:04 +0000404 // See also getService - handles case where client never gets the service,
405 // we want the service to quit.
406 mNameToService[name].guaranteeClient = true;
407 CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false));
408 mNameToService[name].guaranteeClient = true;
409
Steven Moreland27cfab02019-08-12 14:34:16 -0700410 for (const sp<IServiceCallback>& cb : it->second) {
411 // permission checked in registerForNotifications
412 cb->onRegistration(name, binder);
413 }
414 }
415
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700416 return Status::ok();
417}
418
419Status ServiceManager::listServices(int32_t dumpPriority, std::vector<std::string>* outList) {
Steven Morelanda9fe4742019-07-18 14:45:20 -0700420 if (!mAccess->canList(mAccess->getCallingContext())) {
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700421 return Status::fromExceptionCode(Status::EX_SECURITY);
422 }
423
424 size_t toReserve = 0;
425 for (auto const& [name, service] : mNameToService) {
426 (void) name;
427
428 if (service.dumpPriority & dumpPriority) ++toReserve;
429 }
430
431 CHECK(outList->empty());
432
433 outList->reserve(toReserve);
434 for (auto const& [name, service] : mNameToService) {
435 (void) service;
436
437 if (service.dumpPriority & dumpPriority) {
438 outList->push_back(name);
439 }
440 }
441
442 return Status::ok();
443}
444
Steven Moreland27cfab02019-08-12 14:34:16 -0700445Status ServiceManager::registerForNotifications(
446 const std::string& name, const sp<IServiceCallback>& callback) {
447 auto ctx = mAccess->getCallingContext();
448
449 if (!mAccess->canFind(ctx, name)) {
450 return Status::fromExceptionCode(Status::EX_SECURITY);
451 }
452
453 if (!isValidServiceName(name)) {
Pawan Wagh37526162022-09-29 21:55:26 +0000454 ALOGE("Invalid service name: %s", name.c_str());
Steven Moreland27cfab02019-08-12 14:34:16 -0700455 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
456 }
457
458 if (callback == nullptr) {
459 return Status::fromExceptionCode(Status::EX_NULL_POINTER);
460 }
461
Steven Morelandb0983182021-04-02 03:14:04 +0000462 if (OK !=
463 IInterface::asBinder(callback)->linkToDeath(
464 sp<ServiceManager>::fromExisting(this))) {
Pawan Wagh37526162022-09-29 21:55:26 +0000465 ALOGE("Could not linkToDeath when adding %s", name.c_str());
Steven Moreland27cfab02019-08-12 14:34:16 -0700466 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
467 }
468
Jon Spivackf288b1d2019-12-19 17:15:51 -0800469 mNameToRegistrationCallback[name].push_back(callback);
Steven Moreland27cfab02019-08-12 14:34:16 -0700470
471 if (auto it = mNameToService.find(name); it != mNameToService.end()) {
472 const sp<IBinder>& binder = it->second.binder;
473
474 // never null if an entry exists
475 CHECK(binder != nullptr) << name;
476 callback->onRegistration(name, binder);
477 }
478
479 return Status::ok();
480}
481Status ServiceManager::unregisterForNotifications(
482 const std::string& name, const sp<IServiceCallback>& callback) {
483 auto ctx = mAccess->getCallingContext();
484
485 if (!mAccess->canFind(ctx, name)) {
486 return Status::fromExceptionCode(Status::EX_SECURITY);
487 }
488
489 bool found = false;
490
Jon Spivackf288b1d2019-12-19 17:15:51 -0800491 auto it = mNameToRegistrationCallback.find(name);
492 if (it != mNameToRegistrationCallback.end()) {
493 removeRegistrationCallback(IInterface::asBinder(callback), &it, &found);
Steven Moreland27cfab02019-08-12 14:34:16 -0700494 }
495
496 if (!found) {
Pawan Wagh37526162022-09-29 21:55:26 +0000497 ALOGE("Trying to unregister callback, but none exists %s", name.c_str());
Steven Moreland27cfab02019-08-12 14:34:16 -0700498 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
499 }
500
501 return Status::ok();
502}
503
Steven Morelandb82b8f82019-10-28 10:52:34 -0700504Status ServiceManager::isDeclared(const std::string& name, bool* outReturn) {
505 auto ctx = mAccess->getCallingContext();
506
507 if (!mAccess->canFind(ctx, name)) {
508 return Status::fromExceptionCode(Status::EX_SECURITY);
509 }
510
511 *outReturn = false;
512
513#ifndef VENDORSERVICEMANAGER
514 *outReturn = isVintfDeclared(name);
515#endif
516 return Status::ok();
517}
518
Steven Moreland2e293aa2020-09-23 00:25:16 +0000519binder::Status ServiceManager::getDeclaredInstances(const std::string& interface, std::vector<std::string>* outReturn) {
520 auto ctx = mAccess->getCallingContext();
521
522 std::vector<std::string> allInstances;
523#ifndef VENDORSERVICEMANAGER
524 allInstances = getVintfInstances(interface);
525#endif
526
527 outReturn->clear();
528
529 for (const std::string& instance : allInstances) {
Steven Moreland2e293aa2020-09-23 00:25:16 +0000530 if (mAccess->canFind(ctx, interface + "/" + instance)) {
531 outReturn->push_back(instance);
532 }
533 }
534
535 if (outReturn->size() == 0 && allInstances.size() != 0) {
536 return Status::fromExceptionCode(Status::EX_SECURITY);
537 }
538
539 return Status::ok();
540}
541
Steven Morelandedd4e072021-04-21 00:27:29 +0000542Status ServiceManager::updatableViaApex(const std::string& name,
543 std::optional<std::string>* outReturn) {
544 auto ctx = mAccess->getCallingContext();
545
546 if (!mAccess->canFind(ctx, name)) {
547 return Status::fromExceptionCode(Status::EX_SECURITY);
548 }
549
550 *outReturn = std::nullopt;
551
552#ifndef VENDORSERVICEMANAGER
553 *outReturn = getVintfUpdatableApex(name);
554#endif
555 return Status::ok();
556}
557
Jooyung Han76944fe2022-10-25 17:02:45 +0900558Status ServiceManager::getUpdatableNames([[maybe_unused]] const std::string& apexName,
559 std::vector<std::string>* outReturn) {
560 auto ctx = mAccess->getCallingContext();
561
562 std::vector<std::string> apexUpdatableInstances;
563#ifndef VENDORSERVICEMANAGER
564 apexUpdatableInstances = getVintfUpdatableInstances(apexName);
565#endif
566
567 outReturn->clear();
568
569 for (const std::string& instance : apexUpdatableInstances) {
570 if (mAccess->canFind(ctx, instance)) {
571 outReturn->push_back(instance);
572 }
573 }
574
575 if (outReturn->size() == 0 && apexUpdatableInstances.size() != 0) {
576 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denial");
577 }
578
579 return Status::ok();
580}
581
Devin Moore5e4c2f12021-09-09 22:36:33 +0000582Status ServiceManager::getConnectionInfo(const std::string& name,
583 std::optional<ConnectionInfo>* outReturn) {
584 auto ctx = mAccess->getCallingContext();
585
586 if (!mAccess->canFind(ctx, name)) {
587 return Status::fromExceptionCode(Status::EX_SECURITY);
588 }
589
590 *outReturn = std::nullopt;
591
592#ifndef VENDORSERVICEMANAGER
593 *outReturn = getVintfConnectionInfo(name);
594#endif
595 return Status::ok();
596}
597
Jon Spivackf288b1d2019-12-19 17:15:51 -0800598void ServiceManager::removeRegistrationCallback(const wp<IBinder>& who,
599 ServiceCallbackMap::iterator* it,
Steven Moreland27cfab02019-08-12 14:34:16 -0700600 bool* found) {
601 std::vector<sp<IServiceCallback>>& listeners = (*it)->second;
602
603 for (auto lit = listeners.begin(); lit != listeners.end();) {
604 if (IInterface::asBinder(*lit) == who) {
605 if(found) *found = true;
606 lit = listeners.erase(lit);
607 } else {
608 ++lit;
609 }
610 }
611
612 if (listeners.empty()) {
Jon Spivackf288b1d2019-12-19 17:15:51 -0800613 *it = mNameToRegistrationCallback.erase(*it);
Steven Moreland27cfab02019-08-12 14:34:16 -0700614 } else {
Jon Spivacke223f082019-11-19 16:21:20 -0800615 (*it)++;
Steven Moreland27cfab02019-08-12 14:34:16 -0700616 }
617}
618
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700619void ServiceManager::binderDied(const wp<IBinder>& who) {
620 for (auto it = mNameToService.begin(); it != mNameToService.end();) {
621 if (who == it->second.binder) {
622 it = mNameToService.erase(it);
623 } else {
624 ++it;
625 }
626 }
Steven Moreland27cfab02019-08-12 14:34:16 -0700627
Jon Spivackf288b1d2019-12-19 17:15:51 -0800628 for (auto it = mNameToRegistrationCallback.begin(); it != mNameToRegistrationCallback.end();) {
629 removeRegistrationCallback(who, &it, nullptr /*found*/);
Steven Moreland27cfab02019-08-12 14:34:16 -0700630 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700631
632 for (auto it = mNameToClientCallback.begin(); it != mNameToClientCallback.end();) {
633 removeClientCallback(who, &it);
634 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700635}
636
Jon Spivack0d844302019-07-22 18:40:34 -0700637void ServiceManager::tryStartService(const std::string& name) {
Steven Morelandba0f33c2022-11-04 22:24:31 +0000638 ALOGI("Since '%s' could not be found, trying to start it as a lazy AIDL service. (if it's not "
639 "configured to be a lazy service, it may be stuck starting or still starting).",
Jon Spivack0d844302019-07-22 18:40:34 -0700640 name.c_str());
641
642 std::thread([=] {
Steven Morelandbfe9fba2021-04-27 18:39:57 +0000643 if (!base::SetProperty("ctl.interface_start", "aidl/" + name)) {
Pawan Wagh37526162022-09-29 21:55:26 +0000644 ALOGI("Tried to start aidl service %s as a lazy service, but was unable to. Usually "
645 "this happens when a "
646 "service is not installed, but if the service is intended to be used as a "
647 "lazy service, then it may be configured incorrectly.",
648 name.c_str());
Steven Morelandbfe9fba2021-04-27 18:39:57 +0000649 }
Jon Spivack0d844302019-07-22 18:40:34 -0700650 }).detach();
651}
652
Jon Spivack9f503a42019-10-22 16:49:19 -0700653Status ServiceManager::registerClientCallback(const std::string& name, const sp<IBinder>& service,
654 const sp<IClientCallback>& cb) {
655 if (cb == nullptr) {
656 return Status::fromExceptionCode(Status::EX_NULL_POINTER);
657 }
658
659 auto ctx = mAccess->getCallingContext();
660 if (!mAccess->canAdd(ctx, name)) {
661 return Status::fromExceptionCode(Status::EX_SECURITY);
662 }
663
664 auto serviceIt = mNameToService.find(name);
665 if (serviceIt == mNameToService.end()) {
Pawan Wagh37526162022-09-29 21:55:26 +0000666 ALOGE("Could not add callback for nonexistent service: %s", name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -0700667 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
668 }
669
Steven Moreland7ee423b2022-09-24 03:52:08 +0000670 if (serviceIt->second.ctx.debugPid != IPCThreadState::self()->getCallingPid()) {
Pawan Wagh37526162022-09-29 21:55:26 +0000671 ALOGW("Only a server can register for client callbacks (for %s)", name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -0700672 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION);
673 }
674
675 if (serviceIt->second.binder != service) {
Pawan Wagh37526162022-09-29 21:55:26 +0000676 ALOGW("Tried to register client callback for %s but a different service is registered "
677 "under this name.",
678 name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -0700679 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
680 }
681
Steven Morelandb0983182021-04-02 03:14:04 +0000682 if (OK !=
683 IInterface::asBinder(cb)->linkToDeath(sp<ServiceManager>::fromExisting(this))) {
Pawan Wagh37526162022-09-29 21:55:26 +0000684 ALOGE("Could not linkToDeath when adding client callback for %s", name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -0700685 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
686 }
687
688 mNameToClientCallback[name].push_back(cb);
689
690 return Status::ok();
691}
692
693void ServiceManager::removeClientCallback(const wp<IBinder>& who,
694 ClientCallbackMap::iterator* it) {
695 std::vector<sp<IClientCallback>>& listeners = (*it)->second;
696
697 for (auto lit = listeners.begin(); lit != listeners.end();) {
698 if (IInterface::asBinder(*lit) == who) {
699 lit = listeners.erase(lit);
700 } else {
701 ++lit;
702 }
703 }
704
705 if (listeners.empty()) {
706 *it = mNameToClientCallback.erase(*it);
707 } else {
708 (*it)++;
709 }
710}
711
712ssize_t ServiceManager::Service::getNodeStrongRefCount() {
Steven Morelandb0983182021-04-02 03:14:04 +0000713 sp<BpBinder> bpBinder = sp<BpBinder>::fromExisting(binder->remoteBinder());
Jon Spivack9f503a42019-10-22 16:49:19 -0700714 if (bpBinder == nullptr) return -1;
715
Steven Morelande8393882020-12-18 02:27:20 +0000716 return ProcessState::self()->getStrongRefCountForNode(bpBinder);
Jon Spivack9f503a42019-10-22 16:49:19 -0700717}
718
719void ServiceManager::handleClientCallbacks() {
720 for (const auto& [name, service] : mNameToService) {
Steven Morelandb8361902023-02-01 23:18:04 +0000721 handleServiceClientCallback(1 /* sm has one refcount */, name, true);
Jon Spivack9f503a42019-10-22 16:49:19 -0700722 }
723}
724
Steven Morelandb8361902023-02-01 23:18:04 +0000725bool ServiceManager::handleServiceClientCallback(size_t knownClients,
726 const std::string& serviceName,
727 bool isCalledOnInterval) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700728 auto serviceIt = mNameToService.find(serviceName);
729 if (serviceIt == mNameToService.end() || mNameToClientCallback.count(serviceName) < 1) {
Steven Morelandb8361902023-02-01 23:18:04 +0000730 return true; // return we do have clients a.k.a. DON'T DO ANYTHING
Jon Spivack9f503a42019-10-22 16:49:19 -0700731 }
732
733 Service& service = serviceIt->second;
734 ssize_t count = service.getNodeStrongRefCount();
735
Steven Morelandb8361902023-02-01 23:18:04 +0000736 // binder driver doesn't support this feature, consider we have clients
737 if (count == -1) return true;
Jon Spivack9f503a42019-10-22 16:49:19 -0700738
Steven Morelandb8361902023-02-01 23:18:04 +0000739 bool hasKernelReportedClients = static_cast<size_t>(count) > knownClients;
Jon Spivack9f503a42019-10-22 16:49:19 -0700740
741 if (service.guaranteeClient) {
Steven Morelandb8361902023-02-01 23:18:04 +0000742 if (!service.hasClients && !hasKernelReportedClients) {
Steven Moreland3e083b22023-01-26 00:46:30 +0000743 sendClientCallbackNotifications(serviceName, true,
744 "service is guaranteed to be in use");
Jon Spivack9f503a42019-10-22 16:49:19 -0700745 }
746
747 // guarantee is temporary
748 service.guaranteeClient = false;
749 }
750
Steven Morelandb8361902023-02-01 23:18:04 +0000751 // Regardless of this situation, we want to give this notification as soon as possible.
752 // This way, we have a chance of preventing further thrashing.
753 if (hasKernelReportedClients && !service.hasClients) {
754 sendClientCallbackNotifications(serviceName, true, "we now have a record of a client");
755 }
Steven Moreland66417652023-02-01 22:19:41 +0000756
Steven Morelandb8361902023-02-01 23:18:04 +0000757 // But limit rate of shutting down service.
758 if (isCalledOnInterval) {
759 if (!hasKernelReportedClients && service.hasClients) {
Steven Moreland3e083b22023-01-26 00:46:30 +0000760 sendClientCallbackNotifications(serviceName, false,
761 "we now have no record of a client");
Jon Spivackd9533c22020-01-27 22:19:22 +0000762 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700763 }
764
Steven Morelandb8361902023-02-01 23:18:04 +0000765 // May be different than 'hasKernelReportedClients'. We intentionally delay
766 // information about clients going away to reduce thrashing.
767 return service.hasClients;
Jon Spivack9f503a42019-10-22 16:49:19 -0700768}
769
Steven Moreland3e083b22023-01-26 00:46:30 +0000770void ServiceManager::sendClientCallbackNotifications(const std::string& serviceName,
771 bool hasClients, const char* context) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700772 auto serviceIt = mNameToService.find(serviceName);
773 if (serviceIt == mNameToService.end()) {
Steven Moreland3e083b22023-01-26 00:46:30 +0000774 ALOGW("sendClientCallbackNotifications could not find service %s when %s",
775 serviceName.c_str(), context);
Jon Spivack9f503a42019-10-22 16:49:19 -0700776 return;
777 }
778 Service& service = serviceIt->second;
779
Steven Morelandb8361902023-02-01 23:18:04 +0000780 CHECK_NE(hasClients, service.hasClients) << context;
Jon Spivack9f503a42019-10-22 16:49:19 -0700781
Steven Morelandb8361902023-02-01 23:18:04 +0000782 ALOGI("Notifying %s they %s (previously: %s) have clients when %s", serviceName.c_str(),
783 hasClients ? "do" : "don't", service.hasClients ? "do" : "don't", context);
Jon Spivack9f503a42019-10-22 16:49:19 -0700784
785 auto ccIt = mNameToClientCallback.find(serviceName);
786 CHECK(ccIt != mNameToClientCallback.end())
Steven Moreland3e083b22023-01-26 00:46:30 +0000787 << "sendClientCallbackNotifications could not find callbacks for service when "
788 << context;
Jon Spivack9f503a42019-10-22 16:49:19 -0700789
790 for (const auto& callback : ccIt->second) {
791 callback->onClients(service.binder, hasClients);
792 }
793
794 service.hasClients = hasClients;
795}
796
797Status ServiceManager::tryUnregisterService(const std::string& name, const sp<IBinder>& binder) {
798 if (binder == nullptr) {
799 return Status::fromExceptionCode(Status::EX_NULL_POINTER);
800 }
801
802 auto ctx = mAccess->getCallingContext();
803 if (!mAccess->canAdd(ctx, name)) {
804 return Status::fromExceptionCode(Status::EX_SECURITY);
805 }
806
807 auto serviceIt = mNameToService.find(name);
808 if (serviceIt == mNameToService.end()) {
Pawan Wagh37526162022-09-29 21:55:26 +0000809 ALOGW("Tried to unregister %s, but that service wasn't registered to begin with.",
810 name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -0700811 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
812 }
813
Steven Moreland7ee423b2022-09-24 03:52:08 +0000814 if (serviceIt->second.ctx.debugPid != IPCThreadState::self()->getCallingPid()) {
Pawan Wagh37526162022-09-29 21:55:26 +0000815 ALOGW("Only a server can unregister itself (for %s)", name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -0700816 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION);
817 }
818
819 sp<IBinder> storedBinder = serviceIt->second.binder;
820
821 if (binder != storedBinder) {
Pawan Wagh37526162022-09-29 21:55:26 +0000822 ALOGW("Tried to unregister %s, but a different service is registered under this name.",
823 name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -0700824 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
825 }
826
Steven Morelandb8361902023-02-01 23:18:04 +0000827 // important because we don't have timer-based guarantees, we don't want to clear
828 // this
Jon Spivack0f18f2c2020-03-13 20:45:18 -0700829 if (serviceIt->second.guaranteeClient) {
Pawan Wagh37526162022-09-29 21:55:26 +0000830 ALOGI("Tried to unregister %s, but there is about to be a client.", name.c_str());
Jon Spivack0f18f2c2020-03-13 20:45:18 -0700831 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
832 }
833
Jon Spivack9f503a42019-10-22 16:49:19 -0700834 // - kernel driver will hold onto one refcount (during this transaction)
835 // - servicemanager has a refcount (guaranteed by this transaction)
Steven Morelandb8361902023-02-01 23:18:04 +0000836 constexpr size_t kKnownClients = 2;
837
838 if (handleServiceClientCallback(kKnownClients, name, false)) {
839 ALOGI("Tried to unregister %s, but there are clients.", name.c_str());
840
841 // Since we had a failed registration attempt, and the HIDL implementation of
842 // delaying service shutdown for multiple periods wasn't ported here... this may
843 // help reduce thrashing, but we should be able to remove it.
Jon Spivack620d2dc2020-03-06 13:58:01 -0800844 serviceIt->second.guaranteeClient = true;
Steven Morelandb8361902023-02-01 23:18:04 +0000845
Jon Spivack9f503a42019-10-22 16:49:19 -0700846 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
847 }
848
Steven Morelandb8361902023-02-01 23:18:04 +0000849 ALOGI("Unregistering %s", name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -0700850 mNameToService.erase(name);
851
852 return Status::ok();
853}
854
Steven Moreland3ea43272021-01-28 22:49:28 +0000855Status ServiceManager::getServiceDebugInfo(std::vector<ServiceDebugInfo>* outReturn) {
856 if (!mAccess->canList(mAccess->getCallingContext())) {
857 return Status::fromExceptionCode(Status::EX_SECURITY);
858 }
859
860 outReturn->reserve(mNameToService.size());
861 for (auto const& [name, service] : mNameToService) {
862 ServiceDebugInfo info;
863 info.name = name;
Steven Moreland7ee423b2022-09-24 03:52:08 +0000864 info.debugPid = service.ctx.debugPid;
Steven Moreland3ea43272021-01-28 22:49:28 +0000865
866 outReturn->push_back(std::move(info));
867 }
868
869 return Status::ok();
870}
871
Pawan Wagh243888e2022-09-20 19:37:35 +0000872void ServiceManager::clear() {
873 mNameToService.clear();
874 mNameToRegistrationCallback.clear();
875 mNameToClientCallback.clear();
876}
877
Steven Moreland8d0c9a72020-04-30 16:51:56 -0700878} // namespace android