summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2025-05-09 16:39:57 +0000
committer Kampalus <kampalus@protonmail.ch> 2025-09-18 10:07:33 +0200
commit35cad66932f6951217dca2331e4af87c0261ce0f (patch)
treefac82dc9f91de57cfa05bc5d16901c5940587748
parent9c1e6eeb198de2e525c5759b619ca65dec13be4c (diff)
[SP 2025-09-01] RPC Binder: shutdown on ENOMEM
We were expecting crashes in these case, but explicitly shut down. More work needs to be done to ignore transactions in out of memory conditions. Bug: 404210068 Bug: 414720799 Bug: 416734088 Test: binderRpcTest Change-Id: Iaf9a34b4031fb7b9807c962bcc67de8cd9102088 Merged-In: Iaf9a34b4031fb7b9807c962bcc67de8cd9102088 (cherry picked from commit cba4e3642a8a58d54481ed4c14f179bcc7f9ae70)
-rw-r--r--libs/binder/RpcState.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp
index 03d974d186..1ecf3c3628 100644
--- a/libs/binder/RpcState.cpp
+++ b/libs/binder/RpcState.cpp
@@ -687,7 +687,13 @@ status_t RpcState::waitForReply(const sp<RpcSession::RpcConnection>& connection,
memset(&rpcReply, 0, sizeof(RpcWireReply)); // zero because of potential short read
CommandData data(command.bodySize - rpcReplyWireSize);
- if (!data.valid()) return NO_MEMORY;
+ if (!data.valid()) {
+ // b/404210068 - if we run out of memory, the wire protocol gets messed up.
+ // so shutdown. We would need to read all the transaction data anyway and
+ // send a reply still to gracefully recover.
+ (void)session->shutdownAndWait(false);
+ return NO_MEMORY;
+ }
iovec iovs[]{
{&rpcReply, rpcReplyWireSize},
@@ -844,6 +850,10 @@ status_t RpcState::processTransact(
CommandData transactionData(command.bodySize);
if (!transactionData.valid()) {
+ // b/404210068 - if we run out of memory, the wire protocol gets messed up.
+ // so shutdown. We would need to read all the transaction data anyway and
+ // send a reply still to gracefully recover.
+ (void)session->shutdownAndWait(false);
return NO_MEMORY;
}
iovec iov{transactionData.data(), transactionData.size()};