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
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp
index 9cc6e7f..59659bd 100644
--- a/libs/binder/RpcServer.cpp
+++ b/libs/binder/RpcServer.cpp
@@ -255,7 +255,10 @@
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;
}