summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jon Spivack <spivack@google.com> 2020-03-13 20:45:18 -0700
committer Jon Spivack <spivack@google.com> 2020-03-16 17:01:26 -0700
commitbb108a18393edde0e767d882dceef70a9fb1839e (patch)
treef5cf7b01c8dfacfe6969db6fb7c5870fd2e0e14d
parenta4b4999ec508c5ba90ef4eb1bbdb31c74e169fa8 (diff)
ServiceManager: Check guaranteeClient before unregistering services
If tryUnregisterService is called while a service has set guaranteeClient to true, it should not succeed. The flag means that a client exists and is about to be counted. Not checking this flag can lead to a race. Bug: 151485917 Test: aidl_lazy_test Change-Id: If7ef7a5c7521ea40521bd351385fb8bd650aba08
-rw-r--r--cmds/servicemanager/ServiceManager.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/cmds/servicemanager/ServiceManager.cpp b/cmds/servicemanager/ServiceManager.cpp
index abe64365f3..0154620efb 100644
--- a/cmds/servicemanager/ServiceManager.cpp
+++ b/cmds/servicemanager/ServiceManager.cpp
@@ -522,6 +522,11 @@ Status ServiceManager::tryUnregisterService(const std::string& name, const sp<IB
return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
}
+ if (serviceIt->second.guaranteeClient) {
+ LOG(INFO) << "Tried to unregister " << name << ", but there is about to be a client.";
+ return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
+ }
+
int clients = handleServiceClientCallback(name, false);
// clients < 0: feature not implemented or other error. Assume clients.