From bb108a18393edde0e767d882dceef70a9fb1839e Mon Sep 17 00:00:00 2001 From: Jon Spivack Date: Fri, 13 Mar 2020 20:45:18 -0700 Subject: 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 --- cmds/servicemanager/ServiceManager.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'cmds/servicemanager/ServiceManager.cpp') 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 spsecond.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. -- cgit v1.2.3-59-g8ed1b