summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yifan Hong <elsk@google.com> 2021-05-13 17:13:44 -0700
committer Yifan Hong <elsk@google.com> 2021-05-13 20:16:09 -0700
commitc276f8db509dfc95caa0f7d0146297c8d330010d (patch)
tree590b60e292d3d245c63c23db4fd444eb0dba506b
parent00aeb76928c7bd4c6455ff959ed3cc3bce69a73d (diff)
RpcServer::setupSocketServer prevent race
If two threads calls setup*Server, they may race. Make sure one of them fail. setupSocketServer calls into setupExternalServer to double check that no other thread was setting up server in the mean time to prevent TOCTOU. This change also ensures that setupExternalServer is the only place where mServer is set, and it is guarded by a lock. Test: binderRpcTest Change-Id: Iadd3585b9cb4aa157bae072943f1bd47896a7a77
-rw-r--r--libs/binder/RpcServer.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp
index 9cc6e7fe04..59659bd0a6 100644
--- a/libs/binder/RpcServer.cpp
+++ b/libs/binder/RpcServer.cpp
@@ -255,7 +255,10 @@ bool RpcServer::setupSocketServer(const RpcSocketAddress& addr) {
LOG_RPC_DETAIL("Successfully setup socket server %s", addr.toString().c_str());
- mServer = std::move(serverFd);
+ if (!setupExternalServer(std::move(serverFd))) {
+ ALOGE("Another thread has set up server while calling setupSocketServer. Race?");
+ return false;
+ }
return true;
}