diff options
| author | 2021-06-15 17:57:27 +0000 | |
|---|---|---|
| committer | 2021-06-15 17:57:27 +0000 | |
| commit | 2ce034f75bf2262af4fc751f087adcfe0c6919e1 (patch) | |
| tree | 64b06f1bb2d93dab0799077cf613044e67951741 /libs/binder/RpcAddress.cpp | |
| parent | 547b752ad255d64e629c2bfe80bf14cc98a1b525 (diff) | |
| parent | b86e26b735ee912acf23c670398f2d88fdfe5994 (diff) | |
Merge changes I881f63b8,I4c5edd2d,I8ff0d29c,I6578c3a4,Iea286ab0, ...
* changes:
libbinder: RPC skip init on /dev/null
libbinder: RPC session ID uses the long binder ID
libbinder: RPC prevent binder address collision
libbinder: RpcSession exposes sp<RpcServer>
libbinder: RPC disambiguate server/client
libbinder: RPC disallow nested oneway transactions
libbinder: RpcState pass connection, not fd
Diffstat (limited to 'libs/binder/RpcAddress.cpp')
| -rw-r--r-- | libs/binder/RpcAddress.cpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/libs/binder/RpcAddress.cpp b/libs/binder/RpcAddress.cpp index 5c3232045e..98dee9a039 100644 --- a/libs/binder/RpcAddress.cpp +++ b/libs/binder/RpcAddress.cpp @@ -29,7 +29,7 @@ RpcAddress RpcAddress::zero() { } bool RpcAddress::isZero() const { - RpcWireAddress ZERO{0}; + RpcWireAddress ZERO{.options = 0}; return memcmp(mRawAddr.get(), &ZERO, sizeof(RpcWireAddress)) == 0; } @@ -51,13 +51,34 @@ static void ReadRandomBytes(uint8_t* buf, size_t len) { close(fd); } -RpcAddress RpcAddress::unique() { +RpcAddress RpcAddress::random(bool forServer) { + // The remainder of this header acts as reserved space for different kinds + // of binder objects. + uint64_t options = RPC_WIRE_ADDRESS_OPTION_CREATED; + + // servers and clients allocate addresses independently, so this bit can + // tell you where an address originates + if (forServer) options |= RPC_WIRE_ADDRESS_OPTION_FOR_SERVER; + RpcAddress ret; - ReadRandomBytes((uint8_t*)ret.mRawAddr.get(), sizeof(RpcWireAddress)); + RpcWireAddress* raw = ret.mRawAddr.get(); + + raw->options = options; + ReadRandomBytes(raw->address, sizeof(raw->address)); + LOG_RPC_DETAIL("Creating new address: %s", ret.toString().c_str()); return ret; } +bool RpcAddress::isForServer() const { + return mRawAddr.get()->options & RPC_WIRE_ADDRESS_OPTION_FOR_SERVER; +} + +bool RpcAddress::isRecognizedType() const { + uint64_t allKnownOptions = RPC_WIRE_ADDRESS_OPTION_CREATED | RPC_WIRE_ADDRESS_OPTION_FOR_SERVER; + return (mRawAddr.get()->options & ~allKnownOptions) == 0; +} + RpcAddress RpcAddress::fromRawEmbedded(const RpcWireAddress* raw) { RpcAddress addr; memcpy(addr.mRawAddr.get(), raw, sizeof(RpcWireAddress)); |