Loading libs/binder/RpcServer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <binder/RpcServer.h> #include <binder/RpcTransportRaw.h> #include <log/log.h> #include <utils/Compat.h> #include "FdTrigger.h" #include "RpcSocketAddress.h" Loading libs/binder/RpcSession.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include <binder/RpcServer.h> #include <binder/RpcTransportRaw.h> #include <binder/Stability.h> #include <utils/Compat.h> #include <utils/String8.h> #include "FdTrigger.h" Loading libs/binder/RpcState.cpp +1 −4 Original line number Diff line number Diff line Loading @@ -661,13 +661,10 @@ status_t RpcState::getAndExecuteCommand(const sp<RpcSession::RpcConnection>& con status_t RpcState::drainCommands(const sp<RpcSession::RpcConnection>& connection, const sp<RpcSession>& session, CommandType type) { uint8_t buf; while (true) { size_t num_bytes; status_t status = connection->rpcTransport->peek(&buf, sizeof(buf), &num_bytes); status_t status = connection->rpcTransport->pollRead(); if (status == WOULD_BLOCK) break; if (status != OK) return status; if (!num_bytes) break; status = getAndExecuteCommand(connection, session, type); if (status != OK) return status; Loading libs/binder/RpcTransportRaw.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -32,19 +32,22 @@ namespace { class RpcTransportRaw : public RpcTransport { public: explicit RpcTransportRaw(android::base::unique_fd socket) : mSocket(std::move(socket)) {} status_t peek(void* buf, size_t size, size_t* out_size) override { ssize_t ret = TEMP_FAILURE_RETRY(::recv(mSocket.get(), buf, size, MSG_PEEK)); status_t pollRead(void) override { uint8_t buf; ssize_t ret = TEMP_FAILURE_RETRY( ::recv(mSocket.get(), &buf, sizeof(buf), MSG_PEEK | MSG_DONTWAIT)); if (ret < 0) { int savedErrno = errno; if (savedErrno == EAGAIN || savedErrno == EWOULDBLOCK) { return WOULD_BLOCK; } LOG_RPC_DETAIL("RpcTransport peek(): %s", strerror(savedErrno)); LOG_RPC_DETAIL("RpcTransport poll(): %s", strerror(savedErrno)); return -savedErrno; } else if (ret == 0) { return DEAD_OBJECT; } *out_size = static_cast<size_t>(ret); return OK; } Loading libs/binder/RpcTransportTls.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -277,7 +277,7 @@ class RpcTransportTls : public RpcTransport { public: RpcTransportTls(android::base::unique_fd socket, Ssl ssl) : mSocket(std::move(socket)), mSsl(std::move(ssl)) {} status_t peek(void* buf, size_t size, size_t* out_size) override; status_t pollRead(void) override; status_t interruptableWriteFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::function<status_t()>& altPoll) override; status_t interruptableReadFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, Loading @@ -289,9 +289,9 @@ private: }; // Error code is errno. status_t RpcTransportTls::peek(void* buf, size_t size, size_t* out_size) { size_t todo = std::min<size_t>(size, std::numeric_limits<int>::max()); auto [ret, errorQueue] = mSsl.call(SSL_peek, buf, static_cast<int>(todo)); status_t RpcTransportTls::pollRead(void) { uint8_t buf; auto [ret, errorQueue] = mSsl.call(SSL_peek, &buf, sizeof(buf)); if (ret < 0) { int err = mSsl.getError(ret); if (err == SSL_ERROR_WANT_WRITE || err == SSL_ERROR_WANT_READ) { Loading @@ -304,7 +304,6 @@ status_t RpcTransportTls::peek(void* buf, size_t size, size_t* out_size) { } errorQueue.clear(); LOG_TLS_DETAIL("TLS: Peeked %d bytes!", ret); *out_size = static_cast<size_t>(ret); return OK; } Loading Loading
libs/binder/RpcServer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <binder/RpcServer.h> #include <binder/RpcTransportRaw.h> #include <log/log.h> #include <utils/Compat.h> #include "FdTrigger.h" #include "RpcSocketAddress.h" Loading
libs/binder/RpcSession.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include <binder/RpcServer.h> #include <binder/RpcTransportRaw.h> #include <binder/Stability.h> #include <utils/Compat.h> #include <utils/String8.h> #include "FdTrigger.h" Loading
libs/binder/RpcState.cpp +1 −4 Original line number Diff line number Diff line Loading @@ -661,13 +661,10 @@ status_t RpcState::getAndExecuteCommand(const sp<RpcSession::RpcConnection>& con status_t RpcState::drainCommands(const sp<RpcSession::RpcConnection>& connection, const sp<RpcSession>& session, CommandType type) { uint8_t buf; while (true) { size_t num_bytes; status_t status = connection->rpcTransport->peek(&buf, sizeof(buf), &num_bytes); status_t status = connection->rpcTransport->pollRead(); if (status == WOULD_BLOCK) break; if (status != OK) return status; if (!num_bytes) break; status = getAndExecuteCommand(connection, session, type); if (status != OK) return status; Loading
libs/binder/RpcTransportRaw.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -32,19 +32,22 @@ namespace { class RpcTransportRaw : public RpcTransport { public: explicit RpcTransportRaw(android::base::unique_fd socket) : mSocket(std::move(socket)) {} status_t peek(void* buf, size_t size, size_t* out_size) override { ssize_t ret = TEMP_FAILURE_RETRY(::recv(mSocket.get(), buf, size, MSG_PEEK)); status_t pollRead(void) override { uint8_t buf; ssize_t ret = TEMP_FAILURE_RETRY( ::recv(mSocket.get(), &buf, sizeof(buf), MSG_PEEK | MSG_DONTWAIT)); if (ret < 0) { int savedErrno = errno; if (savedErrno == EAGAIN || savedErrno == EWOULDBLOCK) { return WOULD_BLOCK; } LOG_RPC_DETAIL("RpcTransport peek(): %s", strerror(savedErrno)); LOG_RPC_DETAIL("RpcTransport poll(): %s", strerror(savedErrno)); return -savedErrno; } else if (ret == 0) { return DEAD_OBJECT; } *out_size = static_cast<size_t>(ret); return OK; } Loading
libs/binder/RpcTransportTls.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -277,7 +277,7 @@ class RpcTransportTls : public RpcTransport { public: RpcTransportTls(android::base::unique_fd socket, Ssl ssl) : mSocket(std::move(socket)), mSsl(std::move(ssl)) {} status_t peek(void* buf, size_t size, size_t* out_size) override; status_t pollRead(void) override; status_t interruptableWriteFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, const std::function<status_t()>& altPoll) override; status_t interruptableReadFully(FdTrigger* fdTrigger, iovec* iovs, int niovs, Loading @@ -289,9 +289,9 @@ private: }; // Error code is errno. status_t RpcTransportTls::peek(void* buf, size_t size, size_t* out_size) { size_t todo = std::min<size_t>(size, std::numeric_limits<int>::max()); auto [ret, errorQueue] = mSsl.call(SSL_peek, buf, static_cast<int>(todo)); status_t RpcTransportTls::pollRead(void) { uint8_t buf; auto [ret, errorQueue] = mSsl.call(SSL_peek, &buf, sizeof(buf)); if (ret < 0) { int err = mSsl.getError(ret); if (err == SSL_ERROR_WANT_WRITE || err == SSL_ERROR_WANT_READ) { Loading @@ -304,7 +304,6 @@ status_t RpcTransportTls::peek(void* buf, size_t size, size_t* out_size) { } errorQueue.clear(); LOG_TLS_DETAIL("TLS: Peeked %d bytes!", ret); *out_size = static_cast<size_t>(ret); return OK; } Loading