summaryrefslogtreecommitdiff
path: root/libs/binder/RpcAddress.cpp
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2021-06-15 17:57:27 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2021-06-15 17:57:27 +0000
commit2ce034f75bf2262af4fc751f087adcfe0c6919e1 (patch)
tree64b06f1bb2d93dab0799077cf613044e67951741 /libs/binder/RpcAddress.cpp
parent547b752ad255d64e629c2bfe80bf14cc98a1b525 (diff)
parentb86e26b735ee912acf23c670398f2d88fdfe5994 (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.cpp27
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));