Loading libs/binder/RpcServer.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ #include <thread> #include <vector> #include <android-base/file.h> #include <android-base/hex.h> #include <android-base/scopeguard.h> #include <binder/Parcel.h> Loading @@ -37,6 +36,7 @@ #include "RpcSocketAddress.h" #include "RpcState.h" #include "RpcWireFormat.h" #include "Utils.h" namespace android { Loading Loading @@ -381,10 +381,9 @@ void RpcServer::establishConnection(sp<RpcServer>&& server, base::unique_fd clie return; } base::unique_fd fd(TEMP_FAILURE_RETRY( open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOFOLLOW))); if (!base::ReadFully(fd, sessionId.data(), sessionId.size())) { ALOGE("Could not read from /dev/urandom to create session ID"); auto status = getRandomBytes(sessionId.data(), sessionId.size()); if (status != OK) { ALOGE("Failed to read random session ID: %s", strerror(-status)); return; } } while (server->mSessions.end() != server->mSessions.find(sessionId)); Loading libs/binder/RpcSession.cpp +4 −8 Original line number Diff line number Diff line Loading @@ -43,10 +43,6 @@ #include "RpcWireFormat.h" #include "Utils.h" #ifdef __GLIBC__ extern "C" pid_t gettid(); #endif #ifndef __ANDROID_RECOVERY__ #include <android_runtime/vm.h> #include <jni.h> Loading Loading @@ -693,7 +689,7 @@ status_t RpcSession::addOutgoingConnection(std::unique_ptr<RpcTransport> rpcTran { std::lock_guard<std::mutex> _l(mMutex); connection->rpcTransport = std::move(rpcTransport); connection->exclusiveTid = gettid(); connection->exclusiveTid = base::GetThreadId(); mConnections.mOutgoing.push_back(connection); } Loading Loading @@ -750,7 +746,7 @@ sp<RpcSession::RpcConnection> RpcSession::assignIncomingConnectionToThisThread( sp<RpcConnection> session = sp<RpcConnection>::make(); session->rpcTransport = std::move(rpcTransport); session->exclusiveTid = gettid(); session->exclusiveTid = base::GetThreadId(); mConnections.mIncoming.push_back(session); mConnections.mMaxIncoming = mConnections.mIncoming.size(); Loading Loading @@ -786,7 +782,7 @@ status_t RpcSession::ExclusiveConnection::find(const sp<RpcSession>& session, Co connection->mConnection = nullptr; connection->mReentrant = false; pid_t tid = gettid(); uint64_t tid = base::GetThreadId(); std::unique_lock<std::mutex> _l(session->mMutex); session->mConnections.mWaitingThreads++; Loading Loading @@ -873,7 +869,7 @@ status_t RpcSession::ExclusiveConnection::find(const sp<RpcSession>& session, Co return OK; } void RpcSession::ExclusiveConnection::findConnection(pid_t tid, sp<RpcConnection>* exclusive, void RpcSession::ExclusiveConnection::findConnection(uint64_t tid, sp<RpcConnection>* exclusive, sp<RpcConnection>* available, std::vector<sp<RpcConnection>>& sockets, size_t socketsIndexHint) { Loading libs/binder/Utils.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #include "Utils.h" #include <android-base/file.h> #include <string.h> using android::base::ErrnoError; Loading @@ -38,4 +39,17 @@ Result<void> setNonBlocking(android::base::borrowed_fd fd) { return {}; } status_t getRandomBytes(uint8_t* data, size_t size) { int ret = TEMP_FAILURE_RETRY(open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOFOLLOW)); if (ret == -1) { return -errno; } base::unique_fd fd(ret); if (!base::ReadFully(fd, data, size)) { return -errno; } return OK; } } // namespace android libs/binder/Utils.h +3 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <android-base/result.h> #include <android-base/unique_fd.h> #include <log/log.h> #include <utils/Errors.h> #define TEST_AND_RETURN(value, expr) \ do { \ Loading @@ -36,4 +37,6 @@ void zeroMemory(uint8_t* data, size_t size); android::base::Result<void> setNonBlocking(android::base::borrowed_fd fd); status_t getRandomBytes(uint8_t* data, size_t size); } // namespace android libs/binder/include/binder/RpcSession.h +3 −2 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ #pragma once #include <android-base/threads.h> #include <android-base/unique_fd.h> #include <binder/IBinder.h> #include <binder/RpcTransport.h> Loading Loading @@ -211,7 +212,7 @@ private: // whether this or another thread is currently using this fd to make // or receive transactions. std::optional<pid_t> exclusiveTid; std::optional<uint64_t> exclusiveTid; bool allowNested = false; }; Loading Loading @@ -276,7 +277,7 @@ private: const sp<RpcConnection>& get() { return mConnection; } private: static void findConnection(pid_t tid, sp<RpcConnection>* exclusive, static void findConnection(uint64_t tid, sp<RpcConnection>* exclusive, sp<RpcConnection>* available, std::vector<sp<RpcConnection>>& sockets, size_t socketsIndexHint); Loading Loading
libs/binder/RpcServer.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ #include <thread> #include <vector> #include <android-base/file.h> #include <android-base/hex.h> #include <android-base/scopeguard.h> #include <binder/Parcel.h> Loading @@ -37,6 +36,7 @@ #include "RpcSocketAddress.h" #include "RpcState.h" #include "RpcWireFormat.h" #include "Utils.h" namespace android { Loading Loading @@ -381,10 +381,9 @@ void RpcServer::establishConnection(sp<RpcServer>&& server, base::unique_fd clie return; } base::unique_fd fd(TEMP_FAILURE_RETRY( open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOFOLLOW))); if (!base::ReadFully(fd, sessionId.data(), sessionId.size())) { ALOGE("Could not read from /dev/urandom to create session ID"); auto status = getRandomBytes(sessionId.data(), sessionId.size()); if (status != OK) { ALOGE("Failed to read random session ID: %s", strerror(-status)); return; } } while (server->mSessions.end() != server->mSessions.find(sessionId)); Loading
libs/binder/RpcSession.cpp +4 −8 Original line number Diff line number Diff line Loading @@ -43,10 +43,6 @@ #include "RpcWireFormat.h" #include "Utils.h" #ifdef __GLIBC__ extern "C" pid_t gettid(); #endif #ifndef __ANDROID_RECOVERY__ #include <android_runtime/vm.h> #include <jni.h> Loading Loading @@ -693,7 +689,7 @@ status_t RpcSession::addOutgoingConnection(std::unique_ptr<RpcTransport> rpcTran { std::lock_guard<std::mutex> _l(mMutex); connection->rpcTransport = std::move(rpcTransport); connection->exclusiveTid = gettid(); connection->exclusiveTid = base::GetThreadId(); mConnections.mOutgoing.push_back(connection); } Loading Loading @@ -750,7 +746,7 @@ sp<RpcSession::RpcConnection> RpcSession::assignIncomingConnectionToThisThread( sp<RpcConnection> session = sp<RpcConnection>::make(); session->rpcTransport = std::move(rpcTransport); session->exclusiveTid = gettid(); session->exclusiveTid = base::GetThreadId(); mConnections.mIncoming.push_back(session); mConnections.mMaxIncoming = mConnections.mIncoming.size(); Loading Loading @@ -786,7 +782,7 @@ status_t RpcSession::ExclusiveConnection::find(const sp<RpcSession>& session, Co connection->mConnection = nullptr; connection->mReentrant = false; pid_t tid = gettid(); uint64_t tid = base::GetThreadId(); std::unique_lock<std::mutex> _l(session->mMutex); session->mConnections.mWaitingThreads++; Loading Loading @@ -873,7 +869,7 @@ status_t RpcSession::ExclusiveConnection::find(const sp<RpcSession>& session, Co return OK; } void RpcSession::ExclusiveConnection::findConnection(pid_t tid, sp<RpcConnection>* exclusive, void RpcSession::ExclusiveConnection::findConnection(uint64_t tid, sp<RpcConnection>* exclusive, sp<RpcConnection>* available, std::vector<sp<RpcConnection>>& sockets, size_t socketsIndexHint) { Loading
libs/binder/Utils.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #include "Utils.h" #include <android-base/file.h> #include <string.h> using android::base::ErrnoError; Loading @@ -38,4 +39,17 @@ Result<void> setNonBlocking(android::base::borrowed_fd fd) { return {}; } status_t getRandomBytes(uint8_t* data, size_t size) { int ret = TEMP_FAILURE_RETRY(open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOFOLLOW)); if (ret == -1) { return -errno; } base::unique_fd fd(ret); if (!base::ReadFully(fd, data, size)) { return -errno; } return OK; } } // namespace android
libs/binder/Utils.h +3 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <android-base/result.h> #include <android-base/unique_fd.h> #include <log/log.h> #include <utils/Errors.h> #define TEST_AND_RETURN(value, expr) \ do { \ Loading @@ -36,4 +37,6 @@ void zeroMemory(uint8_t* data, size_t size); android::base::Result<void> setNonBlocking(android::base::borrowed_fd fd); status_t getRandomBytes(uint8_t* data, size_t size); } // namespace android
libs/binder/include/binder/RpcSession.h +3 −2 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ #pragma once #include <android-base/threads.h> #include <android-base/unique_fd.h> #include <binder/IBinder.h> #include <binder/RpcTransport.h> Loading Loading @@ -211,7 +212,7 @@ private: // whether this or another thread is currently using this fd to make // or receive transactions. std::optional<pid_t> exclusiveTid; std::optional<uint64_t> exclusiveTid; bool allowNested = false; }; Loading Loading @@ -276,7 +277,7 @@ private: const sp<RpcConnection>& get() { return mConnection; } private: static void findConnection(pid_t tid, sp<RpcConnection>* exclusive, static void findConnection(uint64_t tid, sp<RpcConnection>* exclusive, sp<RpcConnection>* available, std::vector<sp<RpcConnection>>& sockets, size_t socketsIndexHint); Loading