diff options
| author | 2021-05-13 17:13:44 -0700 | |
|---|---|---|
| committer | 2021-05-13 20:16:09 -0700 | |
| commit | c276f8db509dfc95caa0f7d0146297c8d330010d (patch) | |
| tree | 590b60e292d3d245c63c23db4fd444eb0dba506b | |
| parent | 00aeb76928c7bd4c6455ff959ed3cc3bce69a73d (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.cpp | 5 |
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; } |