diff options
Diffstat (limited to 'libs/binder/RpcSession.cpp')
-rw-r--r-- | libs/binder/RpcSession.cpp | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp index 8da3fa3c3f..c5a8dd1ddf 100644 --- a/libs/binder/RpcSession.cpp +++ b/libs/binder/RpcSession.cpp @@ -26,6 +26,7 @@ #include <string_view> +#include <android-base/hex.h> #include <android-base/macros.h> #include <android_runtime/vm.h> #include <binder/Parcel.h> @@ -132,7 +133,7 @@ status_t RpcSession::setupInetClient(const char* addr, unsigned int port) { } status_t RpcSession::setupPreconnectedClient(unique_fd fd, std::function<unique_fd()>&& request) { - return setupClient([&](const RpcAddress& sessionId, bool incoming) -> status_t { + return setupClient([&](const std::vector<uint8_t>& sessionId, bool incoming) -> status_t { // std::move'd from fd becomes -1 (!ok()) if (!fd.ok()) { fd = request(); @@ -214,7 +215,7 @@ status_t RpcSession::transact(const sp<IBinder>& binder, uint32_t code, const Pa sp<RpcSession>::fromExisting(this), reply, flags); } -status_t RpcSession::sendDecStrong(const RpcAddress& address) { +status_t RpcSession::sendDecStrong(uint64_t address) { ExclusiveConnection connection; status_t status = ExclusiveConnection::find(sp<RpcSession>::fromExisting(this), ConnectionUse::CLIENT_REFCOUNT, &connection); @@ -233,12 +234,11 @@ status_t RpcSession::readId() { ConnectionUse::CLIENT, &connection); if (status != OK) return status; - mId = RpcAddress::zero(); - status = state()->getSessionId(connection.get(), sp<RpcSession>::fromExisting(this), - &mId.value()); + status = state()->getSessionId(connection.get(), sp<RpcSession>::fromExisting(this), &mId); if (status != OK) return status; - LOG_RPC_DETAIL("RpcSession %p has id %s", this, mId->toString().c_str()); + LOG_RPC_DETAIL("RpcSession %p has id %s", this, + base::HexString(mId.data(), mId.size()).c_str()); return OK; } @@ -397,8 +397,8 @@ sp<RpcServer> RpcSession::server() { return server; } -status_t RpcSession::setupClient( - const std::function<status_t(const RpcAddress& sessionId, bool incoming)>& connectAndInit) { +status_t RpcSession::setupClient(const std::function<status_t(const std::vector<uint8_t>& sessionId, + bool incoming)>& connectAndInit) { { std::lock_guard<std::mutex> _l(mMutex); LOG_ALWAYS_FATAL_IF(mOutgoingConnections.size() != 0, @@ -407,8 +407,7 @@ status_t RpcSession::setupClient( } if (auto status = initShutdownTrigger(); status != OK) return status; - if (status_t status = connectAndInit(RpcAddress::zero(), false /*incoming*/); status != OK) - return status; + if (status_t status = connectAndInit({}, false /*incoming*/); status != OK) return status; { ExclusiveConnection connection; @@ -449,26 +448,25 @@ status_t RpcSession::setupClient( // we've already setup one client for (size_t i = 0; i + 1 < numThreadsAvailable; i++) { - if (status_t status = connectAndInit(mId.value(), false /*incoming*/); status != OK) - return status; + if (status_t status = connectAndInit(mId, false /*incoming*/); status != OK) return status; } for (size_t i = 0; i < mMaxThreads; i++) { - if (status_t status = connectAndInit(mId.value(), true /*incoming*/); status != OK) - return status; + if (status_t status = connectAndInit(mId, true /*incoming*/); status != OK) return status; } return OK; } status_t RpcSession::setupSocketClient(const RpcSocketAddress& addr) { - return setupClient([&](const RpcAddress& sessionId, bool incoming) { + return setupClient([&](const std::vector<uint8_t>& sessionId, bool incoming) { return setupOneSocketConnection(addr, sessionId, incoming); }); } status_t RpcSession::setupOneSocketConnection(const RpcSocketAddress& addr, - const RpcAddress& sessionId, bool incoming) { + const std::vector<uint8_t>& sessionId, + bool incoming) { for (size_t tries = 0; tries < 5; tries++) { if (tries > 0) usleep(10000); @@ -526,7 +524,7 @@ status_t RpcSession::setupOneSocketConnection(const RpcSocketAddress& addr, return UNKNOWN_ERROR; } -status_t RpcSession::initAndAddConnection(unique_fd fd, const RpcAddress& sessionId, +status_t RpcSession::initAndAddConnection(unique_fd fd, const std::vector<uint8_t>& sessionId, bool incoming) { LOG_ALWAYS_FATAL_IF(mShutdownTrigger == nullptr); auto server = mCtx->newTransport(std::move(fd), mShutdownTrigger.get()); @@ -537,13 +535,20 @@ status_t RpcSession::initAndAddConnection(unique_fd fd, const RpcAddress& sessio LOG_RPC_DETAIL("Socket at client with RpcTransport %p", server.get()); + if (sessionId.size() > std::numeric_limits<uint16_t>::max()) { + ALOGE("Session ID too big %zu", sessionId.size()); + return BAD_VALUE; + } + RpcConnectionHeader header{ .version = mProtocolVersion.value_or(RPC_WIRE_PROTOCOL_VERSION), .options = 0, + .sessionIdSize = static_cast<uint16_t>(sessionId.size()), }; - memcpy(&header.sessionId, &sessionId.viewRawEmbedded(), sizeof(RpcWireAddress)); - if (incoming) header.options |= RPC_CONNECTION_OPTION_INCOMING; + if (incoming) { + header.options |= RPC_CONNECTION_OPTION_INCOMING; + } auto sendHeaderStatus = server->interruptableWriteFully(mShutdownTrigger.get(), &header, sizeof(header)); @@ -553,6 +558,18 @@ status_t RpcSession::initAndAddConnection(unique_fd fd, const RpcAddress& sessio return sendHeaderStatus; } + if (sessionId.size() > 0) { + auto sendSessionIdStatus = + server->interruptableWriteFully(mShutdownTrigger.get(), sessionId.data(), + sessionId.size()); + if (sendSessionIdStatus != OK) { + ALOGE("Could not write session ID ('%s') to socket: %s", + base::HexString(sessionId.data(), sessionId.size()).c_str(), + statusToString(sendSessionIdStatus).c_str()); + return sendSessionIdStatus; + } + } + LOG_RPC_DETAIL("Socket at client: header sent"); if (incoming) { @@ -625,7 +642,7 @@ status_t RpcSession::addOutgoingConnection(std::unique_ptr<RpcTransport> rpcTran } bool RpcSession::setForServer(const wp<RpcServer>& server, const wp<EventListener>& eventListener, - const RpcAddress& sessionId) { + const std::vector<uint8_t>& sessionId) { LOG_ALWAYS_FATAL_IF(mForServer != nullptr); LOG_ALWAYS_FATAL_IF(server == nullptr); LOG_ALWAYS_FATAL_IF(mEventListener != nullptr); |