diff options
author | 2021-05-01 02:55:20 +0000 | |
---|---|---|
committer | 2021-05-03 18:17:22 +0000 | |
commit | 7c5e6c2d4f6efc0887812bb7888a55aab3df23fa (patch) | |
tree | 9ce4055acc2de9c677db5782d40d4dffdf64bf71 /libs/binder/RpcState.cpp | |
parent | 611d15fe78f51d61226382f34f03b0834a3f60ea (diff) |
libbinder: RpcConnection: add ID
In preparation to have the server be able to distinguish clients and
clients to be able to dynamically create threads that are assigned to
them.
Future considerations:
- make ID impossible to guess (right now, one client might be able to
get ahold of a thread from a server). We may implement something here
or go for something existing like TLS.
- combine getting max threads and this? will wait until dynamic threads
are actually implemented and we know we need this ID and we're looking
at performance. For now this is a placeholder to enable dynamic client
APIs.
Bug: 185167543
Test: binderRpcTest
Change-Id: If8563c69930c23b9ca91090b4f59ef1f51073f24
Diffstat (limited to 'libs/binder/RpcState.cpp')
-rw-r--r-- | libs/binder/RpcState.cpp | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp index 6bfcc42469..19dea7e607 100644 --- a/libs/binder/RpcState.cpp +++ b/libs/binder/RpcState.cpp @@ -249,7 +249,7 @@ sp<IBinder> RpcState::getRootObject(const base::unique_fd& fd, } status_t RpcState::getMaxThreads(const base::unique_fd& fd, const sp<RpcConnection>& connection, - size_t* maxThreads) { + size_t* maxThreadsOut) { Parcel data; data.markForRpc(connection); Parcel reply; @@ -261,15 +261,36 @@ status_t RpcState::getMaxThreads(const base::unique_fd& fd, const sp<RpcConnecti return status; } - int32_t threads; - status = reply.readInt32(&threads); + int32_t maxThreads; + status = reply.readInt32(&maxThreads); if (status != OK) return status; - if (threads <= 0) { - ALOGE("Error invalid max threads: %d", threads); + if (maxThreads <= 0) { + ALOGE("Error invalid max maxThreads: %d", maxThreads); return BAD_VALUE; } - *maxThreads = threads; + *maxThreadsOut = maxThreads; + return OK; +} + +status_t RpcState::getConnectionId(const base::unique_fd& fd, const sp<RpcConnection>& connection, + int32_t* connectionIdOut) { + Parcel data; + data.markForRpc(connection); + Parcel reply; + + status_t status = transact(fd, RpcAddress::zero(), RPC_SPECIAL_TRANSACT_GET_CONNECTION_ID, data, + connection, &reply, 0); + if (status != OK) { + ALOGE("Error getting connection ID: %s", statusToString(status).c_str()); + return status; + } + + int32_t connectionId; + status = reply.readInt32(&connectionId); + if (status != OK) return status; + + *connectionIdOut = connectionId; return OK; } @@ -554,6 +575,16 @@ status_t RpcState::processTransactInternal(const base::unique_fd& fd, replyStatus = reply.writeInt32(server->getMaxThreads()); break; } + case RPC_SPECIAL_TRANSACT_GET_CONNECTION_ID: { + // only connections w/ services can be the source of a + // connection ID (so still guarded by non-null server) + // + // connections associated with servers must have an ID + // (hence abort) + int32_t id = connection->getPrivateAccessorForId().get().value(); + replyStatus = reply.writeInt32(id); + break; + } default: { replyStatus = UNKNOWN_TRANSACTION; } |