summaryrefslogtreecommitdiff
path: root/libs/binder/RpcState.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/binder/RpcState.cpp')
-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()};