diff options
author | 2022-06-09 23:17:45 +0000 | |
---|---|---|
committer | 2022-06-09 23:17:45 +0000 | |
commit | b86cda40e1eff3f9157e5677f25d5933ea8b1392 (patch) | |
tree | ff024e01566b479f3f47aeaa79632e8891f3f6d6 /libs/binder | |
parent | 68aa3bc6d6081c983005d0b70e7dd3f22265a0f8 (diff) |
libbinder: Don't alloc for RPC_COMMAND_DEC_STRONG
Test: TH
Change-Id: I89eb9d87cd6d306d13b879649d209c6b6abd2494
Diffstat (limited to 'libs/binder')
-rw-r--r-- | libs/binder/RpcState.cpp | 24 | ||||
-rw-r--r-- | libs/binder/tests/binderAllocationLimits.cpp | 4 |
2 files changed, 12 insertions, 16 deletions
diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp index f16a9ab98f..f5de5b1eaf 100644 --- a/libs/binder/RpcState.cpp +++ b/libs/binder/RpcState.cpp @@ -964,23 +964,19 @@ status_t RpcState::processDecStrong(const sp<RpcSession::RpcConnection>& connect const sp<RpcSession>& session, const RpcWireHeader& command) { LOG_ALWAYS_FATAL_IF(command.command != RPC_COMMAND_DEC_STRONG, "command: %d", command.command); - CommandData commandData(command.bodySize); - if (!commandData.valid()) { - return NO_MEMORY; - } - iovec iov{commandData.data(), commandData.size()}; - if (status_t status = rpcRec(connection, session, "dec ref body", &iov, 1); status != OK) - return status; - if (command.bodySize != sizeof(RpcDecStrong)) { ALOGE("Expecting %zu but got %" PRId32 " bytes for RpcDecStrong. Terminating!", sizeof(RpcDecStrong), command.bodySize); (void)session->shutdownAndWait(false); return BAD_VALUE; } - RpcDecStrong* body = reinterpret_cast<RpcDecStrong*>(commandData.data()); - uint64_t addr = RpcWireAddress::toRaw(body->address); + RpcDecStrong body; + iovec iov{&body, sizeof(RpcDecStrong)}; + if (status_t status = rpcRec(connection, session, "dec ref body", &iov, 1); status != OK) + return status; + + uint64_t addr = RpcWireAddress::toRaw(body.address); std::unique_lock<std::mutex> _l(mNodeMutex); auto it = mNodeForAddress.find(addr); if (it == mNodeForAddress.end()) { @@ -998,19 +994,19 @@ status_t RpcState::processDecStrong(const sp<RpcSession::RpcConnection>& connect return BAD_VALUE; } - if (it->second.timesSent < body->amount) { + if (it->second.timesSent < body.amount) { ALOGE("Record of sending binder %zu times, but requested decStrong for %" PRIu64 " of %u", - it->second.timesSent, addr, body->amount); + it->second.timesSent, addr, body.amount); return OK; } LOG_ALWAYS_FATAL_IF(it->second.sentRef == nullptr, "Inconsistent state, lost ref for %" PRIu64, addr); - LOG_RPC_DETAIL("Processing dec strong of %" PRIu64 " by %u from %zu", addr, body->amount, + LOG_RPC_DETAIL("Processing dec strong of %" PRIu64 " by %u from %zu", addr, body.amount, it->second.timesSent); - it->second.timesSent -= body->amount; + it->second.timesSent -= body.amount; sp<IBinder> tempHold = tryEraseNode(it); _l.unlock(); tempHold = nullptr; // destructor may make binder calls on this session diff --git a/libs/binder/tests/binderAllocationLimits.cpp b/libs/binder/tests/binderAllocationLimits.cpp index 2c34766faa..60b3c94f5e 100644 --- a/libs/binder/tests/binderAllocationLimits.cpp +++ b/libs/binder/tests/binderAllocationLimits.cpp @@ -210,8 +210,8 @@ TEST(RpcBinderAllocation, SetupRpcServer) { }); CHECK_EQ(OK, remoteBinder->pingBinder()); } - EXPECT_EQ(mallocs, 2); - EXPECT_EQ(totalBytes, 56); + EXPECT_EQ(mallocs, 1); + EXPECT_EQ(totalBytes, 40); } int main(int argc, char** argv) { |