blob: 38a125bb5445e87ee92acf82ba6f84b8b5bf9407 [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>
Parth Sane5ade9f12024-05-19 13:02:07 +000021#include <android-base/scopeguard.h>
Devin Moore42407bc2023-09-26 21:30:39 +000022#include <android-base/strings.h>
Jon Spivack9f503a42019-10-22 16:49:19 -070023#include <binder/BpBinder.h>
24#include <binder/IPCThreadState.h>
25#include <binder/ProcessState.h>
Steven Moreland86a17f82019-09-10 10:18:00 -070026#include <binder/Stability.h>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070027#include <cutils/android_filesystem_config.h>
28#include <cutils/multiuser.h>
Jon Spivack0d844302019-07-22 18:40:34 -070029#include <thread>
Steven Moreland80e1e6d2019-06-21 12:35:59 -070030
Parth Sane5ade9f12024-05-19 13:02:07 +000031#if !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +000032#include "perfetto/public/protos/trace/android/android_track_event.pzc.h"
Parth Sane5ade9f12024-05-19 13:02:07 +000033#include "perfetto/public/te_category_macros.h"
34#include "perfetto/public/te_macros.h"
35#endif // !defined(VENDORSERVICEMANAGER) && !defined(__ANDROID_RECOVERY__)
36
Steven Moreland86a17f82019-09-10 10:18:00 -070037#ifndef VENDORSERVICEMANAGER
38#include <vintf/VintfObject.h>
Yifan Hong0a9b56e2021-11-30 16:45:40 -080039#ifdef __ANDROID_RECOVERY__
40#include <vintf/VintfObjectRecovery.h>
41#endif // __ANDROID_RECOVERY__
Steven Moreland86a17f82019-09-10 10:18:00 -070042#include <vintf/constants.h>
43#endif // !VENDORSERVICEMANAGER
44
Jooyung Han205e2822023-12-19 16:59:39 +090045#include "NameUtil.h"
46
Steven Moreland80e1e6d2019-06-21 12:35:59 -070047using ::android::binder::Status;
Steven Moreland86a17f82019-09-10 10:18:00 -070048using ::android::internal::Stability;
Steven Moreland80e1e6d2019-06-21 12:35:59 -070049
50namespace android {
51
Parth Sane5ade9f12024-05-19 13:02:07 +000052#if defined(VENDORSERVICEMANAGER) || defined(__ANDROID_RECOVERY__)
53#define SM_PERFETTO_TRACE_FUNC(...)
54#else
55
56PERFETTO_TE_CATEGORIES_DEFINE(PERFETTO_SM_CATEGORIES);
57
58#define SM_PERFETTO_TRACE_FUNC(...) \
59 PERFETTO_TE_SCOPED(servicemanager, PERFETTO_TE_SLICE_BEGIN(__func__) __VA_OPT__(, ) __VA_ARGS__)
60
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +000061constexpr uint32_t kProtoServiceName =
62 perfetto_protos_AndroidTrackEvent_binder_service_name_field_number;
63constexpr uint32_t kProtoInterfaceName =
64 perfetto_protos_AndroidTrackEvent_binder_interface_name_field_number;
65constexpr uint32_t kProtoApexName = perfetto_protos_AndroidTrackEvent_apex_name_field_number;
66
Parth Sane5ade9f12024-05-19 13:02:07 +000067#endif // !(defined(VENDORSERVICEMANAGER) || defined(__ANDROID_RECOVERY__))
68
Steven Morelandb9e1cbe2023-02-01 22:44:45 +000069bool is_multiuser_uid_isolated(uid_t uid) {
70 uid_t appid = multiuser_get_app_id(uid);
71 return appid >= AID_ISOLATED_START && appid <= AID_ISOLATED_END;
72}
73
Steven Moreland86a17f82019-09-10 10:18:00 -070074#ifndef VENDORSERVICEMANAGER
Yifan Hong0a9b56e2021-11-30 16:45:40 -080075
Steven Moreland2e293aa2020-09-23 00:25:16 +000076struct ManifestWithDescription {
77 std::shared_ptr<const vintf::HalManifest> manifest;
78 const char* description;
79};
Yifan Hong0a9b56e2021-11-30 16:45:40 -080080static std::vector<ManifestWithDescription> GetManifestsWithDescription() {
81#ifdef __ANDROID_RECOVERY__
82 auto vintfObject = vintf::VintfObjectRecovery::GetInstance();
83 if (vintfObject == nullptr) {
Pawan Wagh37526162022-09-29 21:55:26 +000084 ALOGE("NULL VintfObjectRecovery!");
Yifan Hong0a9b56e2021-11-30 16:45:40 -080085 return {};
86 }
87 return {ManifestWithDescription{vintfObject->getRecoveryHalManifest(), "recovery"}};
88#else
89 auto vintfObject = vintf::VintfObject::GetInstance();
90 if (vintfObject == nullptr) {
Pawan Wagh37526162022-09-29 21:55:26 +000091 ALOGE("NULL VintfObject!");
Yifan Hong0a9b56e2021-11-30 16:45:40 -080092 return {};
93 }
94 return {ManifestWithDescription{vintfObject->getDeviceHalManifest(), "device"},
95 ManifestWithDescription{vintfObject->getFrameworkHalManifest(), "framework"}};
96#endif
97}
98
Steven Moreland2e293aa2020-09-23 00:25:16 +000099// func true -> stop search and forEachManifest will return true
100static bool forEachManifest(const std::function<bool(const ManifestWithDescription&)>& func) {
Yifan Hong0a9b56e2021-11-30 16:45:40 -0800101 for (const ManifestWithDescription& mwd : GetManifestsWithDescription()) {
Steven Moreland2e293aa2020-09-23 00:25:16 +0000102 if (mwd.manifest == nullptr) {
Pawan Wagh37526162022-09-29 21:55:26 +0000103 ALOGE("NULL VINTF MANIFEST!: %s", mwd.description);
104 // note, we explicitly do not retry here, so that we can detect VINTF
105 // or other bugs (b/151696835)
106 continue;
Steven Moreland2e293aa2020-09-23 00:25:16 +0000107 }
108 if (func(mwd)) return true;
109 }
110 return false;
111}
112
Jooyung Han205e2822023-12-19 16:59:39 +0900113static std::string getNativeInstanceName(const vintf::ManifestInstance& instance) {
114 return instance.package() + "/" + instance.instance();
115}
116
Steven Morelandedd4e072021-04-21 00:27:29 +0000117struct AidlName {
118 std::string package;
119 std::string iface;
120 std::string instance;
Steven Moreland86a17f82019-09-10 10:18:00 -0700121
Devin Moore9d1dfa02024-07-23 21:40:05 +0000122 static bool fill(const std::string& name, AidlName* aname, bool logError) {
Steven Morelandedd4e072021-04-21 00:27:29 +0000123 size_t firstSlash = name.find('/');
124 size_t lastDot = name.rfind('.', firstSlash);
125 if (firstSlash == std::string::npos || lastDot == std::string::npos) {
Devin Moore9d1dfa02024-07-23 21:40:05 +0000126 if (logError) {
127 ALOGE("VINTF HALs require names in the format type/instance (e.g. "
128 "some.package.foo.IFoo/default) but got: %s",
129 name.c_str());
130 }
Steven Morelandedd4e072021-04-21 00:27:29 +0000131 return false;
132 }
133 aname->package = name.substr(0, lastDot);
134 aname->iface = name.substr(lastDot + 1, firstSlash - lastDot - 1);
135 aname->instance = name.substr(firstSlash + 1);
136 return true;
137 }
138};
139
Jooyung Han205e2822023-12-19 16:59:39 +0900140static std::string getAidlInstanceName(const vintf::ManifestInstance& instance) {
141 return instance.package() + "." + instance.interface() + "/" + instance.instance();
142}
143
Steven Moreland5759db02024-03-27 00:03:05 +0000144static bool isVintfDeclared(const Access::CallingContext& ctx, const std::string& name) {
Jooyung Han205e2822023-12-19 16:59:39 +0900145 NativeName nname;
146 if (NativeName::fill(name, &nname)) {
147 bool found = forEachManifest([&](const ManifestWithDescription& mwd) {
148 if (mwd.manifest->hasNativeInstance(nname.package, nname.instance)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000149 ALOGI("%s Found %s in %s VINTF manifest.", ctx.toDebugString().c_str(),
150 name.c_str(), mwd.description);
Jooyung Han205e2822023-12-19 16:59:39 +0900151 return true; // break
152 }
153 return false; // continue
154 });
155 if (!found) {
Steven Moreland5759db02024-03-27 00:03:05 +0000156 ALOGI("%s Could not find %s in the VINTF manifest.", ctx.toDebugString().c_str(),
157 name.c_str());
Jooyung Han205e2822023-12-19 16:59:39 +0900158 }
159 return found;
160 }
161
Steven Morelandedd4e072021-04-21 00:27:29 +0000162 AidlName aname;
Devin Moore9d1dfa02024-07-23 21:40:05 +0000163 if (!AidlName::fill(name, &aname, true)) return false;
Steven Morelandedd4e072021-04-21 00:27:29 +0000164
165 bool found = forEachManifest([&](const ManifestWithDescription& mwd) {
166 if (mwd.manifest->hasAidlInstance(aname.package, aname.iface, aname.instance)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000167 ALOGI("%s Found %s in %s VINTF manifest.", ctx.toDebugString().c_str(), name.c_str(),
168 mwd.description);
Steven Morelandedd4e072021-04-21 00:27:29 +0000169 return true; // break
Steven Moreland86a17f82019-09-10 10:18:00 -0700170 }
Steven Moreland2e293aa2020-09-23 00:25:16 +0000171 return false; // continue
172 });
173
174 if (!found) {
Devin Moore42407bc2023-09-26 21:30:39 +0000175 std::set<std::string> instances;
176 forEachManifest([&](const ManifestWithDescription& mwd) {
177 std::set<std::string> res = mwd.manifest->getAidlInstances(aname.package, aname.iface);
178 instances.insert(res.begin(), res.end());
179 return true;
180 });
181
182 std::string available;
183 if (instances.empty()) {
184 available = "No alternative instances declared in VINTF";
185 } else {
186 // for logging only. We can't return this information to the client
187 // because they may not have permissions to find or list those
188 // instances
189 available = "VINTF declared instances: " + base::Join(instances, ", ");
190 }
Steven Moreland2e293aa2020-09-23 00:25:16 +0000191 // Although it is tested, explicitly rebuilding qualified name, in case it
192 // becomes something unexpected.
Steven Moreland5759db02024-03-27 00:03:05 +0000193 ALOGI("%s Could not find %s.%s/%s in the VINTF manifest. %s.", ctx.toDebugString().c_str(),
194 aname.package.c_str(), aname.iface.c_str(), aname.instance.c_str(),
195 available.c_str());
Steven Moreland86a17f82019-09-10 10:18:00 -0700196 }
Steven Moreland2edde8e2020-04-30 17:04:54 -0700197
Steven Moreland2e293aa2020-09-23 00:25:16 +0000198 return found;
199}
200
Steven Morelandedd4e072021-04-21 00:27:29 +0000201static std::optional<std::string> getVintfUpdatableApex(const std::string& name) {
Jooyung Han205e2822023-12-19 16:59:39 +0900202 NativeName nname;
203 if (NativeName::fill(name, &nname)) {
204 std::optional<std::string> updatableViaApex;
205
206 forEachManifest([&](const ManifestWithDescription& mwd) {
207 bool cont = mwd.manifest->forEachInstance([&](const auto& manifestInstance) {
208 if (manifestInstance.format() != vintf::HalFormat::NATIVE) return true;
209 if (manifestInstance.package() != nname.package) return true;
210 if (manifestInstance.instance() != nname.instance) return true;
211 updatableViaApex = manifestInstance.updatableViaApex();
212 return false; // break (libvintf uses opposite convention)
213 });
214 return !cont;
215 });
216
217 return updatableViaApex;
218 }
219
Steven Morelandedd4e072021-04-21 00:27:29 +0000220 AidlName aname;
Devin Moore9d1dfa02024-07-23 21:40:05 +0000221 if (!AidlName::fill(name, &aname, true)) return std::nullopt;
Steven Morelandedd4e072021-04-21 00:27:29 +0000222
223 std::optional<std::string> updatableViaApex;
224
225 forEachManifest([&](const ManifestWithDescription& mwd) {
Jooyung Han9f1c6872024-01-23 06:42:02 +0900226 bool cont = mwd.manifest->forEachInstance([&](const auto& manifestInstance) {
Steven Morelandedd4e072021-04-21 00:27:29 +0000227 if (manifestInstance.format() != vintf::HalFormat::AIDL) return true;
228 if (manifestInstance.package() != aname.package) return true;
229 if (manifestInstance.interface() != aname.iface) return true;
230 if (manifestInstance.instance() != aname.instance) return true;
231 updatableViaApex = manifestInstance.updatableViaApex();
232 return false; // break (libvintf uses opposite convention)
233 });
Jooyung Han9f1c6872024-01-23 06:42:02 +0900234 return !cont;
Steven Morelandedd4e072021-04-21 00:27:29 +0000235 });
236
237 return updatableViaApex;
238}
239
Jooyung Han205e2822023-12-19 16:59:39 +0900240static std::vector<std::string> getVintfUpdatableNames(const std::string& apexName) {
241 std::vector<std::string> names;
Jooyung Han76944fe2022-10-25 17:02:45 +0900242
243 forEachManifest([&](const ManifestWithDescription& mwd) {
244 mwd.manifest->forEachInstance([&](const auto& manifestInstance) {
Jooyung Han205e2822023-12-19 16:59:39 +0900245 if (manifestInstance.updatableViaApex().has_value() &&
Jooyung Han76944fe2022-10-25 17:02:45 +0900246 manifestInstance.updatableViaApex().value() == apexName) {
Jooyung Han205e2822023-12-19 16:59:39 +0900247 if (manifestInstance.format() == vintf::HalFormat::NATIVE) {
248 names.push_back(getNativeInstanceName(manifestInstance));
249 } else if (manifestInstance.format() == vintf::HalFormat::AIDL) {
250 names.push_back(getAidlInstanceName(manifestInstance));
251 }
Jooyung Han76944fe2022-10-25 17:02:45 +0900252 }
Jooyung Hance94b752022-11-14 18:55:06 +0900253 return true; // continue (libvintf uses opposite convention)
Jooyung Han76944fe2022-10-25 17:02:45 +0900254 });
255 return false; // continue
256 });
257
Jooyung Han205e2822023-12-19 16:59:39 +0900258 return names;
Jooyung Han76944fe2022-10-25 17:02:45 +0900259}
260
Alice Wang8578f132024-05-03 09:01:56 +0000261static std::optional<std::string> getVintfAccessorName(const std::string& name) {
262 AidlName aname;
Devin Moore9d1dfa02024-07-23 21:40:05 +0000263 if (!AidlName::fill(name, &aname, false)) return std::nullopt;
Alice Wang8578f132024-05-03 09:01:56 +0000264
265 std::optional<std::string> accessor;
266 forEachManifest([&](const ManifestWithDescription& mwd) {
267 mwd.manifest->forEachInstance([&](const auto& manifestInstance) {
268 if (manifestInstance.format() != vintf::HalFormat::AIDL) return true;
269 if (manifestInstance.package() != aname.package) return true;
270 if (manifestInstance.interface() != aname.iface) return true;
271 if (manifestInstance.instance() != aname.instance) return true;
272 accessor = manifestInstance.accessor();
273 return false; // break (libvintf uses opposite convention)
274 });
275 return false; // continue
276 });
277 return accessor;
278}
279
Devin Moore5e4c2f12021-09-09 22:36:33 +0000280static std::optional<ConnectionInfo> getVintfConnectionInfo(const std::string& name) {
281 AidlName aname;
Devin Moore9d1dfa02024-07-23 21:40:05 +0000282 if (!AidlName::fill(name, &aname, true)) return std::nullopt;
Devin Moore5e4c2f12021-09-09 22:36:33 +0000283
284 std::optional<std::string> ip;
285 std::optional<uint64_t> port;
286 forEachManifest([&](const ManifestWithDescription& mwd) {
287 mwd.manifest->forEachInstance([&](const auto& manifestInstance) {
288 if (manifestInstance.format() != vintf::HalFormat::AIDL) return true;
289 if (manifestInstance.package() != aname.package) return true;
290 if (manifestInstance.interface() != aname.iface) return true;
291 if (manifestInstance.instance() != aname.instance) return true;
292 ip = manifestInstance.ip();
293 port = manifestInstance.port();
294 return false; // break (libvintf uses opposite convention)
295 });
296 return false; // continue
297 });
298
299 if (ip.has_value() && port.has_value()) {
300 ConnectionInfo info;
301 info.ipAddress = *ip;
302 info.port = *port;
303 return std::make_optional<ConnectionInfo>(info);
304 } else {
305 return std::nullopt;
306 }
307}
308
Steven Moreland2e293aa2020-09-23 00:25:16 +0000309static std::vector<std::string> getVintfInstances(const std::string& interface) {
310 size_t lastDot = interface.rfind('.');
311 if (lastDot == std::string::npos) {
Jooyung Han205e2822023-12-19 16:59:39 +0900312 // This might be a package for native instance.
313 std::vector<std::string> ret;
314 (void)forEachManifest([&](const ManifestWithDescription& mwd) {
315 auto instances = mwd.manifest->getNativeInstances(interface);
316 ret.insert(ret.end(), instances.begin(), instances.end());
317 return false; // continue
318 });
319 // If found, return it without error log.
320 if (!ret.empty()) {
321 return ret;
322 }
323
Pawan Wagh37526162022-09-29 21:55:26 +0000324 ALOGE("VINTF interfaces require names in Java package format (e.g. some.package.foo.IFoo) "
325 "but got: %s",
326 interface.c_str());
Steven Moreland2e293aa2020-09-23 00:25:16 +0000327 return {};
328 }
329 const std::string package = interface.substr(0, lastDot);
330 const std::string iface = interface.substr(lastDot+1);
331
332 std::vector<std::string> ret;
333 (void)forEachManifest([&](const ManifestWithDescription& mwd) {
334 auto instances = mwd.manifest->getAidlInstances(package, iface);
335 ret.insert(ret.end(), instances.begin(), instances.end());
336 return false; // continue
337 });
338
339 return ret;
Steven Moreland86a17f82019-09-10 10:18:00 -0700340}
Steven Morelandb82b8f82019-10-28 10:52:34 -0700341
Steven Moreland5759db02024-03-27 00:03:05 +0000342static bool meetsDeclarationRequirements(const Access::CallingContext& ctx,
343 const sp<IBinder>& binder, const std::string& name) {
Steven Morelandb82b8f82019-10-28 10:52:34 -0700344 if (!Stability::requiresVintfDeclaration(binder)) {
345 return true;
346 }
347
Steven Moreland5759db02024-03-27 00:03:05 +0000348 return isVintfDeclared(ctx, name);
Steven Morelandb82b8f82019-10-28 10:52:34 -0700349}
Steven Moreland86a17f82019-09-10 10:18:00 -0700350#endif // !VENDORSERVICEMANAGER
351
Steven Morelandb8361902023-02-01 23:18:04 +0000352ServiceManager::Service::~Service() {
Steven Morelandcb591562023-03-06 15:53:44 +0000353 if (hasClients) {
354 // only expected to happen on process death, we don't store the service
355 // name this late (it's in the map that holds this service), but if it
356 // is happening, we might want to change 'unlinkToDeath' to explicitly
357 // clear this bit so that we can abort in other cases, where it would
358 // mean inconsistent logic in servicemanager (unexpected and tested, but
359 // the original lazy service impl here had that bug).
Steven Moreland5759db02024-03-27 00:03:05 +0000360 ALOGW("A service was removed when there are clients");
Steven Morelandb8361902023-02-01 23:18:04 +0000361 }
362}
363
Steven Morelandd13f08b2019-11-18 14:23:09 -0800364ServiceManager::ServiceManager(std::unique_ptr<Access>&& access) : mAccess(std::move(access)) {
Steven Moreland8d0c9a72020-04-30 16:51:56 -0700365// TODO(b/151696835): reenable performance hack when we solve bug, since with
366// this hack and other fixes, it is unlikely we will see even an ephemeral
367// failure when the manifest parse fails. The goal is that the manifest will
368// be read incorrectly and cause the process trying to register a HAL to
369// fail. If this is in fact an early boot kernel contention issue, then we
370// will get no failure, and by its absence, be signalled to invest more
371// effort in re-adding this performance hack.
372// #ifndef VENDORSERVICEMANAGER
373// // can process these at any times, don't want to delay first VINTF client
374// std::thread([] {
375// vintf::VintfObject::GetDeviceHalManifest();
376// vintf::VintfObject::GetFrameworkHalManifest();
377// }).detach();
378// #endif // !VENDORSERVICEMANAGER
Steven Morelandd13f08b2019-11-18 14:23:09 -0800379}
Steven Moreland130242d2019-08-26 17:41:32 -0700380ServiceManager::~ServiceManager() {
381 // this should only happen in tests
382
Jon Spivackf288b1d2019-12-19 17:15:51 -0800383 for (const auto& [name, callbacks] : mNameToRegistrationCallback) {
Steven Moreland27cfab02019-08-12 14:34:16 -0700384 CHECK(!callbacks.empty()) << name;
385 for (const auto& callback : callbacks) {
386 CHECK(callback != nullptr) << name;
387 }
388 }
389
Steven Moreland130242d2019-08-26 17:41:32 -0700390 for (const auto& [name, service] : mNameToService) {
391 CHECK(service.binder != nullptr) << name;
392 }
393}
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700394
Alice Wang11da1502024-07-25 12:03:22 +0000395Status ServiceManager::getService(const std::string& name, sp<IBinder>* outBinder) {
396 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
397 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
398
Parth Sane5e1b7e12024-11-29 10:40:41 +0000399 *outBinder = tryGetBinder(name, true).service;
Alice Wang11da1502024-07-25 12:03:22 +0000400 // returns ok regardless of result for legacy reasons
401 return Status::ok();
402}
403
404Status ServiceManager::getService2(const std::string& name, os::Service* outService) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000405 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
406 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000407
Alice Wang8578f132024-05-03 09:01:56 +0000408 *outService = tryGetService(name, true);
Jon Spivack0d844302019-07-22 18:40:34 -0700409 // returns ok regardless of result for legacy reasons
410 return Status::ok();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700411}
412
Alice Wang8578f132024-05-03 09:01:56 +0000413Status ServiceManager::checkService(const std::string& name, os::Service* outService) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000414 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
415 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000416
Alice Wang8578f132024-05-03 09:01:56 +0000417 *outService = tryGetService(name, false);
Jon Spivack0d844302019-07-22 18:40:34 -0700418 // returns ok regardless of result for legacy reasons
419 return Status::ok();
420}
421
Alice Wang8578f132024-05-03 09:01:56 +0000422os::Service ServiceManager::tryGetService(const std::string& name, bool startIfNotFound) {
423 std::optional<std::string> accessorName;
424#ifndef VENDORSERVICEMANAGER
425 accessorName = getVintfAccessorName(name);
426#endif
427 if (accessorName.has_value()) {
428 auto ctx = mAccess->getCallingContext();
429 if (!mAccess->canFind(ctx, name)) {
430 return os::Service::make<os::Service::Tag::accessor>(nullptr);
431 }
432 return os::Service::make<os::Service::Tag::accessor>(
Parth Sane5e1b7e12024-11-29 10:40:41 +0000433 tryGetBinder(*accessorName, startIfNotFound).service);
Alice Wang8578f132024-05-03 09:01:56 +0000434 } else {
Parth Sane5e1b7e12024-11-29 10:40:41 +0000435 return os::Service::make<os::Service::Tag::serviceWithMetadata>(
436 tryGetBinder(name, startIfNotFound));
Alice Wang8578f132024-05-03 09:01:56 +0000437 }
438}
439
Parth Sane5e1b7e12024-11-29 10:40:41 +0000440os::ServiceWithMetadata ServiceManager::tryGetBinder(const std::string& name,
441 bool startIfNotFound) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000442 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
443 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000444
Steven Morelanda9fe4742019-07-18 14:45:20 -0700445 auto ctx = mAccess->getCallingContext();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700446
Jon Spivack0d844302019-07-22 18:40:34 -0700447 sp<IBinder> out;
Jon Spivack9f503a42019-10-22 16:49:19 -0700448 Service* service = nullptr;
Jon Spivack0d844302019-07-22 18:40:34 -0700449 if (auto it = mNameToService.find(name); it != mNameToService.end()) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700450 service = &(it->second);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700451
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000452 if (!service->allowIsolated && is_multiuser_uid_isolated(ctx.uid)) {
Steven Morelandbad75882023-06-16 20:59:06 +0000453 LOG(WARNING) << "Isolated app with UID " << ctx.uid << " requested '" << name
454 << "', but the service is not allowed for isolated apps.";
Parth Sane5e1b7e12024-11-29 10:40:41 +0000455 return os::ServiceWithMetadata();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700456 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700457 out = service->binder;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700458 }
459
Steven Morelanda9fe4742019-07-18 14:45:20 -0700460 if (!mAccess->canFind(ctx, name)) {
Parth Sane5e1b7e12024-11-29 10:40:41 +0000461 return os::ServiceWithMetadata();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700462 }
463
Jon Spivack0d844302019-07-22 18:40:34 -0700464 if (!out && startIfNotFound) {
Steven Morelandaa33e852023-05-10 16:42:15 +0000465 tryStartService(ctx, name);
Jon Spivack0d844302019-07-22 18:40:34 -0700466 }
467
Jon Spivack9f503a42019-10-22 16:49:19 -0700468 if (out) {
Steven Morelandb8361902023-02-01 23:18:04 +0000469 // Force onClients to get sent, and then make sure the timerfd won't clear it
470 // by setting guaranteeClient again. This logic could be simplified by using
471 // a time-based guarantee. However, forcing onClients(true) to get sent
472 // right here is always going to be important for processes serving multiple
473 // lazy interfaces.
474 service->guaranteeClient = true;
475 CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false));
Jon Spivack9f503a42019-10-22 16:49:19 -0700476 service->guaranteeClient = true;
477 }
Parth Sane5e1b7e12024-11-29 10:40:41 +0000478 os::ServiceWithMetadata serviceWithMetadata = os::ServiceWithMetadata();
479 serviceWithMetadata.service = out;
480 serviceWithMetadata.isLazyService =
481 service ? service->dumpPriority & FLAG_IS_LAZY_SERVICE : false;
482 return serviceWithMetadata;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700483}
484
Steven Moreland905e2e82019-07-17 11:05:45 -0700485bool isValidServiceName(const std::string& name) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000486 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
487 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000488
Steven Moreland905e2e82019-07-17 11:05:45 -0700489 if (name.size() == 0) return false;
490 if (name.size() > 127) return false;
491
492 for (char c : name) {
Steven Morelandbb7951d2019-08-20 16:58:25 -0700493 if (c == '_' || c == '-' || c == '.' || c == '/') continue;
Steven Moreland905e2e82019-07-17 11:05:45 -0700494 if (c >= 'a' && c <= 'z') continue;
495 if (c >= 'A' && c <= 'Z') continue;
496 if (c >= '0' && c <= '9') continue;
497 return false;
498 }
499
500 return true;
501}
502
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700503Status ServiceManager::addService(const std::string& name, const sp<IBinder>& binder, bool allowIsolated, int32_t dumpPriority) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000504 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
505 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000506
Steven Morelanda9fe4742019-07-18 14:45:20 -0700507 auto ctx = mAccess->getCallingContext();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700508
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700509 if (multiuser_get_app_id(ctx.uid) >= AID_APP) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000510 return Status::fromExceptionCode(Status::EX_SECURITY, "App UIDs cannot add services.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700511 }
512
Alice Wangd404e0f2024-07-26 16:18:09 +0000513 std::optional<std::string> accessorName;
514 if (auto status = canAddService(ctx, name, &accessorName); !status.isOk()) {
515 return status;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700516 }
517
518 if (binder == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000519 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Null binder.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700520 }
521
Steven Moreland905e2e82019-07-17 11:05:45 -0700522 if (!isValidServiceName(name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000523 ALOGE("%s Invalid service name: %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000524 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Invalid service name.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700525 }
526
Steven Moreland86a17f82019-09-10 10:18:00 -0700527#ifndef VENDORSERVICEMANAGER
Steven Moreland5759db02024-03-27 00:03:05 +0000528 if (!meetsDeclarationRequirements(ctx, binder, name)) {
Steven Moreland86a17f82019-09-10 10:18:00 -0700529 // already logged
Steven Morelandffb905b2023-03-28 18:24:37 +0000530 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "VINTF declaration error.");
Steven Moreland86a17f82019-09-10 10:18:00 -0700531 }
532#endif // !VENDORSERVICEMANAGER
533
Devin Moore4e21def2023-02-24 21:54:14 +0000534 if ((dumpPriority & DUMP_FLAG_PRIORITY_ALL) == 0) {
Steven Moreland5759db02024-03-27 00:03:05 +0000535 ALOGW("%s Dump flag priority is not set when adding %s", ctx.toDebugString().c_str(),
536 name.c_str());
Devin Moore4e21def2023-02-24 21:54:14 +0000537 }
538
Steven Moreland88860b02019-08-12 14:24:14 -0700539 // implicitly unlinked when the binder is removed
Steven Morelandb0983182021-04-02 03:14:04 +0000540 if (binder->remoteBinder() != nullptr &&
541 binder->linkToDeath(sp<ServiceManager>::fromExisting(this)) != OK) {
Steven Moreland5759db02024-03-27 00:03:05 +0000542 ALOGE("%s Could not linkToDeath when adding %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000543 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't linkToDeath.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700544 }
545
Steven Moreland7ee423b2022-09-24 03:52:08 +0000546 auto it = mNameToService.find(name);
Steven Moreland79578672023-04-27 19:38:00 +0000547 bool prevClients = false;
Steven Moreland7ee423b2022-09-24 03:52:08 +0000548 if (it != mNameToService.end()) {
549 const Service& existing = it->second;
Steven Moreland79578672023-04-27 19:38:00 +0000550 prevClients = existing.hasClients;
Steven Moreland7ee423b2022-09-24 03:52:08 +0000551
552 // We could do better than this because if the other service dies, it
553 // may not have an entry here. However, this case is unlikely. We are
554 // only trying to detect when two different services are accidentally installed.
555
556 if (existing.ctx.uid != ctx.uid) {
Pawan Wagh37526162022-09-29 21:55:26 +0000557 ALOGW("Service '%s' originally registered from UID %u but it is now being registered "
558 "from UID %u. Multiple instances installed?",
559 name.c_str(), existing.ctx.uid, ctx.uid);
Steven Moreland7ee423b2022-09-24 03:52:08 +0000560 }
561
562 if (existing.ctx.sid != ctx.sid) {
Pawan Wagh37526162022-09-29 21:55:26 +0000563 ALOGW("Service '%s' originally registered from SID %s but it is now being registered "
564 "from SID %s. Multiple instances installed?",
565 name.c_str(), existing.ctx.sid.c_str(), ctx.sid.c_str());
Steven Moreland7ee423b2022-09-24 03:52:08 +0000566 }
567
Pawan Wagh37526162022-09-29 21:55:26 +0000568 ALOGI("Service '%s' originally registered from PID %d but it is being registered again "
569 "from PID %d. Bad state? Late death notification? Multiple instances installed?",
570 name.c_str(), existing.ctx.debugPid, ctx.debugPid);
Steven Moreland7ee423b2022-09-24 03:52:08 +0000571 }
572
Devin Moore05ffe522020-08-06 13:58:29 -0700573 // Overwrite the old service if it exists
Steven Moreland7ee423b2022-09-24 03:52:08 +0000574 mNameToService[name] = Service{
575 .binder = binder,
576 .allowIsolated = allowIsolated,
577 .dumpPriority = dumpPriority,
Steven Moreland79578672023-04-27 19:38:00 +0000578 .hasClients = prevClients, // see b/279898063, matters if existing callbacks
Steven Morelandefea66b2023-06-17 01:59:34 +0000579 .guaranteeClient = false,
Steven Moreland7ee423b2022-09-24 03:52:08 +0000580 .ctx = ctx,
Devin Moore05ffe522020-08-06 13:58:29 -0700581 };
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700582
Steven Moreland7ee423b2022-09-24 03:52:08 +0000583 if (auto it = mNameToRegistrationCallback.find(name); it != mNameToRegistrationCallback.end()) {
Steven Morelandefea66b2023-06-17 01:59:34 +0000584 // If someone is currently waiting on the service, notify the service that
585 // we're waiting and flush it to the service.
Steven Morelandb8361902023-02-01 23:18:04 +0000586 mNameToService[name].guaranteeClient = true;
587 CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false));
588 mNameToService[name].guaranteeClient = true;
589
Steven Moreland27cfab02019-08-12 14:34:16 -0700590 for (const sp<IServiceCallback>& cb : it->second) {
591 // permission checked in registerForNotifications
592 cb->onRegistration(name, binder);
593 }
594 }
595
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700596 return Status::ok();
597}
598
599Status ServiceManager::listServices(int32_t dumpPriority, std::vector<std::string>* outList) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000600 SM_PERFETTO_TRACE_FUNC();
601
Steven Morelanda9fe4742019-07-18 14:45:20 -0700602 if (!mAccess->canList(mAccess->getCallingContext())) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000603 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700604 }
605
606 size_t toReserve = 0;
607 for (auto const& [name, service] : mNameToService) {
608 (void) name;
609
610 if (service.dumpPriority & dumpPriority) ++toReserve;
611 }
612
613 CHECK(outList->empty());
614
615 outList->reserve(toReserve);
616 for (auto const& [name, service] : mNameToService) {
617 (void) service;
618
619 if (service.dumpPriority & dumpPriority) {
620 outList->push_back(name);
621 }
622 }
623
624 return Status::ok();
625}
626
Steven Moreland27cfab02019-08-12 14:34:16 -0700627Status ServiceManager::registerForNotifications(
628 const std::string& name, const sp<IServiceCallback>& callback) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000629 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
630 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000631
Steven Moreland27cfab02019-08-12 14:34:16 -0700632 auto ctx = mAccess->getCallingContext();
633
Alice Wang8578f132024-05-03 09:01:56 +0000634 // TODO(b/338541373): Implement the notification mechanism for services accessed via
635 // IAccessor.
636 std::optional<std::string> accessorName;
637 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
638 return status;
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000639 }
640
641 // note - we could allow isolated apps to get notifications if we
642 // keep track of isolated callbacks and non-isolated callbacks, but
643 // this is done since isolated apps shouldn't access lazy services
644 // so we should be able to use different APIs to keep things simple.
645 // Here, we disallow everything, because the service might not be
646 // registered yet.
647 if (is_multiuser_uid_isolated(ctx.uid)) {
648 return Status::fromExceptionCode(Status::EX_SECURITY, "isolated app");
Steven Moreland27cfab02019-08-12 14:34:16 -0700649 }
650
651 if (!isValidServiceName(name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000652 ALOGE("%s Invalid service name: %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000653 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Invalid service name.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700654 }
655
656 if (callback == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000657 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Null callback.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700658 }
659
Steven Morelandb0983182021-04-02 03:14:04 +0000660 if (OK !=
661 IInterface::asBinder(callback)->linkToDeath(
662 sp<ServiceManager>::fromExisting(this))) {
Steven Moreland5759db02024-03-27 00:03:05 +0000663 ALOGE("%s Could not linkToDeath when adding %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000664 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't link to death.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700665 }
666
Jon Spivackf288b1d2019-12-19 17:15:51 -0800667 mNameToRegistrationCallback[name].push_back(callback);
Steven Moreland27cfab02019-08-12 14:34:16 -0700668
669 if (auto it = mNameToService.find(name); it != mNameToService.end()) {
670 const sp<IBinder>& binder = it->second.binder;
671
672 // never null if an entry exists
673 CHECK(binder != nullptr) << name;
674 callback->onRegistration(name, binder);
675 }
676
677 return Status::ok();
678}
679Status ServiceManager::unregisterForNotifications(
680 const std::string& name, const sp<IServiceCallback>& callback) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000681 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
682 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000683
Steven Moreland27cfab02019-08-12 14:34:16 -0700684 auto ctx = mAccess->getCallingContext();
685
Alice Wang8578f132024-05-03 09:01:56 +0000686 std::optional<std::string> accessorName;
687 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
688 return status;
Steven Moreland27cfab02019-08-12 14:34:16 -0700689 }
690
691 bool found = false;
692
Jon Spivackf288b1d2019-12-19 17:15:51 -0800693 auto it = mNameToRegistrationCallback.find(name);
694 if (it != mNameToRegistrationCallback.end()) {
695 removeRegistrationCallback(IInterface::asBinder(callback), &it, &found);
Steven Moreland27cfab02019-08-12 14:34:16 -0700696 }
697
698 if (!found) {
Steven Moreland5759db02024-03-27 00:03:05 +0000699 ALOGE("%s Trying to unregister callback, but none exists %s", ctx.toDebugString().c_str(),
700 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000701 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Nothing to unregister.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700702 }
703
704 return Status::ok();
705}
706
Steven Morelandb82b8f82019-10-28 10:52:34 -0700707Status ServiceManager::isDeclared(const std::string& name, bool* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000708 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
709 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000710
Steven Morelandb82b8f82019-10-28 10:52:34 -0700711 auto ctx = mAccess->getCallingContext();
712
Alice Wang8578f132024-05-03 09:01:56 +0000713 std::optional<std::string> accessorName;
714 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
715 return status;
Steven Morelandb82b8f82019-10-28 10:52:34 -0700716 }
717
718 *outReturn = false;
719
720#ifndef VENDORSERVICEMANAGER
Steven Moreland5759db02024-03-27 00:03:05 +0000721 *outReturn = isVintfDeclared(ctx, name);
Steven Morelandb82b8f82019-10-28 10:52:34 -0700722#endif
723 return Status::ok();
724}
725
Steven Moreland2e293aa2020-09-23 00:25:16 +0000726binder::Status ServiceManager::getDeclaredInstances(const std::string& interface, std::vector<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000727 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
728 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoInterfaceName, interface.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000729
Steven Moreland2e293aa2020-09-23 00:25:16 +0000730 auto ctx = mAccess->getCallingContext();
731
732 std::vector<std::string> allInstances;
733#ifndef VENDORSERVICEMANAGER
734 allInstances = getVintfInstances(interface);
735#endif
736
737 outReturn->clear();
738
Alice Wang8578f132024-05-03 09:01:56 +0000739 std::optional<std::string> _accessorName;
Steven Moreland2e293aa2020-09-23 00:25:16 +0000740 for (const std::string& instance : allInstances) {
Alice Wang8578f132024-05-03 09:01:56 +0000741 if (auto status = canFindService(ctx, interface + "/" + instance, &_accessorName);
742 status.isOk()) {
Steven Moreland2e293aa2020-09-23 00:25:16 +0000743 outReturn->push_back(instance);
744 }
745 }
746
747 if (outReturn->size() == 0 && allInstances.size() != 0) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000748 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland2e293aa2020-09-23 00:25:16 +0000749 }
750
751 return Status::ok();
752}
753
Steven Morelandedd4e072021-04-21 00:27:29 +0000754Status ServiceManager::updatableViaApex(const std::string& name,
755 std::optional<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000756 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
757 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000758
Steven Morelandedd4e072021-04-21 00:27:29 +0000759 auto ctx = mAccess->getCallingContext();
760
Alice Wang8578f132024-05-03 09:01:56 +0000761 std::optional<std::string> _accessorName;
762 if (auto status = canFindService(ctx, name, &_accessorName); !status.isOk()) {
763 return status;
Steven Morelandedd4e072021-04-21 00:27:29 +0000764 }
765
766 *outReturn = std::nullopt;
767
768#ifndef VENDORSERVICEMANAGER
769 *outReturn = getVintfUpdatableApex(name);
770#endif
771 return Status::ok();
772}
773
Jooyung Han76944fe2022-10-25 17:02:45 +0900774Status ServiceManager::getUpdatableNames([[maybe_unused]] const std::string& apexName,
775 std::vector<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000776 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
777 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoApexName, apexName.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000778
Jooyung Han76944fe2022-10-25 17:02:45 +0900779 auto ctx = mAccess->getCallingContext();
780
Jooyung Han205e2822023-12-19 16:59:39 +0900781 std::vector<std::string> apexUpdatableNames;
Jooyung Han76944fe2022-10-25 17:02:45 +0900782#ifndef VENDORSERVICEMANAGER
Jooyung Han205e2822023-12-19 16:59:39 +0900783 apexUpdatableNames = getVintfUpdatableNames(apexName);
Jooyung Han76944fe2022-10-25 17:02:45 +0900784#endif
785
786 outReturn->clear();
787
Alice Wang8578f132024-05-03 09:01:56 +0000788 std::optional<std::string> _accessorName;
Jooyung Han205e2822023-12-19 16:59:39 +0900789 for (const std::string& name : apexUpdatableNames) {
Alice Wang8578f132024-05-03 09:01:56 +0000790 if (auto status = canFindService(ctx, name, &_accessorName); status.isOk()) {
Jooyung Han205e2822023-12-19 16:59:39 +0900791 outReturn->push_back(name);
Jooyung Han76944fe2022-10-25 17:02:45 +0900792 }
793 }
794
Jooyung Han205e2822023-12-19 16:59:39 +0900795 if (outReturn->size() == 0 && apexUpdatableNames.size() != 0) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000796 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Jooyung Han76944fe2022-10-25 17:02:45 +0900797 }
Jooyung Han76944fe2022-10-25 17:02:45 +0900798 return Status::ok();
799}
800
Devin Moore5e4c2f12021-09-09 22:36:33 +0000801Status ServiceManager::getConnectionInfo(const std::string& name,
802 std::optional<ConnectionInfo>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000803 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
804 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000805
Devin Moore5e4c2f12021-09-09 22:36:33 +0000806 auto ctx = mAccess->getCallingContext();
807
Alice Wang8578f132024-05-03 09:01:56 +0000808 std::optional<std::string> _accessorName;
809 if (auto status = canFindService(ctx, name, &_accessorName); !status.isOk()) {
810 return status;
Devin Moore5e4c2f12021-09-09 22:36:33 +0000811 }
812
813 *outReturn = std::nullopt;
814
815#ifndef VENDORSERVICEMANAGER
816 *outReturn = getVintfConnectionInfo(name);
817#endif
818 return Status::ok();
819}
820
Jon Spivackf288b1d2019-12-19 17:15:51 -0800821void ServiceManager::removeRegistrationCallback(const wp<IBinder>& who,
822 ServiceCallbackMap::iterator* it,
Steven Moreland27cfab02019-08-12 14:34:16 -0700823 bool* found) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000824 SM_PERFETTO_TRACE_FUNC();
825
Steven Moreland27cfab02019-08-12 14:34:16 -0700826 std::vector<sp<IServiceCallback>>& listeners = (*it)->second;
827
828 for (auto lit = listeners.begin(); lit != listeners.end();) {
829 if (IInterface::asBinder(*lit) == who) {
830 if(found) *found = true;
831 lit = listeners.erase(lit);
832 } else {
833 ++lit;
834 }
835 }
836
837 if (listeners.empty()) {
Jon Spivackf288b1d2019-12-19 17:15:51 -0800838 *it = mNameToRegistrationCallback.erase(*it);
Steven Moreland27cfab02019-08-12 14:34:16 -0700839 } else {
Jon Spivacke223f082019-11-19 16:21:20 -0800840 (*it)++;
Steven Moreland27cfab02019-08-12 14:34:16 -0700841 }
842}
843
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700844void ServiceManager::binderDied(const wp<IBinder>& who) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000845 SM_PERFETTO_TRACE_FUNC();
846
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700847 for (auto it = mNameToService.begin(); it != mNameToService.end();) {
848 if (who == it->second.binder) {
Steven Moreland79578672023-04-27 19:38:00 +0000849 // TODO: currently, this entry contains the state also
850 // associated with mNameToClientCallback. If we allowed
851 // other processes to register client callbacks, we
852 // would have to preserve hasClients (perhaps moving
853 // that state into mNameToClientCallback, which is complicated
854 // because those callbacks are associated w/ particular binder
855 // objects, though they are indexed by name now, they may
856 // need to be indexed by binder at that point).
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700857 it = mNameToService.erase(it);
858 } else {
859 ++it;
860 }
861 }
Steven Moreland27cfab02019-08-12 14:34:16 -0700862
Jon Spivackf288b1d2019-12-19 17:15:51 -0800863 for (auto it = mNameToRegistrationCallback.begin(); it != mNameToRegistrationCallback.end();) {
864 removeRegistrationCallback(who, &it, nullptr /*found*/);
Steven Moreland27cfab02019-08-12 14:34:16 -0700865 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700866
867 for (auto it = mNameToClientCallback.begin(); it != mNameToClientCallback.end();) {
868 removeClientCallback(who, &it);
869 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700870}
871
Steven Morelandaa33e852023-05-10 16:42:15 +0000872void ServiceManager::tryStartService(const Access::CallingContext& ctx, const std::string& name) {
Steven Moreland5759db02024-03-27 00:03:05 +0000873 ALOGI("%s Since '%s' could not be found trying to start it as a lazy AIDL service. (if it's "
874 "not configured to be a lazy service, it may be stuck starting or still starting).",
875 ctx.toDebugString().c_str(), name.c_str());
Jon Spivack0d844302019-07-22 18:40:34 -0700876
877 std::thread([=] {
Steven Morelandbfe9fba2021-04-27 18:39:57 +0000878 if (!base::SetProperty("ctl.interface_start", "aidl/" + name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000879 ALOGI("%s Tried to start aidl service %s as a lazy service, but was unable to. Usually "
880 "this happens when a service is not installed, but if the service is intended to "
881 "be used as a lazy service, then it may be configured incorrectly.",
882 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandbfe9fba2021-04-27 18:39:57 +0000883 }
Jon Spivack0d844302019-07-22 18:40:34 -0700884 }).detach();
885}
886
Jon Spivack9f503a42019-10-22 16:49:19 -0700887Status ServiceManager::registerClientCallback(const std::string& name, const sp<IBinder>& service,
888 const sp<IClientCallback>& cb) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000889 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
890 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000891
Jon Spivack9f503a42019-10-22 16:49:19 -0700892 if (cb == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000893 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Callback null.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700894 }
895
896 auto ctx = mAccess->getCallingContext();
Alice Wangd404e0f2024-07-26 16:18:09 +0000897 std::optional<std::string> accessorName;
898 if (auto status = canAddService(ctx, name, &accessorName); !status.isOk()) {
899 return status;
Jon Spivack9f503a42019-10-22 16:49:19 -0700900 }
901
902 auto serviceIt = mNameToService.find(name);
903 if (serviceIt == mNameToService.end()) {
Steven Moreland5759db02024-03-27 00:03:05 +0000904 ALOGE("%s Could not add callback for nonexistent service: %s", ctx.toDebugString().c_str(),
905 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000906 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Service doesn't exist.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700907 }
908
Steven Moreland7ee423b2022-09-24 03:52:08 +0000909 if (serviceIt->second.ctx.debugPid != IPCThreadState::self()->getCallingPid()) {
Steven Moreland5759db02024-03-27 00:03:05 +0000910 ALOGW("%s Only a server can register for client callbacks (for %s)",
911 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000912 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
913 "Only service can register client callback for itself.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700914 }
915
916 if (serviceIt->second.binder != service) {
Steven Moreland5759db02024-03-27 00:03:05 +0000917 ALOGW("%s Tried to register client callback for %s but a different service is registered "
Pawan Wagh37526162022-09-29 21:55:26 +0000918 "under this name.",
Steven Moreland5759db02024-03-27 00:03:05 +0000919 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000920 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Service mismatch.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700921 }
922
Steven Morelandb0983182021-04-02 03:14:04 +0000923 if (OK !=
924 IInterface::asBinder(cb)->linkToDeath(sp<ServiceManager>::fromExisting(this))) {
David Duarte67d65282024-04-10 23:54:36 +0000925 ALOGE("%s Could not linkToDeath when adding client callback for %s",
926 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000927 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't linkToDeath.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700928 }
929
Steven Moreland79578672023-04-27 19:38:00 +0000930 // WARNING: binderDied makes an assumption about this. If we open up client
931 // callbacks to other services, certain race conditions may lead to services
932 // getting extra client callback notifications.
933 // Make sure all callbacks have been told about a consistent state - b/278038751
Steven Moreland7bb4ab82023-04-13 20:29:33 +0000934 if (serviceIt->second.hasClients) {
935 cb->onClients(service, true);
936 }
937
Jon Spivack9f503a42019-10-22 16:49:19 -0700938 mNameToClientCallback[name].push_back(cb);
939
Steven Morelandefea66b2023-06-17 01:59:34 +0000940 // Flush updated info to client callbacks (especially if guaranteeClient
941 // and !hasClient, see b/285202885). We may or may not have clients at
942 // this point, so ignore the return value.
943 (void)handleServiceClientCallback(2 /* sm + transaction */, name, false);
944
Jon Spivack9f503a42019-10-22 16:49:19 -0700945 return Status::ok();
946}
947
948void ServiceManager::removeClientCallback(const wp<IBinder>& who,
949 ClientCallbackMap::iterator* it) {
950 std::vector<sp<IClientCallback>>& listeners = (*it)->second;
951
952 for (auto lit = listeners.begin(); lit != listeners.end();) {
953 if (IInterface::asBinder(*lit) == who) {
954 lit = listeners.erase(lit);
955 } else {
956 ++lit;
957 }
958 }
959
960 if (listeners.empty()) {
961 *it = mNameToClientCallback.erase(*it);
962 } else {
963 (*it)++;
964 }
965}
966
967ssize_t ServiceManager::Service::getNodeStrongRefCount() {
Steven Morelandb0983182021-04-02 03:14:04 +0000968 sp<BpBinder> bpBinder = sp<BpBinder>::fromExisting(binder->remoteBinder());
Jon Spivack9f503a42019-10-22 16:49:19 -0700969 if (bpBinder == nullptr) return -1;
970
Steven Morelande8393882020-12-18 02:27:20 +0000971 return ProcessState::self()->getStrongRefCountForNode(bpBinder);
Jon Spivack9f503a42019-10-22 16:49:19 -0700972}
973
974void ServiceManager::handleClientCallbacks() {
975 for (const auto& [name, service] : mNameToService) {
Steven Morelandb8361902023-02-01 23:18:04 +0000976 handleServiceClientCallback(1 /* sm has one refcount */, name, true);
Jon Spivack9f503a42019-10-22 16:49:19 -0700977 }
978}
979
Steven Morelandb8361902023-02-01 23:18:04 +0000980bool ServiceManager::handleServiceClientCallback(size_t knownClients,
981 const std::string& serviceName,
982 bool isCalledOnInterval) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700983 auto serviceIt = mNameToService.find(serviceName);
984 if (serviceIt == mNameToService.end() || mNameToClientCallback.count(serviceName) < 1) {
Steven Morelandb8361902023-02-01 23:18:04 +0000985 return true; // return we do have clients a.k.a. DON'T DO ANYTHING
Jon Spivack9f503a42019-10-22 16:49:19 -0700986 }
987
988 Service& service = serviceIt->second;
989 ssize_t count = service.getNodeStrongRefCount();
990
Steven Morelandb8361902023-02-01 23:18:04 +0000991 // binder driver doesn't support this feature, consider we have clients
992 if (count == -1) return true;
Jon Spivack9f503a42019-10-22 16:49:19 -0700993
Steven Morelandb8361902023-02-01 23:18:04 +0000994 bool hasKernelReportedClients = static_cast<size_t>(count) > knownClients;
Jon Spivack9f503a42019-10-22 16:49:19 -0700995
996 if (service.guaranteeClient) {
Steven Morelandb8361902023-02-01 23:18:04 +0000997 if (!service.hasClients && !hasKernelReportedClients) {
Steven Moreland3e083b22023-01-26 00:46:30 +0000998 sendClientCallbackNotifications(serviceName, true,
999 "service is guaranteed to be in use");
Jon Spivack9f503a42019-10-22 16:49:19 -07001000 }
1001
1002 // guarantee is temporary
1003 service.guaranteeClient = false;
1004 }
1005
Steven Morelandb8361902023-02-01 23:18:04 +00001006 // Regardless of this situation, we want to give this notification as soon as possible.
1007 // This way, we have a chance of preventing further thrashing.
1008 if (hasKernelReportedClients && !service.hasClients) {
1009 sendClientCallbackNotifications(serviceName, true, "we now have a record of a client");
1010 }
Steven Moreland66417652023-02-01 22:19:41 +00001011
Steven Morelandb8361902023-02-01 23:18:04 +00001012 // But limit rate of shutting down service.
1013 if (isCalledOnInterval) {
1014 if (!hasKernelReportedClients && service.hasClients) {
Steven Moreland3e083b22023-01-26 00:46:30 +00001015 sendClientCallbackNotifications(serviceName, false,
1016 "we now have no record of a client");
Jon Spivackd9533c22020-01-27 22:19:22 +00001017 }
Jon Spivack9f503a42019-10-22 16:49:19 -07001018 }
1019
Steven Morelandb8361902023-02-01 23:18:04 +00001020 // May be different than 'hasKernelReportedClients'. We intentionally delay
1021 // information about clients going away to reduce thrashing.
1022 return service.hasClients;
Jon Spivack9f503a42019-10-22 16:49:19 -07001023}
1024
Steven Moreland3e083b22023-01-26 00:46:30 +00001025void ServiceManager::sendClientCallbackNotifications(const std::string& serviceName,
1026 bool hasClients, const char* context) {
Jon Spivack9f503a42019-10-22 16:49:19 -07001027 auto serviceIt = mNameToService.find(serviceName);
1028 if (serviceIt == mNameToService.end()) {
Steven Moreland3e083b22023-01-26 00:46:30 +00001029 ALOGW("sendClientCallbackNotifications could not find service %s when %s",
1030 serviceName.c_str(), context);
Jon Spivack9f503a42019-10-22 16:49:19 -07001031 return;
1032 }
1033 Service& service = serviceIt->second;
1034
Steven Morelandb8361902023-02-01 23:18:04 +00001035 CHECK_NE(hasClients, service.hasClients) << context;
Jon Spivack9f503a42019-10-22 16:49:19 -07001036
Steven Morelandb8361902023-02-01 23:18:04 +00001037 ALOGI("Notifying %s they %s (previously: %s) have clients when %s", serviceName.c_str(),
1038 hasClients ? "do" : "don't", service.hasClients ? "do" : "don't", context);
Jon Spivack9f503a42019-10-22 16:49:19 -07001039
1040 auto ccIt = mNameToClientCallback.find(serviceName);
1041 CHECK(ccIt != mNameToClientCallback.end())
Steven Moreland3e083b22023-01-26 00:46:30 +00001042 << "sendClientCallbackNotifications could not find callbacks for service when "
1043 << context;
Jon Spivack9f503a42019-10-22 16:49:19 -07001044
1045 for (const auto& callback : ccIt->second) {
1046 callback->onClients(service.binder, hasClients);
1047 }
1048
1049 service.hasClients = hasClients;
1050}
1051
1052Status ServiceManager::tryUnregisterService(const std::string& name, const sp<IBinder>& binder) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +00001053 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
1054 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +00001055
Jon Spivack9f503a42019-10-22 16:49:19 -07001056 if (binder == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +00001057 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Null service.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001058 }
1059
1060 auto ctx = mAccess->getCallingContext();
Alice Wangd404e0f2024-07-26 16:18:09 +00001061 std::optional<std::string> accessorName;
1062 if (auto status = canAddService(ctx, name, &accessorName); !status.isOk()) {
1063 return status;
Jon Spivack9f503a42019-10-22 16:49:19 -07001064 }
1065
1066 auto serviceIt = mNameToService.find(name);
1067 if (serviceIt == mNameToService.end()) {
Steven Moreland5759db02024-03-27 00:03:05 +00001068 ALOGW("%s Tried to unregister %s, but that service wasn't registered to begin with.",
1069 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001070 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Service not registered.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001071 }
1072
Steven Moreland7ee423b2022-09-24 03:52:08 +00001073 if (serviceIt->second.ctx.debugPid != IPCThreadState::self()->getCallingPid()) {
Steven Moreland5759db02024-03-27 00:03:05 +00001074 ALOGW("%s Only a server can unregister itself (for %s)", ctx.toDebugString().c_str(),
1075 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001076 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
1077 "Service can only unregister itself.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001078 }
1079
1080 sp<IBinder> storedBinder = serviceIt->second.binder;
1081
1082 if (binder != storedBinder) {
Steven Moreland5759db02024-03-27 00:03:05 +00001083 ALOGW("%s Tried to unregister %s, but a different service is registered under this name.",
1084 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001085 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1086 "Different service registered under this name.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001087 }
1088
Steven Morelandb8361902023-02-01 23:18:04 +00001089 // important because we don't have timer-based guarantees, we don't want to clear
1090 // this
Jon Spivack0f18f2c2020-03-13 20:45:18 -07001091 if (serviceIt->second.guaranteeClient) {
Steven Moreland5759db02024-03-27 00:03:05 +00001092 ALOGI("%s Tried to unregister %s, but there is about to be a client.",
1093 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001094 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1095 "Can't unregister, pending client.");
Jon Spivack0f18f2c2020-03-13 20:45:18 -07001096 }
1097
Jon Spivack9f503a42019-10-22 16:49:19 -07001098 // - kernel driver will hold onto one refcount (during this transaction)
1099 // - servicemanager has a refcount (guaranteed by this transaction)
Steven Morelandb8361902023-02-01 23:18:04 +00001100 constexpr size_t kKnownClients = 2;
1101
1102 if (handleServiceClientCallback(kKnownClients, name, false)) {
Steven Moreland5759db02024-03-27 00:03:05 +00001103 ALOGI("%s Tried to unregister %s, but there are clients.", ctx.toDebugString().c_str(),
1104 name.c_str());
Steven Morelandb8361902023-02-01 23:18:04 +00001105
1106 // Since we had a failed registration attempt, and the HIDL implementation of
1107 // delaying service shutdown for multiple periods wasn't ported here... this may
1108 // help reduce thrashing, but we should be able to remove it.
Jon Spivack620d2dc2020-03-06 13:58:01 -08001109 serviceIt->second.guaranteeClient = true;
Steven Morelandb8361902023-02-01 23:18:04 +00001110
Steven Morelandffb905b2023-03-28 18:24:37 +00001111 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1112 "Can't unregister, known client.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001113 }
1114
Steven Moreland5759db02024-03-27 00:03:05 +00001115 ALOGI("%s Unregistering %s", ctx.toDebugString().c_str(), name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -07001116 mNameToService.erase(name);
1117
1118 return Status::ok();
1119}
1120
Alice Wangd404e0f2024-07-26 16:18:09 +00001121Status ServiceManager::canAddService(const Access::CallingContext& ctx, const std::string& name,
1122 std::optional<std::string>* accessor) {
1123 if (!mAccess->canAdd(ctx, name)) {
1124 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied for service.");
1125 }
1126#ifndef VENDORSERVICEMANAGER
1127 *accessor = getVintfAccessorName(name);
1128#endif
1129 if (accessor->has_value()) {
1130 if (!mAccess->canAdd(ctx, accessor->value())) {
1131 return Status::fromExceptionCode(Status::EX_SECURITY,
1132 "SELinux denied for the accessor of the service.");
1133 }
1134 }
1135 return Status::ok();
1136}
1137
Alice Wang8578f132024-05-03 09:01:56 +00001138Status ServiceManager::canFindService(const Access::CallingContext& ctx, const std::string& name,
1139 std::optional<std::string>* accessor) {
1140 if (!mAccess->canFind(ctx, name)) {
1141 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied for service.");
1142 }
1143#ifndef VENDORSERVICEMANAGER
1144 *accessor = getVintfAccessorName(name);
1145#endif
1146 if (accessor->has_value()) {
1147 if (!mAccess->canFind(ctx, accessor->value())) {
1148 return Status::fromExceptionCode(Status::EX_SECURITY,
1149 "SELinux denied for the accessor of the service.");
1150 }
1151 }
1152 return Status::ok();
1153}
1154
Steven Moreland3ea43272021-01-28 22:49:28 +00001155Status ServiceManager::getServiceDebugInfo(std::vector<ServiceDebugInfo>* outReturn) {
Parth Sane5ade9f12024-05-19 13:02:07 +00001156 SM_PERFETTO_TRACE_FUNC();
Steven Moreland3ea43272021-01-28 22:49:28 +00001157 if (!mAccess->canList(mAccess->getCallingContext())) {
Steven Morelandffb905b2023-03-28 18:24:37 +00001158 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland3ea43272021-01-28 22:49:28 +00001159 }
1160
1161 outReturn->reserve(mNameToService.size());
1162 for (auto const& [name, service] : mNameToService) {
1163 ServiceDebugInfo info;
1164 info.name = name;
Steven Moreland7ee423b2022-09-24 03:52:08 +00001165 info.debugPid = service.ctx.debugPid;
Steven Moreland3ea43272021-01-28 22:49:28 +00001166
1167 outReturn->push_back(std::move(info));
1168 }
1169
1170 return Status::ok();
1171}
1172
Pawan Wagh243888e2022-09-20 19:37:35 +00001173void ServiceManager::clear() {
1174 mNameToService.clear();
1175 mNameToRegistrationCallback.clear();
1176 mNameToClientCallback.clear();
1177}
1178
Steven Moreland8d0c9a72020-04-30 16:51:56 -07001179} // namespace android