blob: ef2fa4dff757f0131fa024653d113abfc441850b [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
399 *outBinder = tryGetBinder(name, true);
400 // 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>(
433 tryGetBinder(*accessorName, startIfNotFound));
434 } else {
435 return os::Service::make<os::Service::Tag::binder>(tryGetBinder(name, startIfNotFound));
436 }
437}
438
439sp<IBinder> ServiceManager::tryGetBinder(const std::string& name, bool startIfNotFound) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000440 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
441 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000442
Steven Morelanda9fe4742019-07-18 14:45:20 -0700443 auto ctx = mAccess->getCallingContext();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700444
Jon Spivack0d844302019-07-22 18:40:34 -0700445 sp<IBinder> out;
Jon Spivack9f503a42019-10-22 16:49:19 -0700446 Service* service = nullptr;
Jon Spivack0d844302019-07-22 18:40:34 -0700447 if (auto it = mNameToService.find(name); it != mNameToService.end()) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700448 service = &(it->second);
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700449
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000450 if (!service->allowIsolated && is_multiuser_uid_isolated(ctx.uid)) {
Steven Morelandbad75882023-06-16 20:59:06 +0000451 LOG(WARNING) << "Isolated app with UID " << ctx.uid << " requested '" << name
452 << "', but the service is not allowed for isolated apps.";
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000453 return nullptr;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700454 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700455 out = service->binder;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700456 }
457
Steven Morelanda9fe4742019-07-18 14:45:20 -0700458 if (!mAccess->canFind(ctx, name)) {
Jon Spivack0d844302019-07-22 18:40:34 -0700459 return nullptr;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700460 }
461
Jon Spivack0d844302019-07-22 18:40:34 -0700462 if (!out && startIfNotFound) {
Steven Morelandaa33e852023-05-10 16:42:15 +0000463 tryStartService(ctx, name);
Jon Spivack0d844302019-07-22 18:40:34 -0700464 }
465
Jon Spivack9f503a42019-10-22 16:49:19 -0700466 if (out) {
Steven Morelandb8361902023-02-01 23:18:04 +0000467 // Force onClients to get sent, and then make sure the timerfd won't clear it
468 // by setting guaranteeClient again. This logic could be simplified by using
469 // a time-based guarantee. However, forcing onClients(true) to get sent
470 // right here is always going to be important for processes serving multiple
471 // lazy interfaces.
472 service->guaranteeClient = true;
473 CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false));
Jon Spivack9f503a42019-10-22 16:49:19 -0700474 service->guaranteeClient = true;
475 }
476
Jon Spivack0d844302019-07-22 18:40:34 -0700477 return out;
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700478}
479
Steven Moreland905e2e82019-07-17 11:05:45 -0700480bool isValidServiceName(const std::string& name) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000481 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
482 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000483
Steven Moreland905e2e82019-07-17 11:05:45 -0700484 if (name.size() == 0) return false;
485 if (name.size() > 127) return false;
486
487 for (char c : name) {
Steven Morelandbb7951d2019-08-20 16:58:25 -0700488 if (c == '_' || c == '-' || c == '.' || c == '/') continue;
Steven Moreland905e2e82019-07-17 11:05:45 -0700489 if (c >= 'a' && c <= 'z') continue;
490 if (c >= 'A' && c <= 'Z') continue;
491 if (c >= '0' && c <= '9') continue;
492 return false;
493 }
494
495 return true;
496}
497
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700498Status ServiceManager::addService(const std::string& name, const sp<IBinder>& binder, bool allowIsolated, int32_t dumpPriority) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000499 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
500 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000501
Steven Morelanda9fe4742019-07-18 14:45:20 -0700502 auto ctx = mAccess->getCallingContext();
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700503
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700504 if (multiuser_get_app_id(ctx.uid) >= AID_APP) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000505 return Status::fromExceptionCode(Status::EX_SECURITY, "App UIDs cannot add services.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700506 }
507
Steven Morelanda9fe4742019-07-18 14:45:20 -0700508 if (!mAccess->canAdd(ctx, name)) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000509 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700510 }
511
512 if (binder == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000513 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Null binder.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700514 }
515
Steven Moreland905e2e82019-07-17 11:05:45 -0700516 if (!isValidServiceName(name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000517 ALOGE("%s Invalid service name: %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000518 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Invalid service name.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700519 }
520
Steven Moreland86a17f82019-09-10 10:18:00 -0700521#ifndef VENDORSERVICEMANAGER
Steven Moreland5759db02024-03-27 00:03:05 +0000522 if (!meetsDeclarationRequirements(ctx, binder, name)) {
Steven Moreland86a17f82019-09-10 10:18:00 -0700523 // already logged
Steven Morelandffb905b2023-03-28 18:24:37 +0000524 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "VINTF declaration error.");
Steven Moreland86a17f82019-09-10 10:18:00 -0700525 }
526#endif // !VENDORSERVICEMANAGER
527
Devin Moore4e21def2023-02-24 21:54:14 +0000528 if ((dumpPriority & DUMP_FLAG_PRIORITY_ALL) == 0) {
Steven Moreland5759db02024-03-27 00:03:05 +0000529 ALOGW("%s Dump flag priority is not set when adding %s", ctx.toDebugString().c_str(),
530 name.c_str());
Devin Moore4e21def2023-02-24 21:54:14 +0000531 }
532
Steven Moreland88860b02019-08-12 14:24:14 -0700533 // implicitly unlinked when the binder is removed
Steven Morelandb0983182021-04-02 03:14:04 +0000534 if (binder->remoteBinder() != nullptr &&
535 binder->linkToDeath(sp<ServiceManager>::fromExisting(this)) != OK) {
Steven Moreland5759db02024-03-27 00:03:05 +0000536 ALOGE("%s Could not linkToDeath when adding %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000537 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't linkToDeath.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700538 }
539
Steven Moreland7ee423b2022-09-24 03:52:08 +0000540 auto it = mNameToService.find(name);
Steven Moreland79578672023-04-27 19:38:00 +0000541 bool prevClients = false;
Steven Moreland7ee423b2022-09-24 03:52:08 +0000542 if (it != mNameToService.end()) {
543 const Service& existing = it->second;
Steven Moreland79578672023-04-27 19:38:00 +0000544 prevClients = existing.hasClients;
Steven Moreland7ee423b2022-09-24 03:52:08 +0000545
546 // We could do better than this because if the other service dies, it
547 // may not have an entry here. However, this case is unlikely. We are
548 // only trying to detect when two different services are accidentally installed.
549
550 if (existing.ctx.uid != ctx.uid) {
Pawan Wagh37526162022-09-29 21:55:26 +0000551 ALOGW("Service '%s' originally registered from UID %u but it is now being registered "
552 "from UID %u. Multiple instances installed?",
553 name.c_str(), existing.ctx.uid, ctx.uid);
Steven Moreland7ee423b2022-09-24 03:52:08 +0000554 }
555
556 if (existing.ctx.sid != ctx.sid) {
Pawan Wagh37526162022-09-29 21:55:26 +0000557 ALOGW("Service '%s' originally registered from SID %s but it is now being registered "
558 "from SID %s. Multiple instances installed?",
559 name.c_str(), existing.ctx.sid.c_str(), ctx.sid.c_str());
Steven Moreland7ee423b2022-09-24 03:52:08 +0000560 }
561
Pawan Wagh37526162022-09-29 21:55:26 +0000562 ALOGI("Service '%s' originally registered from PID %d but it is being registered again "
563 "from PID %d. Bad state? Late death notification? Multiple instances installed?",
564 name.c_str(), existing.ctx.debugPid, ctx.debugPid);
Steven Moreland7ee423b2022-09-24 03:52:08 +0000565 }
566
Devin Moore05ffe522020-08-06 13:58:29 -0700567 // Overwrite the old service if it exists
Steven Moreland7ee423b2022-09-24 03:52:08 +0000568 mNameToService[name] = Service{
569 .binder = binder,
570 .allowIsolated = allowIsolated,
571 .dumpPriority = dumpPriority,
Steven Moreland79578672023-04-27 19:38:00 +0000572 .hasClients = prevClients, // see b/279898063, matters if existing callbacks
Steven Morelandefea66b2023-06-17 01:59:34 +0000573 .guaranteeClient = false,
Steven Moreland7ee423b2022-09-24 03:52:08 +0000574 .ctx = ctx,
Devin Moore05ffe522020-08-06 13:58:29 -0700575 };
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700576
Steven Moreland7ee423b2022-09-24 03:52:08 +0000577 if (auto it = mNameToRegistrationCallback.find(name); it != mNameToRegistrationCallback.end()) {
Steven Morelandefea66b2023-06-17 01:59:34 +0000578 // If someone is currently waiting on the service, notify the service that
579 // we're waiting and flush it to the service.
Steven Morelandb8361902023-02-01 23:18:04 +0000580 mNameToService[name].guaranteeClient = true;
581 CHECK(handleServiceClientCallback(2 /* sm + transaction */, name, false));
582 mNameToService[name].guaranteeClient = true;
583
Steven Moreland27cfab02019-08-12 14:34:16 -0700584 for (const sp<IServiceCallback>& cb : it->second) {
585 // permission checked in registerForNotifications
586 cb->onRegistration(name, binder);
587 }
588 }
589
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700590 return Status::ok();
591}
592
593Status ServiceManager::listServices(int32_t dumpPriority, std::vector<std::string>* outList) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000594 SM_PERFETTO_TRACE_FUNC();
595
Steven Morelanda9fe4742019-07-18 14:45:20 -0700596 if (!mAccess->canList(mAccess->getCallingContext())) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000597 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700598 }
599
600 size_t toReserve = 0;
601 for (auto const& [name, service] : mNameToService) {
602 (void) name;
603
604 if (service.dumpPriority & dumpPriority) ++toReserve;
605 }
606
607 CHECK(outList->empty());
608
609 outList->reserve(toReserve);
610 for (auto const& [name, service] : mNameToService) {
611 (void) service;
612
613 if (service.dumpPriority & dumpPriority) {
614 outList->push_back(name);
615 }
616 }
617
618 return Status::ok();
619}
620
Steven Moreland27cfab02019-08-12 14:34:16 -0700621Status ServiceManager::registerForNotifications(
622 const std::string& name, const sp<IServiceCallback>& callback) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000623 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
624 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000625
Steven Moreland27cfab02019-08-12 14:34:16 -0700626 auto ctx = mAccess->getCallingContext();
627
Alice Wang8578f132024-05-03 09:01:56 +0000628 // TODO(b/338541373): Implement the notification mechanism for services accessed via
629 // IAccessor.
630 std::optional<std::string> accessorName;
631 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
632 return status;
Steven Morelandb9e1cbe2023-02-01 22:44:45 +0000633 }
634
635 // note - we could allow isolated apps to get notifications if we
636 // keep track of isolated callbacks and non-isolated callbacks, but
637 // this is done since isolated apps shouldn't access lazy services
638 // so we should be able to use different APIs to keep things simple.
639 // Here, we disallow everything, because the service might not be
640 // registered yet.
641 if (is_multiuser_uid_isolated(ctx.uid)) {
642 return Status::fromExceptionCode(Status::EX_SECURITY, "isolated app");
Steven Moreland27cfab02019-08-12 14:34:16 -0700643 }
644
645 if (!isValidServiceName(name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000646 ALOGE("%s Invalid service name: %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000647 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Invalid service name.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700648 }
649
650 if (callback == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000651 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Null callback.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700652 }
653
Steven Morelandb0983182021-04-02 03:14:04 +0000654 if (OK !=
655 IInterface::asBinder(callback)->linkToDeath(
656 sp<ServiceManager>::fromExisting(this))) {
Steven Moreland5759db02024-03-27 00:03:05 +0000657 ALOGE("%s Could not linkToDeath when adding %s", ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000658 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't link to death.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700659 }
660
Jon Spivackf288b1d2019-12-19 17:15:51 -0800661 mNameToRegistrationCallback[name].push_back(callback);
Steven Moreland27cfab02019-08-12 14:34:16 -0700662
663 if (auto it = mNameToService.find(name); it != mNameToService.end()) {
664 const sp<IBinder>& binder = it->second.binder;
665
666 // never null if an entry exists
667 CHECK(binder != nullptr) << name;
668 callback->onRegistration(name, binder);
669 }
670
671 return Status::ok();
672}
673Status ServiceManager::unregisterForNotifications(
674 const std::string& name, const sp<IServiceCallback>& callback) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000675 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
676 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000677
Steven Moreland27cfab02019-08-12 14:34:16 -0700678 auto ctx = mAccess->getCallingContext();
679
Alice Wang8578f132024-05-03 09:01:56 +0000680 std::optional<std::string> accessorName;
681 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
682 return status;
Steven Moreland27cfab02019-08-12 14:34:16 -0700683 }
684
685 bool found = false;
686
Jon Spivackf288b1d2019-12-19 17:15:51 -0800687 auto it = mNameToRegistrationCallback.find(name);
688 if (it != mNameToRegistrationCallback.end()) {
689 removeRegistrationCallback(IInterface::asBinder(callback), &it, &found);
Steven Moreland27cfab02019-08-12 14:34:16 -0700690 }
691
692 if (!found) {
Steven Moreland5759db02024-03-27 00:03:05 +0000693 ALOGE("%s Trying to unregister callback, but none exists %s", ctx.toDebugString().c_str(),
694 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000695 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Nothing to unregister.");
Steven Moreland27cfab02019-08-12 14:34:16 -0700696 }
697
698 return Status::ok();
699}
700
Steven Morelandb82b8f82019-10-28 10:52:34 -0700701Status ServiceManager::isDeclared(const std::string& name, bool* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000702 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
703 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000704
Steven Morelandb82b8f82019-10-28 10:52:34 -0700705 auto ctx = mAccess->getCallingContext();
706
Alice Wang8578f132024-05-03 09:01:56 +0000707 std::optional<std::string> accessorName;
708 if (auto status = canFindService(ctx, name, &accessorName); !status.isOk()) {
709 return status;
Steven Morelandb82b8f82019-10-28 10:52:34 -0700710 }
711
712 *outReturn = false;
713
714#ifndef VENDORSERVICEMANAGER
Steven Moreland5759db02024-03-27 00:03:05 +0000715 *outReturn = isVintfDeclared(ctx, name);
Steven Morelandb82b8f82019-10-28 10:52:34 -0700716#endif
717 return Status::ok();
718}
719
Steven Moreland2e293aa2020-09-23 00:25:16 +0000720binder::Status ServiceManager::getDeclaredInstances(const std::string& interface, std::vector<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000721 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
722 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoInterfaceName, interface.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000723
Steven Moreland2e293aa2020-09-23 00:25:16 +0000724 auto ctx = mAccess->getCallingContext();
725
726 std::vector<std::string> allInstances;
727#ifndef VENDORSERVICEMANAGER
728 allInstances = getVintfInstances(interface);
729#endif
730
731 outReturn->clear();
732
Alice Wang8578f132024-05-03 09:01:56 +0000733 std::optional<std::string> _accessorName;
Steven Moreland2e293aa2020-09-23 00:25:16 +0000734 for (const std::string& instance : allInstances) {
Alice Wang8578f132024-05-03 09:01:56 +0000735 if (auto status = canFindService(ctx, interface + "/" + instance, &_accessorName);
736 status.isOk()) {
Steven Moreland2e293aa2020-09-23 00:25:16 +0000737 outReturn->push_back(instance);
738 }
739 }
740
741 if (outReturn->size() == 0 && allInstances.size() != 0) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000742 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland2e293aa2020-09-23 00:25:16 +0000743 }
744
745 return Status::ok();
746}
747
Steven Morelandedd4e072021-04-21 00:27:29 +0000748Status ServiceManager::updatableViaApex(const std::string& name,
749 std::optional<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000750 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
751 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000752
Steven Morelandedd4e072021-04-21 00:27:29 +0000753 auto ctx = mAccess->getCallingContext();
754
Alice Wang8578f132024-05-03 09:01:56 +0000755 std::optional<std::string> _accessorName;
756 if (auto status = canFindService(ctx, name, &_accessorName); !status.isOk()) {
757 return status;
Steven Morelandedd4e072021-04-21 00:27:29 +0000758 }
759
760 *outReturn = std::nullopt;
761
762#ifndef VENDORSERVICEMANAGER
763 *outReturn = getVintfUpdatableApex(name);
764#endif
765 return Status::ok();
766}
767
Jooyung Han76944fe2022-10-25 17:02:45 +0900768Status ServiceManager::getUpdatableNames([[maybe_unused]] const std::string& apexName,
769 std::vector<std::string>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000770 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
771 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoApexName, apexName.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000772
Jooyung Han76944fe2022-10-25 17:02:45 +0900773 auto ctx = mAccess->getCallingContext();
774
Jooyung Han205e2822023-12-19 16:59:39 +0900775 std::vector<std::string> apexUpdatableNames;
Jooyung Han76944fe2022-10-25 17:02:45 +0900776#ifndef VENDORSERVICEMANAGER
Jooyung Han205e2822023-12-19 16:59:39 +0900777 apexUpdatableNames = getVintfUpdatableNames(apexName);
Jooyung Han76944fe2022-10-25 17:02:45 +0900778#endif
779
780 outReturn->clear();
781
Alice Wang8578f132024-05-03 09:01:56 +0000782 std::optional<std::string> _accessorName;
Jooyung Han205e2822023-12-19 16:59:39 +0900783 for (const std::string& name : apexUpdatableNames) {
Alice Wang8578f132024-05-03 09:01:56 +0000784 if (auto status = canFindService(ctx, name, &_accessorName); status.isOk()) {
Jooyung Han205e2822023-12-19 16:59:39 +0900785 outReturn->push_back(name);
Jooyung Han76944fe2022-10-25 17:02:45 +0900786 }
787 }
788
Jooyung Han205e2822023-12-19 16:59:39 +0900789 if (outReturn->size() == 0 && apexUpdatableNames.size() != 0) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000790 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Jooyung Han76944fe2022-10-25 17:02:45 +0900791 }
Jooyung Han76944fe2022-10-25 17:02:45 +0900792 return Status::ok();
793}
794
Devin Moore5e4c2f12021-09-09 22:36:33 +0000795Status ServiceManager::getConnectionInfo(const std::string& name,
796 std::optional<ConnectionInfo>* outReturn) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000797 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
798 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000799
Devin Moore5e4c2f12021-09-09 22:36:33 +0000800 auto ctx = mAccess->getCallingContext();
801
Alice Wang8578f132024-05-03 09:01:56 +0000802 std::optional<std::string> _accessorName;
803 if (auto status = canFindService(ctx, name, &_accessorName); !status.isOk()) {
804 return status;
Devin Moore5e4c2f12021-09-09 22:36:33 +0000805 }
806
807 *outReturn = std::nullopt;
808
809#ifndef VENDORSERVICEMANAGER
810 *outReturn = getVintfConnectionInfo(name);
811#endif
812 return Status::ok();
813}
814
Jon Spivackf288b1d2019-12-19 17:15:51 -0800815void ServiceManager::removeRegistrationCallback(const wp<IBinder>& who,
816 ServiceCallbackMap::iterator* it,
Steven Moreland27cfab02019-08-12 14:34:16 -0700817 bool* found) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000818 SM_PERFETTO_TRACE_FUNC();
819
Steven Moreland27cfab02019-08-12 14:34:16 -0700820 std::vector<sp<IServiceCallback>>& listeners = (*it)->second;
821
822 for (auto lit = listeners.begin(); lit != listeners.end();) {
823 if (IInterface::asBinder(*lit) == who) {
824 if(found) *found = true;
825 lit = listeners.erase(lit);
826 } else {
827 ++lit;
828 }
829 }
830
831 if (listeners.empty()) {
Jon Spivackf288b1d2019-12-19 17:15:51 -0800832 *it = mNameToRegistrationCallback.erase(*it);
Steven Moreland27cfab02019-08-12 14:34:16 -0700833 } else {
Jon Spivacke223f082019-11-19 16:21:20 -0800834 (*it)++;
Steven Moreland27cfab02019-08-12 14:34:16 -0700835 }
836}
837
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700838void ServiceManager::binderDied(const wp<IBinder>& who) {
Parth Sane5ade9f12024-05-19 13:02:07 +0000839 SM_PERFETTO_TRACE_FUNC();
840
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700841 for (auto it = mNameToService.begin(); it != mNameToService.end();) {
842 if (who == it->second.binder) {
Steven Moreland79578672023-04-27 19:38:00 +0000843 // TODO: currently, this entry contains the state also
844 // associated with mNameToClientCallback. If we allowed
845 // other processes to register client callbacks, we
846 // would have to preserve hasClients (perhaps moving
847 // that state into mNameToClientCallback, which is complicated
848 // because those callbacks are associated w/ particular binder
849 // objects, though they are indexed by name now, they may
850 // need to be indexed by binder at that point).
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700851 it = mNameToService.erase(it);
852 } else {
853 ++it;
854 }
855 }
Steven Moreland27cfab02019-08-12 14:34:16 -0700856
Jon Spivackf288b1d2019-12-19 17:15:51 -0800857 for (auto it = mNameToRegistrationCallback.begin(); it != mNameToRegistrationCallback.end();) {
858 removeRegistrationCallback(who, &it, nullptr /*found*/);
Steven Moreland27cfab02019-08-12 14:34:16 -0700859 }
Jon Spivack9f503a42019-10-22 16:49:19 -0700860
861 for (auto it = mNameToClientCallback.begin(); it != mNameToClientCallback.end();) {
862 removeClientCallback(who, &it);
863 }
Steven Moreland80e1e6d2019-06-21 12:35:59 -0700864}
865
Steven Morelandaa33e852023-05-10 16:42:15 +0000866void ServiceManager::tryStartService(const Access::CallingContext& ctx, const std::string& name) {
Steven Moreland5759db02024-03-27 00:03:05 +0000867 ALOGI("%s Since '%s' could not be found trying to start it as a lazy AIDL service. (if it's "
868 "not configured to be a lazy service, it may be stuck starting or still starting).",
869 ctx.toDebugString().c_str(), name.c_str());
Jon Spivack0d844302019-07-22 18:40:34 -0700870
871 std::thread([=] {
Steven Morelandbfe9fba2021-04-27 18:39:57 +0000872 if (!base::SetProperty("ctl.interface_start", "aidl/" + name)) {
Steven Moreland5759db02024-03-27 00:03:05 +0000873 ALOGI("%s Tried to start aidl service %s as a lazy service, but was unable to. Usually "
874 "this happens when a service is not installed, but if the service is intended to "
875 "be used as a lazy service, then it may be configured incorrectly.",
876 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandbfe9fba2021-04-27 18:39:57 +0000877 }
Jon Spivack0d844302019-07-22 18:40:34 -0700878 }).detach();
879}
880
Jon Spivack9f503a42019-10-22 16:49:19 -0700881Status ServiceManager::registerClientCallback(const std::string& name, const sp<IBinder>& service,
882 const sp<IClientCallback>& cb) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +0000883 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
884 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +0000885
Jon Spivack9f503a42019-10-22 16:49:19 -0700886 if (cb == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000887 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Callback null.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700888 }
889
890 auto ctx = mAccess->getCallingContext();
891 if (!mAccess->canAdd(ctx, name)) {
Steven Morelandffb905b2023-03-28 18:24:37 +0000892 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700893 }
894
895 auto serviceIt = mNameToService.find(name);
896 if (serviceIt == mNameToService.end()) {
Steven Moreland5759db02024-03-27 00:03:05 +0000897 ALOGE("%s Could not add callback for nonexistent service: %s", ctx.toDebugString().c_str(),
898 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000899 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Service doesn't exist.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700900 }
901
Steven Moreland7ee423b2022-09-24 03:52:08 +0000902 if (serviceIt->second.ctx.debugPid != IPCThreadState::self()->getCallingPid()) {
Steven Moreland5759db02024-03-27 00:03:05 +0000903 ALOGW("%s Only a server can register for client callbacks (for %s)",
904 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000905 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
906 "Only service can register client callback for itself.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700907 }
908
909 if (serviceIt->second.binder != service) {
Steven Moreland5759db02024-03-27 00:03:05 +0000910 ALOGW("%s Tried to register client callback for %s but a different service is registered "
Pawan Wagh37526162022-09-29 21:55:26 +0000911 "under this name.",
Steven Moreland5759db02024-03-27 00:03:05 +0000912 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000913 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, "Service mismatch.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700914 }
915
Steven Morelandb0983182021-04-02 03:14:04 +0000916 if (OK !=
917 IInterface::asBinder(cb)->linkToDeath(sp<ServiceManager>::fromExisting(this))) {
David Duarte67d65282024-04-10 23:54:36 +0000918 ALOGE("%s Could not linkToDeath when adding client callback for %s",
919 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +0000920 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Couldn't linkToDeath.");
Jon Spivack9f503a42019-10-22 16:49:19 -0700921 }
922
Steven Moreland79578672023-04-27 19:38:00 +0000923 // WARNING: binderDied makes an assumption about this. If we open up client
924 // callbacks to other services, certain race conditions may lead to services
925 // getting extra client callback notifications.
926 // Make sure all callbacks have been told about a consistent state - b/278038751
Steven Moreland7bb4ab82023-04-13 20:29:33 +0000927 if (serviceIt->second.hasClients) {
928 cb->onClients(service, true);
929 }
930
Jon Spivack9f503a42019-10-22 16:49:19 -0700931 mNameToClientCallback[name].push_back(cb);
932
Steven Morelandefea66b2023-06-17 01:59:34 +0000933 // Flush updated info to client callbacks (especially if guaranteeClient
934 // and !hasClient, see b/285202885). We may or may not have clients at
935 // this point, so ignore the return value.
936 (void)handleServiceClientCallback(2 /* sm + transaction */, name, false);
937
Jon Spivack9f503a42019-10-22 16:49:19 -0700938 return Status::ok();
939}
940
941void ServiceManager::removeClientCallback(const wp<IBinder>& who,
942 ClientCallbackMap::iterator* it) {
943 std::vector<sp<IClientCallback>>& listeners = (*it)->second;
944
945 for (auto lit = listeners.begin(); lit != listeners.end();) {
946 if (IInterface::asBinder(*lit) == who) {
947 lit = listeners.erase(lit);
948 } else {
949 ++lit;
950 }
951 }
952
953 if (listeners.empty()) {
954 *it = mNameToClientCallback.erase(*it);
955 } else {
956 (*it)++;
957 }
958}
959
960ssize_t ServiceManager::Service::getNodeStrongRefCount() {
Steven Morelandb0983182021-04-02 03:14:04 +0000961 sp<BpBinder> bpBinder = sp<BpBinder>::fromExisting(binder->remoteBinder());
Jon Spivack9f503a42019-10-22 16:49:19 -0700962 if (bpBinder == nullptr) return -1;
963
Steven Morelande8393882020-12-18 02:27:20 +0000964 return ProcessState::self()->getStrongRefCountForNode(bpBinder);
Jon Spivack9f503a42019-10-22 16:49:19 -0700965}
966
967void ServiceManager::handleClientCallbacks() {
968 for (const auto& [name, service] : mNameToService) {
Steven Morelandb8361902023-02-01 23:18:04 +0000969 handleServiceClientCallback(1 /* sm has one refcount */, name, true);
Jon Spivack9f503a42019-10-22 16:49:19 -0700970 }
971}
972
Steven Morelandb8361902023-02-01 23:18:04 +0000973bool ServiceManager::handleServiceClientCallback(size_t knownClients,
974 const std::string& serviceName,
975 bool isCalledOnInterval) {
Jon Spivack9f503a42019-10-22 16:49:19 -0700976 auto serviceIt = mNameToService.find(serviceName);
977 if (serviceIt == mNameToService.end() || mNameToClientCallback.count(serviceName) < 1) {
Steven Morelandb8361902023-02-01 23:18:04 +0000978 return true; // return we do have clients a.k.a. DON'T DO ANYTHING
Jon Spivack9f503a42019-10-22 16:49:19 -0700979 }
980
981 Service& service = serviceIt->second;
982 ssize_t count = service.getNodeStrongRefCount();
983
Steven Morelandb8361902023-02-01 23:18:04 +0000984 // binder driver doesn't support this feature, consider we have clients
985 if (count == -1) return true;
Jon Spivack9f503a42019-10-22 16:49:19 -0700986
Steven Morelandb8361902023-02-01 23:18:04 +0000987 bool hasKernelReportedClients = static_cast<size_t>(count) > knownClients;
Jon Spivack9f503a42019-10-22 16:49:19 -0700988
989 if (service.guaranteeClient) {
Steven Morelandb8361902023-02-01 23:18:04 +0000990 if (!service.hasClients && !hasKernelReportedClients) {
Steven Moreland3e083b22023-01-26 00:46:30 +0000991 sendClientCallbackNotifications(serviceName, true,
992 "service is guaranteed to be in use");
Jon Spivack9f503a42019-10-22 16:49:19 -0700993 }
994
995 // guarantee is temporary
996 service.guaranteeClient = false;
997 }
998
Steven Morelandb8361902023-02-01 23:18:04 +0000999 // Regardless of this situation, we want to give this notification as soon as possible.
1000 // This way, we have a chance of preventing further thrashing.
1001 if (hasKernelReportedClients && !service.hasClients) {
1002 sendClientCallbackNotifications(serviceName, true, "we now have a record of a client");
1003 }
Steven Moreland66417652023-02-01 22:19:41 +00001004
Steven Morelandb8361902023-02-01 23:18:04 +00001005 // But limit rate of shutting down service.
1006 if (isCalledOnInterval) {
1007 if (!hasKernelReportedClients && service.hasClients) {
Steven Moreland3e083b22023-01-26 00:46:30 +00001008 sendClientCallbackNotifications(serviceName, false,
1009 "we now have no record of a client");
Jon Spivackd9533c22020-01-27 22:19:22 +00001010 }
Jon Spivack9f503a42019-10-22 16:49:19 -07001011 }
1012
Steven Morelandb8361902023-02-01 23:18:04 +00001013 // May be different than 'hasKernelReportedClients'. We intentionally delay
1014 // information about clients going away to reduce thrashing.
1015 return service.hasClients;
Jon Spivack9f503a42019-10-22 16:49:19 -07001016}
1017
Steven Moreland3e083b22023-01-26 00:46:30 +00001018void ServiceManager::sendClientCallbackNotifications(const std::string& serviceName,
1019 bool hasClients, const char* context) {
Jon Spivack9f503a42019-10-22 16:49:19 -07001020 auto serviceIt = mNameToService.find(serviceName);
1021 if (serviceIt == mNameToService.end()) {
Steven Moreland3e083b22023-01-26 00:46:30 +00001022 ALOGW("sendClientCallbackNotifications could not find service %s when %s",
1023 serviceName.c_str(), context);
Jon Spivack9f503a42019-10-22 16:49:19 -07001024 return;
1025 }
1026 Service& service = serviceIt->second;
1027
Steven Morelandb8361902023-02-01 23:18:04 +00001028 CHECK_NE(hasClients, service.hasClients) << context;
Jon Spivack9f503a42019-10-22 16:49:19 -07001029
Steven Morelandb8361902023-02-01 23:18:04 +00001030 ALOGI("Notifying %s they %s (previously: %s) have clients when %s", serviceName.c_str(),
1031 hasClients ? "do" : "don't", service.hasClients ? "do" : "don't", context);
Jon Spivack9f503a42019-10-22 16:49:19 -07001032
1033 auto ccIt = mNameToClientCallback.find(serviceName);
1034 CHECK(ccIt != mNameToClientCallback.end())
Steven Moreland3e083b22023-01-26 00:46:30 +00001035 << "sendClientCallbackNotifications could not find callbacks for service when "
1036 << context;
Jon Spivack9f503a42019-10-22 16:49:19 -07001037
1038 for (const auto& callback : ccIt->second) {
1039 callback->onClients(service.binder, hasClients);
1040 }
1041
1042 service.hasClients = hasClients;
1043}
1044
1045Status ServiceManager::tryUnregisterService(const std::string& name, const sp<IBinder>& binder) {
Daniele Di Proiettof7bdee42024-07-04 14:27:56 +00001046 SM_PERFETTO_TRACE_FUNC(PERFETTO_TE_PROTO_FIELDS(
1047 PERFETTO_TE_PROTO_FIELD_CSTR(kProtoServiceName, name.c_str())));
Parth Sane5ade9f12024-05-19 13:02:07 +00001048
Jon Spivack9f503a42019-10-22 16:49:19 -07001049 if (binder == nullptr) {
Steven Morelandffb905b2023-03-28 18:24:37 +00001050 return Status::fromExceptionCode(Status::EX_NULL_POINTER, "Null service.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001051 }
1052
1053 auto ctx = mAccess->getCallingContext();
1054 if (!mAccess->canAdd(ctx, name)) {
Steven Morelandffb905b2023-03-28 18:24:37 +00001055 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001056 }
1057
1058 auto serviceIt = mNameToService.find(name);
1059 if (serviceIt == mNameToService.end()) {
Steven Moreland5759db02024-03-27 00:03:05 +00001060 ALOGW("%s Tried to unregister %s, but that service wasn't registered to begin with.",
1061 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001062 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, "Service not registered.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001063 }
1064
Steven Moreland7ee423b2022-09-24 03:52:08 +00001065 if (serviceIt->second.ctx.debugPid != IPCThreadState::self()->getCallingPid()) {
Steven Moreland5759db02024-03-27 00:03:05 +00001066 ALOGW("%s Only a server can unregister itself (for %s)", ctx.toDebugString().c_str(),
1067 name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001068 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
1069 "Service can only unregister itself.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001070 }
1071
1072 sp<IBinder> storedBinder = serviceIt->second.binder;
1073
1074 if (binder != storedBinder) {
Steven Moreland5759db02024-03-27 00:03:05 +00001075 ALOGW("%s Tried to unregister %s, but a different service is registered under this name.",
1076 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001077 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1078 "Different service registered under this name.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001079 }
1080
Steven Morelandb8361902023-02-01 23:18:04 +00001081 // important because we don't have timer-based guarantees, we don't want to clear
1082 // this
Jon Spivack0f18f2c2020-03-13 20:45:18 -07001083 if (serviceIt->second.guaranteeClient) {
Steven Moreland5759db02024-03-27 00:03:05 +00001084 ALOGI("%s Tried to unregister %s, but there is about to be a client.",
1085 ctx.toDebugString().c_str(), name.c_str());
Steven Morelandffb905b2023-03-28 18:24:37 +00001086 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1087 "Can't unregister, pending client.");
Jon Spivack0f18f2c2020-03-13 20:45:18 -07001088 }
1089
Jon Spivack9f503a42019-10-22 16:49:19 -07001090 // - kernel driver will hold onto one refcount (during this transaction)
1091 // - servicemanager has a refcount (guaranteed by this transaction)
Steven Morelandb8361902023-02-01 23:18:04 +00001092 constexpr size_t kKnownClients = 2;
1093
1094 if (handleServiceClientCallback(kKnownClients, name, false)) {
Steven Moreland5759db02024-03-27 00:03:05 +00001095 ALOGI("%s Tried to unregister %s, but there are clients.", ctx.toDebugString().c_str(),
1096 name.c_str());
Steven Morelandb8361902023-02-01 23:18:04 +00001097
1098 // Since we had a failed registration attempt, and the HIDL implementation of
1099 // delaying service shutdown for multiple periods wasn't ported here... this may
1100 // help reduce thrashing, but we should be able to remove it.
Jon Spivack620d2dc2020-03-06 13:58:01 -08001101 serviceIt->second.guaranteeClient = true;
Steven Morelandb8361902023-02-01 23:18:04 +00001102
Steven Morelandffb905b2023-03-28 18:24:37 +00001103 return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE,
1104 "Can't unregister, known client.");
Jon Spivack9f503a42019-10-22 16:49:19 -07001105 }
1106
Steven Moreland5759db02024-03-27 00:03:05 +00001107 ALOGI("%s Unregistering %s", ctx.toDebugString().c_str(), name.c_str());
Jon Spivack9f503a42019-10-22 16:49:19 -07001108 mNameToService.erase(name);
1109
1110 return Status::ok();
1111}
1112
Alice Wang8578f132024-05-03 09:01:56 +00001113Status ServiceManager::canFindService(const Access::CallingContext& ctx, const std::string& name,
1114 std::optional<std::string>* accessor) {
1115 if (!mAccess->canFind(ctx, name)) {
1116 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied for service.");
1117 }
1118#ifndef VENDORSERVICEMANAGER
1119 *accessor = getVintfAccessorName(name);
1120#endif
1121 if (accessor->has_value()) {
1122 if (!mAccess->canFind(ctx, accessor->value())) {
1123 return Status::fromExceptionCode(Status::EX_SECURITY,
1124 "SELinux denied for the accessor of the service.");
1125 }
1126 }
1127 return Status::ok();
1128}
1129
Steven Moreland3ea43272021-01-28 22:49:28 +00001130Status ServiceManager::getServiceDebugInfo(std::vector<ServiceDebugInfo>* outReturn) {
Parth Sane5ade9f12024-05-19 13:02:07 +00001131 SM_PERFETTO_TRACE_FUNC();
Steven Moreland3ea43272021-01-28 22:49:28 +00001132 if (!mAccess->canList(mAccess->getCallingContext())) {
Steven Morelandffb905b2023-03-28 18:24:37 +00001133 return Status::fromExceptionCode(Status::EX_SECURITY, "SELinux denied.");
Steven Moreland3ea43272021-01-28 22:49:28 +00001134 }
1135
1136 outReturn->reserve(mNameToService.size());
1137 for (auto const& [name, service] : mNameToService) {
1138 ServiceDebugInfo info;
1139 info.name = name;
Steven Moreland7ee423b2022-09-24 03:52:08 +00001140 info.debugPid = service.ctx.debugPid;
Steven Moreland3ea43272021-01-28 22:49:28 +00001141
1142 outReturn->push_back(std::move(info));
1143 }
1144
1145 return Status::ok();
1146}
1147
Pawan Wagh243888e2022-09-20 19:37:35 +00001148void ServiceManager::clear() {
1149 mNameToService.clear();
1150 mNameToRegistrationCallback.clear();
1151 mNameToClientCallback.clear();
1152}
1153
Steven Moreland8d0c9a72020-04-30 16:51:56 -07001154} // namespace android