pw_rpc: Re-acquire response buffer if Channel::Send() fails
A Channel::OutputBuffer object is no longer valid after Channel::Send()
is called. This updates method implementations to obtain a new buffer
before sending an error packet following a failure.
Change-Id: I151b0eff382a98cc0c5f365b69bc357b7672ba60
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/30540
Commit-Queue: Alexei Frolov <frolv@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
diff --git a/pw_rpc/nanopb/nanopb_method.cc b/pw_rpc/nanopb/nanopb_method.cc
index bc96dc9..498eb42 100644
--- a/pw_rpc/nanopb/nanopb_method.cc
+++ b/pw_rpc/nanopb/nanopb_method.cc
@@ -76,6 +76,9 @@
if (channel.Send(response_buffer, response).ok()) {
return;
}
+
+ // Re-acquire the buffer to encode an error packet.
+ response_buffer = channel.AcquireBuffer();
}
PW_LOG_WARN("Failed to encode response packet for channel %u",
diff --git a/pw_rpc/raw/raw_method.cc b/pw_rpc/raw/raw_method.cc
index 4386aba..7fe7f80 100644
--- a/pw_rpc/raw/raw_method.cc
+++ b/pw_rpc/raw/raw_method.cc
@@ -64,8 +64,7 @@
PW_LOG_WARN("Failed to send response packet for channel %u",
unsigned(call.channel().id()));
- call.channel().Send(response_buffer,
- Packet::ServerError(request, Status::Internal()));
+ call.channel().Send(Packet::ServerError(request, Status::Internal()));
}
void RawMethod::CallServerStreaming(ServerCall& call,