blob: c44e540c6d46f727859e7388275be3ae5b07846d [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 Wang8578f132024-05-03 09:01:56 +0000395Status ServiceManager::getService(const std::string& name, os::Service* outService) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000396 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
397 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000398
Alice Wang8578f132024-05-03 09:01:56 +0000399 *outService = tryGetService(name, true);
Jon Spivack0d844302019-07-22 18:40:34 -0700400 // returns ok regardless of result for legacy reasons
401 return Status::ok();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700402}
403
Alice Wang8578f132024-05-03 09:01:56 +0000404Status ServiceManager::checkService(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, false);
Jon Spivack0d844302019-07-22 18:40:34 -0700409 // returns ok regardless of result for legacy reasons
410 return Status::ok();
411}
412
Alice Wang8578f132024-05-03 09:01:56 +0000413os::Service ServiceManager::tryGetService(const std::string& name, bool startIfNotFound) {
414 std::optional<std::string> accessorName;
415#ifndef VENDORSERVICEMANAGER
416 accessorName = getVintfAccessorName(name);
417#endif
418 if (accessorName.has_value()) {
419 auto ctx = mAccess->getCallingContext();
420 if (!mAccess->canFind(ctx, name)) {
421 return os::Service::make<os::Service::Tag::accessor>(nullptr);
422 }
423 return os::Service::make<os::Service::Tag::accessor>(
424 tryGetBinder(*accessorName, startIfNotFound));
425 } else {
426 return os::Service::make<os::Service::Tag::binder>(tryGetBinder(name, startIfNotFound));
427 }
428}
429
430sp<IBinder> ServiceManager::tryGetBinder(const std::string& name, bool startIfNotFound) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000431 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
432 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000433
Steven Morelanda9fe4742019-07-18 14:45:20 -0700434 auto ctx = mAccess->getCallingContext();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700435
Jon Spivack0d844302019-07-22 18:40:34 -0700436 sp<IBinder> out;
Jon Spivack9f503a42019-10-22 16:49:19 -0700437 Service* service = nullptr;
Jon Spivack0d844302019-07-22 18:40:34 -0700438 if (auto it = mNameToService.find(name); it != mNameToService.end()) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700439 service = &(it->second);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700440
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000441 if (!service->allowIsolated && is_multiuser_uid_isolated(ctx.uid)) {
Steven Morelandbad75882023-06-16 20:59:06 +0000442 LOG(WARNING) << "Isolated app with UID " << ctx.uid << " requested '" << name
443 << "', but the service is not allowed for isolated apps.";
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000444 return nullptr;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700445 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700446 out = service->binder;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700447 }
448
Steven Morelanda9fe4742019-07-18 14:45:20 -0700449 if (!mAccess->canFind(ctx, name)) {
Jon Spivack0d844302019-07-22 18:40:34 -0700450 return nullptr;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700451 }
452
Jon Spivack0d844302019-07-22 18:40:34 -0700453 if (!out && startIfNotFound) {
Steven Morelandaa33e852023-05-10 16:42:15 +0000454 tryStartService(ctx, name);
Jon Spivack0d844302019-07-22 18:40:34 -0700455 }
456
Jon Spivack9f503a42019-10-22 16:49:19 -0700457 if (out) {
Steven Morelandb8361902023-02-01 23:18:04 +0000458 // Force onClients to get sent, and then make sure the timerfd won't clear it
459 // by setting guaranteeClient again. This logic could be simplified by using
460 // a time-based guarantee. However, forcing onClients(true) to get sent
461 // right here is always going to be important for processes serving multiple
462 // lazy interfaces.
463 service->guaranteeClient = true;
464 CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false));
Jon Spivack9f503a42019-10-22 16:49:19 -0700465 service->guaranteeClient = true;
466 }
467
Jon Spivack0d844302019-07-22 18:40:34 -0700468 return out;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700469}
470
Steven Moreland905e2e82019-07-17 11:05:45 -0700471bool isValidServiceName(const std::string& name) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000472 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
473 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000474
Steven Moreland905e2e82019-07-17 11:05:45 -0700475 if (name.size() == 0) return false;
476 if (name.size() > 127) return false;
477
478 for (char c : name) {
Steven Morelandbb7951d2019-08-20 16:58:25 -0700479 if (c == '_' || c == '-' || c == '.' || c == '/') continue;
Steven Moreland905e2e82019-07-17 11:05:45 -0700480 if (c >= 'a' && c <= 'z') continue;
481 if (c >= 'A' && c <= 'Z') continue;
482 if (c >= '0' && c <= '9') continue;
483 return false;
484 }
485
486 return true;
487}
488
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700489Status ServiceManager::addService(const std::string& name, const sp<IBinder>& binder, bool allowIsolated, int32_t dumpPriority) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000490 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
491 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000492
Steven Morelanda9fe4742019-07-18 14:45:20 -0700493 auto ctx = mAccess->getCallingContext();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700494
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700495 if (multiuser_get_app_id(ctx.uid) >= AID_APP) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000496 return Status::fromExceptionCode(Status::EX_SECURITY, "App UIDs cannot add services.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700497 }
498
Steven Morelanda9fe4742019-07-18 14:45:20 -0700499 if (!mAccess->canAdd(ctx, name)) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000500 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700501 }
502
503 if (binder == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000504 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Null binder.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700505 }
506
Steven Moreland905e2e82019-07-17 11:05:45 -0700507 if (!isValidServiceName(name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000508 ALOGE("%s Invalid service name: %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000509 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Invalid service name.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700510 }
511
Steven Moreland86a17f82019-09-10 10:18:00 -0700512#ifndef VENDORSERVICEMANAGER
Steven Moreland5759db02024-03-27 00:03:05 +0000513 if (!meetsDeclarationRequirements(ctx, binder, name)) {
Steven Moreland86a17f82019-09-10 10:18:00 -0700514 // already logged
Steven Morelandffb905b2023-03-28 18:24:37 +0000515 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "VINTF declaration error.");
Steven Moreland86a17f82019-09-10 10:18:00 -0700516 }
517#endif // !VENDORSERVICEMANAGER
518
Devin Moore4e21def2023-02-24 21:54:14 +0000519 if ((dumpPriority & DUMP_FLAG_PRIORITY_ALL) == 0) {
Steven Moreland5759db02024-03-27 00:03:05 +0000520 ALOGW("%s Dump flag priority is not set when adding %s", ctx.toDebugString().c_str(),
521 name.c_str());
Devin Moore4e21def2023-02-24 21:54:14 +0000522 }
523
Steven Moreland88860b02019-08-12 14:24:14 -0700524 // implicitly unlinked when the binder is removed
Steven Morelandb0983182021-04-02 03:14:04 +0000525 if (binder->remoteBinder() != nullptr &&
526 binder->linkToDeath(sp<ServiceManager>::fromExisting(this)) != OK) {
Steven Moreland5759db02024-03-27 00:03:05 +0000527 ALOGE("%s Could not linkToDeath when adding %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000528 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't linkToDeath.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700529 }
530
Steven Moreland7ee423b2022-09-24 03:52:08 +0000531 auto it = mNameToService.find(name);
Steven Moreland79578672023-04-27 19:38:00 +0000532 bool prevClients = false;
Steven Moreland7ee423b2022-09-24 03:52:08 +0000533 if (it != mNameToService.end()) {
534 const Service& existing = it->second;
Steven Moreland79578672023-04-27 19:38:00 +0000535 prevClients = existing.hasClients;
Steven Moreland7ee423b2022-09-24 03:52:08 +0000536
537 // We could do better than this because if the other service dies, it
538 // may not have an entry here. However, this case is unlikely. We are
539 // only trying to detect when two different services are accidentally installed.
540
541 if (existing.ctx.uid != ctx.uid) {
Pawan Wagh37526162022-09-29 21:55:26 +0000542 ALOGW("Service '%s' originally registered from UID %u but it is now being registered "
543 "from UID %u. Multiple instances installed?",
544 name.c_str(), existing.ctx.uid, ctx.uid);
Steven Moreland7ee423b2022-09-24 03:52:08 +0000545 }
546
547 if (existing.ctx.sid != ctx.sid) {
Pawan Wagh37526162022-09-29 21:55:26 +0000548 ALOGW("Service '%s' originally registered from SID %s but it is now being registered "
549 "from SID %s. Multiple instances installed?",
550 name.c_str(), existing.ctx.sid.c_str(), ctx.sid.c_str());
Steven Moreland7ee423b2022-09-24 03:52:08 +0000551 }
552
Pawan Wagh37526162022-09-29 21:55:26 +0000553 ALOGI("Service '%s' originally registered from PID %d but it is being registered again "
554 "from PID %d. Bad state? Late death notification? Multiple instances installed?",
555 name.c_str(), existing.ctx.debugPid, ctx.debugPid);
Steven Moreland7ee423b2022-09-24 03:52:08 +0000556 }
557
Devin Moore05ffe522020-08-06 13:58:29 -0700558 // Overwrite the old service if it exists
Steven Moreland7ee423b2022-09-24 03:52:08 +0000559 mNameToService[name] = Service{
560 .binder = binder,
561 .allowIsolated = allowIsolated,
562 .dumpPriority = dumpPriority,
Steven Moreland79578672023-04-27 19:38:00 +0000563 .hasClients = prevClients, // see b/279898063, matters if existing callbacks
Steven Morelandefea66b2023-06-17 01:59:34 +0000564 .guaranteeClient = false,
Steven Moreland7ee423b2022-09-24 03:52:08 +0000565 .ctx = ctx,
Devin Moore05ffe522020-08-06 13:58:29 -0700566 };
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700567
Steven Moreland7ee423b2022-09-24 03:52:08 +0000568 if (auto it = mNameToRegistrationCallback.find(name); it != mNameToRegistrationCallback.end()) {
Steven Morelandefea66b2023-06-17 01:59:34 +0000569 // If someone is currently waiting on the service, notify the service that
570 // we're waiting and flush it to the service.
Steven Morelandb8361902023-02-01 23:18:04 +0000571 mNameToService[name].guaranteeClient = true;
572 CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false));
573 mNameToService[name].guaranteeClient = true;
574
Steven Moreland27cfab02019-08-12 14:34:16 -0700575 for (const sp<IServiceCallback>& cb : it->second) {
576 // permission checked in registerForNotifications
577 cb->onRegistration(name, binder);
578 }
579 }
580
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700581 return Status::ok();
582}
583
584Status ServiceManager::listServices(int32_t dumpPriority, std::vector<std::string>* outList) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000585 SM_PERFETTO_TRACE_FUNC();
586
Steven Morelanda9fe4742019-07-18 14:45:20 -0700587 if (!mAccess->canList(mAccess->getCallingContext())) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000588 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700589 }
590
591 size_t toReserve = 0;
592 for (auto const& [name, service] : mNameToService) {
593 (void) name;
594
595 if (service.dumpPriority & dumpPriority) ++toReserve;
596 }
597
598 CHECK(outList->empty());
599
600 outList->reserve(toReserve);
601 for (auto const& [name, service] : mNameToService) {
602 (void) service;
603
604 if (service.dumpPriority & dumpPriority) {
605 outList->push_back(name);
606 }
607 }
608
609 return Status::ok();
610}
611
Steven Moreland27cfab02019-08-12 14:34:16 -0700612Status ServiceManager::registerForNotifications(
613 const std::string& name, const sp<IServiceCallback>& callback) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000614 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
615 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000616
Steven Moreland27cfab02019-08-12 14:34:16 -0700617 auto ctx = mAccess->getCallingContext();
618
Alice Wang8578f132024-05-03 09:01:56 +0000619 // TODO(b/338541373): Implement the notification mechanism for services accessed via
620 // IAccessor.
621 std::optional<std::string> accessorName;
622 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
623 return status;
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000624 }
625
626 // note - we could allow isolated apps to get notifications if we
627 // keep track of isolated callbacks and non-isolated callbacks, but
628 // this is done since isolated apps shouldn't access lazy services
629 // so we should be able to use different APIs to keep things simple.
630 // Here, we disallow everything, because the service might not be
631 // registered yet.
632 if (is_multiuser_uid_isolated(ctx.uid)) {
633 return Status::fromExceptionCode(Status::EX_SECURITY, "isolated app");
Steven Moreland27cfab02019-08-12 14:34:16 -0700634 }
635
636 if (!isValidServiceName(name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000637 ALOGE("%s Invalid service name: %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000638 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Invalid service name.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700639 }
640
641 if (callback == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000642 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Null callback.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700643 }
644
Steven Morelandb0983182021-04-02 03:14:04 +0000645 if (OK !=
646 IInterface::asBinder(callback)->linkToDeath(
647 sp<ServiceManager>::fromExisting(this))) {
Steven Moreland5759db02024-03-27 00:03:05 +0000648 ALOGE("%s Could not linkToDeath when adding %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000649 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't link to death.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700650 }
651
Jon Spivackf288b1d2019-12-19 17:15:51 -0800652 mNameToRegistrationCallback[name].push_back(callback);
Steven Moreland27cfab02019-08-12 14:34:16 -0700653
654 if (auto it = mNameToService.find(name); it != mNameToService.end()) {
655 const sp<IBinder>& binder = it->second.binder;
656
657 // never null if an entry exists
658 CHECK(binder != nullptr) << name;
659 callback->onRegistration(name, binder);
660 }
661
662 return Status::ok();
663}
664Status ServiceManager::unregisterForNotifications(
665 const std::string& name, const sp<IServiceCallback>& callback) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000666 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
667 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000668
Steven Moreland27cfab02019-08-12 14:34:16 -0700669 auto ctx = mAccess->getCallingContext();
670
Alice Wang8578f132024-05-03 09:01:56 +0000671 std::optional<std::string> accessorName;
672 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
673 return status;
Steven Moreland27cfab02019-08-12 14:34:16 -0700674 }
675
676 bool found = false;
677
Jon Spivackf288b1d2019-12-19 17:15:51 -0800678 auto it = mNameToRegistrationCallback.find(name);
679 if (it != mNameToRegistrationCallback.end()) {
680 removeRegistrationCallback(IInterface::asBinder(callback), &it, &found);
Steven Moreland27cfab02019-08-12 14:34:16 -0700681 }
682
683 if (!found) {
Steven Moreland5759db02024-03-27 00:03:05 +0000684 ALOGE("%s Trying to unregister callback, but none exists %s", ctx.toDebugString().c_str(),
685 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000686 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Nothing to unregister.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700687 }
688
689 return Status::ok();
690}
691
Steven Morelandb82b8f82019-10-28 10:52:34 -0700692Status ServiceManager::isDeclared(const std::string& name, bool* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000693 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
694 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000695
Steven Morelandb82b8f82019-10-28 10:52:34 -0700696 auto ctx = mAccess->getCallingContext();
697
Alice Wang8578f132024-05-03 09:01:56 +0000698 std::optional<std::string> accessorName;
699 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
700 return status;
Steven Morelandb82b8f82019-10-28 10:52:34 -0700701 }
702
703 *outReturn = false;
704
705#ifndef VENDORSERVICEMANAGER
Steven Moreland5759db02024-03-27 00:03:05 +0000706 *outReturn = isVintfDeclared(ctx, name);
Steven Morelandb82b8f82019-10-28 10:52:34 -0700707#endif
708 return Status::ok();
709}
710
Steven Moreland2e293aa2020-09-23 00:25:16 +0000711binder::Status ServiceManager::getDeclaredInstances(const std::string& interface, std::vector<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000712 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
713 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoInterfaceName, interface.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000714
Steven Moreland2e293aa2020-09-23 00:25:16 +0000715 auto ctx = mAccess->getCallingContext();
716
717 std::vector<std::string> allInstances;
718#ifndef VENDORSERVICEMANAGER
719 allInstances = getVintfInstances(interface);
720#endif
721
722 outReturn->clear();
723
Alice Wang8578f132024-05-03 09:01:56 +0000724 std::optional<std::string> _accessorName;
Steven Moreland2e293aa2020-09-23 00:25:16 +0000725 for (const std::string& instance : allInstances) {
Alice Wang8578f132024-05-03 09:01:56 +0000726 if (auto status = canFindService(ctx, interface + "/" + instance, &_accessorName);
727 status.isOk()) {
Steven Moreland2e293aa2020-09-23 00:25:16 +0000728 outReturn->push_back(instance);
729 }
730 }
731
732 if (outReturn->size() == 0 && allInstances.size() != 0) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000733 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland2e293aa2020-09-23 00:25:16 +0000734 }
735
736 return Status::ok();
737}
738
Steven Morelandedd4e072021-04-21 00:27:29 +0000739Status ServiceManager::updatableViaApex(const std::string& name,
740 std::optional<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000741 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
742 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000743
Steven Morelandedd4e072021-04-21 00:27:29 +0000744 auto ctx = mAccess->getCallingContext();
745
Alice Wang8578f132024-05-03 09:01:56 +0000746 std::optional<std::string> _accessorName;
747 if (auto status = canFindService(ctx, name, &_accessorName); !status.isOk()) {
748 return status;
Steven Morelandedd4e072021-04-21 00:27:29 +0000749 }
750
751 *outReturn = std::nullopt;
752
753#ifndef VENDORSERVICEMANAGER
754 *outReturn = getVintfUpdatableApex(name);
755#endif
756 return Status::ok();
757}
758
Jooyung Han76944fe2022-10-25 17:02:45 +0900759Status ServiceManager::getUpdatableNames([[maybe_unused]] const std::string& apexName,
760 std::vector<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000761 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
762 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoApexName, apexName.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000763
Jooyung Han76944fe2022-10-25 17:02:45 +0900764 auto ctx = mAccess->getCallingContext();
765
Jooyung Han205e2822023-12-19 16:59:39 +0900766 std::vector<std::string> apexUpdatableNames;
Jooyung Han76944fe2022-10-25 17:02:45 +0900767#ifndef VENDORSERVICEMANAGER
Jooyung Han205e2822023-12-19 16:59:39 +0900768 apexUpdatableNames = getVintfUpdatableNames(apexName);
Jooyung Han76944fe2022-10-25 17:02:45 +0900769#endif
770
771 outReturn->clear();
772
Alice Wang8578f132024-05-03 09:01:56 +0000773 std::optional<std::string> _accessorName;
Jooyung Han205e2822023-12-19 16:59:39 +0900774 for (const std::string& name : apexUpdatableNames) {
Alice Wang8578f132024-05-03 09:01:56 +0000775 if (auto status = canFindService(ctx, name, &_accessorName); status.isOk()) {
Jooyung Han205e2822023-12-19 16:59:39 +0900776 outReturn->push_back(name);
Jooyung Han76944fe2022-10-25 17:02:45 +0900777 }
778 }
779
Jooyung Han205e2822023-12-19 16:59:39 +0900780 if (outReturn->size() == 0 && apexUpdatableNames.size() != 0) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000781 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Jooyung Han76944fe2022-10-25 17:02:45 +0900782 }
Jooyung Han76944fe2022-10-25 17:02:45 +0900783 return Status::ok();
784}
785
Devin Moore5e4c2f12021-09-09 22:36:33 +0000786Status ServiceManager::getConnectionInfo(const std::string& name,
787 std::optional<ConnectionInfo>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000788 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
789 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000790
Devin Moore5e4c2f12021-09-09 22:36:33 +0000791 auto ctx = mAccess->getCallingContext();
792
Alice Wang8578f132024-05-03 09:01:56 +0000793 std::optional<std::string> _accessorName;
794 if (auto status = canFindService(ctx, name, &_accessorName); !status.isOk()) {
795 return status;
Devin Moore5e4c2f12021-09-09 22:36:33 +0000796 }
797
798 *outReturn = std::nullopt;
799
800#ifndef VENDORSERVICEMANAGER
801 *outReturn = getVintfConnectionInfo(name);
802#endif
803 return Status::ok();
804}
805
Jon Spivackf288b1d2019-12-19 17:15:51 -0800806void ServiceManager::removeRegistrationCallback(const wp<IBinder>& who,
807 ServiceCallbackMap::iterator* it,
Steven Moreland27cfab02019-08-12 14:34:16 -0700808 bool* found) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000809 SM_PERFETTO_TRACE_FUNC();
810
Steven Moreland27cfab02019-08-12 14:34:16 -0700811 std::vector<sp<IServiceCallback>>& listeners = (*it)->second;
812
813 for (auto lit = listeners.begin(); lit != listeners.end();) {
814 if (IInterface::asBinder(*lit) == who) {
815 if(found) *found = true;
816 lit = listeners.erase(lit);
817 } else {
818 ++lit;
819 }
820 }
821
822 if (listeners.empty()) {
Jon Spivackf288b1d2019-12-19 17:15:51 -0800823 *it = mNameToRegistrationCallback.erase(*it);
Steven Moreland27cfab02019-08-12 14:34:16 -0700824 } else {
Jon Spivacke223f082019-11-19 16:21:20 -0800825 (*it)++;
Steven Moreland27cfab02019-08-12 14:34:16 -0700826 }
827}
828
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700829void ServiceManager::binderDied(const wp<IBinder>& who) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000830 SM_PERFETTO_TRACE_FUNC();
831
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700832 for (auto it = mNameToService.begin(); it != mNameToService.end();) {
833 if (who == it->second.binder) {
Steven Moreland79578672023-04-27 19:38:00 +0000834 // TODO: currently, this entry contains the state also
835 // associated with mNameToClientCallback. If we allowed
836 // other processes to register client callbacks, we
837 // would have to preserve hasClients (perhaps moving
838 // that state into mNameToClientCallback, which is complicated
839 // because those callbacks are associated w/ particular binder
840 // objects, though they are indexed by name now, they may
841 // need to be indexed by binder at that point).
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700842 it = mNameToService.erase(it);
843 } else {
844 ++it;
845 }
846 }
Steven Moreland27cfab02019-08-12 14:34:16 -0700847
Jon Spivackf288b1d2019-12-19 17:15:51 -0800848 for (auto it = mNameToRegistrationCallback.begin(); it != mNameToRegistrationCallback.end();) {
849 removeRegistrationCallback(who, &it, nullptr /*found*/);
Steven Moreland27cfab02019-08-12 14:34:16 -0700850 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700851
852 for (auto it = mNameToClientCallback.begin(); it != mNameToClientCallback.end();) {
853 removeClientCallback(who, &it);
854 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700855}
856
Steven Morelandaa33e852023-05-10 16:42:15 +0000857void ServiceManager::tryStartService(const Access::CallingContext& ctx, const std::string& name) {
Steven Moreland5759db02024-03-27 00:03:05 +0000858 ALOGI("%s Since '%s' could not be found trying to start it as a lazy AIDL service. (if it's "
859 "not configured to be a lazy service, it may be stuck starting or still starting).",
860 ctx.toDebugString().c_str(), name.c_str());
Jon Spivack0d844302019-07-22 18:40:34 -0700861
862 std::thread([=] {
Steven Morelandbfe9fba2021-04-27 18:39:57 +0000863 if (!base::SetProperty("ctl.interface_start", "aidl/" + name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000864 ALOGI("%s Tried to start aidl service %s as a lazy service, but was unable to. Usually "
865 "this happens when a service is not installed, but if the service is intended to "
866 "be used as a lazy service, then it may be configured incorrectly.",
867 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandbfe9fba2021-04-27 18:39:57 +0000868 }
Jon Spivack0d844302019-07-22 18:40:34 -0700869 }).detach();
870}
871
Jon Spivack9f503a42019-10-22 16:49:19 -0700872Status ServiceManager::registerClientCallback(const std::string& name, const sp<IBinder>& service,
873 const sp<IClientCallback>& cb) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000874 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
875 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000876
Jon Spivack9f503a42019-10-22 16:49:19 -0700877 if (cb == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000878 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Callback null.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700879 }
880
881 auto ctx = mAccess->getCallingContext();
882 if (!mAccess->canAdd(ctx, name)) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000883 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700884 }
885
886 auto serviceIt = mNameToService.find(name);
887 if (serviceIt == mNameToService.end()) {
Steven Moreland5759db02024-03-27 00:03:05 +0000888 ALOGE("%s Could not add callback for nonexistent service: %s", ctx.toDebugString().c_str(),
889 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000890 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Service doesn't exist.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700891 }
892
Steven Moreland7ee423b2022-09-24 03:52:08 +0000893 if (serviceIt->second.ctx.debugPid != IPCThreadState::self()->getCallingPid()) {
Steven Moreland5759db02024-03-27 00:03:05 +0000894 ALOGW("%s Only a server can register for client callbacks (for %s)",
895 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000896 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
897 "Only service can register client callback for itself.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700898 }
899
900 if (serviceIt->second.binder != service) {
Steven Moreland5759db02024-03-27 00:03:05 +0000901 ALOGW("%s Tried to register client callback for %s but a different service is registered "
Pawan Wagh37526162022-09-29 21:55:26 +0000902 "under this name.",
Steven Moreland5759db02024-03-27 00:03:05 +0000903 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000904 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Service mismatch.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700905 }
906
Steven Morelandb0983182021-04-02 03:14:04 +0000907 if (OK !=
908 IInterface::asBinder(cb)->linkToDeath(sp<ServiceManager>::fromExisting(this))) {
David Duarte67d65282024-04-10 23:54:36 +0000909 ALOGE("%s Could not linkToDeath when adding client callback for %s",
910 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000911 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't linkToDeath.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700912 }
913
Steven Moreland79578672023-04-27 19:38:00 +0000914 // WARNING: binderDied makes an assumption about this. If we open up client
915 // callbacks to other services, certain race conditions may lead to services
916 // getting extra client callback notifications.
917 // Make sure all callbacks have been told about a consistent state - b/278038751
Steven Moreland7bb4ab82023-04-13 20:29:33 +0000918 if (serviceIt->second.hasClients) {
919 cb->onClients(service, true);
920 }
921
Jon Spivack9f503a42019-10-22 16:49:19 -0700922 mNameToClientCallback[name].push_back(cb);
923
Steven Morelandefea66b2023-06-17 01:59:34 +0000924 // Flush updated info to client callbacks (especially if guaranteeClient
925 // and !hasClient, see b/285202885). We may or may not have clients at
926 // this point, so ignore the return value.
927 (void)handleServiceClientCallback(2 /* sm + transaction */, name, false);
928
Jon Spivack9f503a42019-10-22 16:49:19 -0700929 return Status::ok();
930}
931
932void ServiceManager::removeClientCallback(const wp<IBinder>& who,
933 ClientCallbackMap::iterator* it) {
934 std::vector<sp<IClientCallback>>& listeners = (*it)->second;
935
936 for (auto lit = listeners.begin(); lit != listeners.end();) {
937 if (IInterface::asBinder(*lit) == who) {
938 lit = listeners.erase(lit);
939 } else {
940 ++lit;
941 }
942 }
943
944 if (listeners.empty()) {
945 *it = mNameToClientCallback.erase(*it);
946 } else {
947 (*it)++;
948 }
949}
950
951ssize_t ServiceManager::Service::getNodeStrongRefCount() {
Steven Morelandb0983182021-04-02 03:14:04 +0000952 sp<BpBinder> bpBinder = sp<BpBinder>::fromExisting(binder->remoteBinder());
Jon Spivack9f503a42019-10-22 16:49:19 -0700953 if (bpBinder == nullptr) return -1;
954
Steven Morelande8393882020-12-18 02:27:20 +0000955 return ProcessState::self()->getStrongRefCountForNode(bpBinder);
Jon Spivack9f503a42019-10-22 16:49:19 -0700956}
957
958void ServiceManager::handleClientCallbacks() {
959 for (const auto& [name, service] : mNameToService) {
Steven Morelandb8361902023-02-01 23:18:04 +0000960 handleServiceClientCallback(1 /* sm has one refcount */, name, true);
Jon Spivack9f503a42019-10-22 16:49:19 -0700961 }
962}
963
Steven Morelandb8361902023-02-01 23:18:04 +0000964bool ServiceManager::handleServiceClientCallback(size_t knownClients,
965 const std::string& serviceName,
966 bool isCalledOnInterval) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700967 auto serviceIt = mNameToService.find(serviceName);
968 if (serviceIt == mNameToService.end() || mNameToClientCallback.count(serviceName) < 1) {
Steven Morelandb8361902023-02-01 23:18:04 +0000969 return true; // return we do have clients a.k.a. DON'T DO ANYTHING
Jon Spivack9f503a42019-10-22 16:49:19 -0700970 }
971
972 Service& service = serviceIt->second;
973 ssize_t count = service.getNodeStrongRefCount();
974
Steven Morelandb8361902023-02-01 23:18:04 +0000975 // binder driver doesn't support this feature, consider we have clients
976 if (count == -1) return true;
Jon Spivack9f503a42019-10-22 16:49:19 -0700977
Steven Morelandb8361902023-02-01 23:18:04 +0000978 bool hasKernelReportedClients = static_cast<size_t>(count) > knownClients;
Jon Spivack9f503a42019-10-22 16:49:19 -0700979
980 if (service.guaranteeClient) {
Steven Morelandb8361902023-02-01 23:18:04 +0000981 if (!service.hasClients && !hasKernelReportedClients) {
Steven Moreland3e083b22023-01-26 00:46:30 +0000982 sendClientCallbackNotifications(serviceName, true,
983 "service is guaranteed to be in use");
Jon Spivack9f503a42019-10-22 16:49:19 -0700984 }
985
986 // guarantee is temporary
987 service.guaranteeClient = false;
988 }
989
Steven Morelandb8361902023-02-01 23:18:04 +0000990 // Regardless of this situation, we want to give this notification as soon as possible.
991 // This way, we have a chance of preventing further thrashing.
992 if (hasKernelReportedClients && !service.hasClients) {
993 sendClientCallbackNotifications(serviceName, true, "we now have a record of a client");
994 }
Steven Moreland66417652023-02-01 22:19:41 +0000995
Steven Morelandb8361902023-02-01 23:18:04 +0000996 // But limit rate of shutting down service.
997 if (isCalledOnInterval) {
998 if (!hasKernelReportedClients && service.hasClients) {
Steven Moreland3e083b22023-01-26 00:46:30 +0000999 sendClientCallbackNotifications(serviceName, false,
1000 "we now have no record of a client");
Jon Spivackd9533c22020-01-27 22:19:22 +00001001 }
Jon Spivack9f503a42019-10-22 16:49:19 -07001002 }
1003
Steven Morelandb8361902023-02-01 23:18:04 +00001004 // May be different than 'hasKernelReportedClients'. We intentionally delay
1005 // information about clients going away to reduce thrashing.
1006 return service.hasClients;
Jon Spivack9f503a42019-10-22 16:49:19 -07001007}
1008
Steven Moreland3e083b22023-01-26 00:46:30 +00001009void ServiceManager::sendClientCallbackNotifications(const std::string& serviceName,
1010 bool hasClients, const char* context) {
Jon Spivack9f503a42019-10-22 16:49:19 -07001011 auto serviceIt = mNameToService.find(serviceName);
1012 if (serviceIt == mNameToService.end()) {
Steven Moreland3e083b22023-01-26 00:46:30 +00001013 ALOGW("sendClientCallbackNotifications could not find service %s when %s",
1014 serviceName.c_str(), context);
Jon Spivack9f503a42019-10-22 16:49:19 -07001015 return;
1016 }
1017 Service& service = serviceIt->second;
1018
Steven Morelandb8361902023-02-01 23:18:04 +00001019 CHECK_NE(hasClients, service.hasClients) << context;
Jon Spivack9f503a42019-10-22 16:49:19 -07001020
Steven Morelandb8361902023-02-01 23:18:04 +00001021 ALOGI("Notifying %s they %s (previously: %s) have clients when %s", serviceName.c_str(),
1022 hasClients ? "do" : "don't", service.hasClients ? "do" : "don't", context);
Jon Spivack9f503a42019-10-22 16:49:19 -07001023
1024 auto ccIt = mNameToClientCallback.find(serviceName);
1025 CHECK(ccIt != mNameToClientCallback.end())
Steven Moreland3e083b22023-01-26 00:46:30 +00001026 << "sendClientCallbackNotifications could not find callbacks for service when "
1027 << context;
Jon Spivack9f503a42019-10-22 16:49:19 -07001028
1029 for (const auto& callback : ccIt->second) {
1030 callback->onClients(service.binder, hasClients);
1031 }
1032
1033 service.hasClients = hasClients;
1034}
1035
1036Status ServiceManager::tryUnregisterService(const std::string& name, const sp<IBinder>& binder) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +00001037 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
1038 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +00001039
Jon Spivack9f503a42019-10-22 16:49:19 -07001040 if (binder == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +00001041 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Null service.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001042 }
1043
1044 auto ctx = mAccess->getCallingContext();
1045 if (!mAccess->canAdd(ctx, name)) {
Steven Morelandffb905b2023-03-28 18:24:37 +00001046 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001047 }
1048
1049 auto serviceIt = mNameToService.find(name);
1050 if (serviceIt == mNameToService.end()) {
Steven Moreland5759db02024-03-27 00:03:05 +00001051 ALOGW("%s Tried to unregister %s, but that service wasn't registered to begin with.",
1052 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001053 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Service not registered.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001054 }
1055
Steven Moreland7ee423b2022-09-24 03:52:08 +00001056 if (serviceIt->second.ctx.debugPid != IPCThreadState::self()->getCallingPid()) {
Steven Moreland5759db02024-03-27 00:03:05 +00001057 ALOGW("%s Only a server can unregister itself (for %s)", ctx.toDebugString().c_str(),
1058 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001059 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
1060 "Service can only unregister itself.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001061 }
1062
1063 sp<IBinder> storedBinder = serviceIt->second.binder;
1064
1065 if (binder != storedBinder) {
Steven Moreland5759db02024-03-27 00:03:05 +00001066 ALOGW("%s Tried to unregister %s, but a different service is registered under this name.",
1067 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001068 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1069 "Different service registered under this name.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001070 }
1071
Steven Morelandb8361902023-02-01 23:18:04 +00001072 // important because we don't have timer-based guarantees, we don't want to clear
1073 // this
Jon Spivack0f18f2c2020-03-13 20:45:18 -07001074 if (serviceIt->second.guaranteeClient) {
Steven Moreland5759db02024-03-27 00:03:05 +00001075 ALOGI("%s Tried to unregister %s, but there is about to be a client.",
1076 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001077 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1078 "Can't unregister, pending client.");
Jon Spivack0f18f2c2020-03-13 20:45:18 -07001079 }
1080
Jon Spivack9f503a42019-10-22 16:49:19 -07001081 // - kernel driver will hold onto one refcount (during this transaction)
1082 // - servicemanager has a refcount (guaranteed by this transaction)
Steven Morelandb8361902023-02-01 23:18:04 +00001083 constexpr size_t kKnownClients = 2;
1084
1085 if (handleServiceClientCallback(kKnownClients, name, false)) {
Steven Moreland5759db02024-03-27 00:03:05 +00001086 ALOGI("%s Tried to unregister %s, but there are clients.", ctx.toDebugString().c_str(),
1087 name.c_str());
Steven Morelandb8361902023-02-01 23:18:04 +00001088
1089 // Since we had a failed registration attempt, and the HIDL implementation of
1090 // delaying service shutdown for multiple periods wasn't ported here... this may
1091 // help reduce thrashing, but we should be able to remove it.
Jon Spivack620d2dc2020-03-06 13:58:01 -08001092 serviceIt->second.guaranteeClient = true;
Steven Morelandb8361902023-02-01 23:18:04 +00001093
Steven Morelandffb905b2023-03-28 18:24:37 +00001094 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1095 "Can't unregister, known client.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001096 }
1097
Steven Moreland5759db02024-03-27 00:03:05 +00001098 ALOGI("%s Unregistering %s", ctx.toDebugString().c_str(), name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -07001099 mNameToService.erase(name);
1100
1101 return Status::ok();
1102}
1103
Alice Wang8578f132024-05-03 09:01:56 +00001104Status ServiceManager::canFindService(const Access::CallingContext& ctx, const std::string& name,
1105 std::optional<std::string>* accessor) {
1106 if (!mAccess->canFind(ctx, name)) {
1107 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied for service.");
1108 }
1109#ifndef VENDORSERVICEMANAGER
1110 *accessor = getVintfAccessorName(name);
1111#endif
1112 if (accessor->has_value()) {
1113 if (!mAccess->canFind(ctx, accessor->value())) {
1114 return Status::fromExceptionCode(Status::EX_SECURITY,
1115 "SELinux denied for the accessor of the service.");
1116 }
1117 }
1118 return Status::ok();
1119}
1120
Steven Moreland3ea43272021-01-28 22:49:28 +00001121Status ServiceManager::getServiceDebugInfo(std::vector<ServiceDebugInfo>* outReturn) {
Parth Sane5ade9f12024-05-19 13:02:07 +00001122 SM_PERFETTO_TRACE_FUNC();
Steven Moreland3ea43272021-01-28 22:49:28 +00001123 if (!mAccess->canList(mAccess->getCallingContext())) {
Steven Morelandffb905b2023-03-28 18:24:37 +00001124 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland3ea43272021-01-28 22:49:28 +00001125 }
1126
1127 outReturn->reserve(mNameToService.size());
1128 for (auto const& [name, service] : mNameToService) {
1129 ServiceDebugInfo info;
1130 info.name = name;
Steven Moreland7ee423b2022-09-24 03:52:08 +00001131 info.debugPid = service.ctx.debugPid;
Steven Moreland3ea43272021-01-28 22:49:28 +00001132
1133 outReturn->push_back(std::move(info));
1134 }
1135
1136 return Status::ok();
1137}
1138
Pawan Wagh243888e2022-09-20 19:37:35 +00001139void ServiceManager::clear() {
1140 mNameToService.clear();
1141 mNameToRegistrationCallback.clear();
1142 mNameToClientCallback.clear();
1143}
1144
Steven Moreland8d0c9a72020-04-30 16:51:56 -07001145} // namespace android