From b4b0ac704984be21d128924433cbe9bcd568ef83 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 10 Jan 2018 22:02:37 +0000 Subject: [PATCH] Resolve leak by freeing request payload if resources exhausted --- include/grpc++/impl/codegen/byte_buffer.h | 4 ++++ include/grpc++/impl/codegen/method_handler_impl.h | 5 +++++ src/cpp/server/server_cc.cc | 3 ++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/grpc++/impl/codegen/byte_buffer.h b/include/grpc++/impl/codegen/byte_buffer.h index fe73ce7a83d..9c0246e6174 100644 --- a/include/grpc++/impl/codegen/byte_buffer.h +++ b/include/grpc++/impl/codegen/byte_buffer.h @@ -41,6 +41,8 @@ template class RpcMethodHandler; template class ServerStreamingHandler; +template +class ErrorMethodHandler; template class DeserializeFuncType; } // namespace internal @@ -107,6 +109,8 @@ class ByteBuffer final { friend class internal::RpcMethodHandler; template friend class internal::ServerStreamingHandler; + template + friend class internal::ErrorMethodHandler; template friend class internal::DeserializeFuncType; diff --git a/include/grpc++/impl/codegen/method_handler_impl.h b/include/grpc++/impl/codegen/method_handler_impl.h index d98ab7938cf..93b7826e8fc 100644 --- a/include/grpc++/impl/codegen/method_handler_impl.h +++ b/include/grpc++/impl/codegen/method_handler_impl.h @@ -266,6 +266,11 @@ class ErrorMethodHandler : public MethodHandler { FillOps(param.server_context, &ops); param.call->PerformOps(&ops); param.call->cq()->Pluck(&ops); + // We also have to destroy any request payload in the handler parameter + ByteBuffer* payload = param.request.bbuf_ptr(); + if (payload != nullptr) { + payload->Clear(); + } } }; diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc index 6ab76a287e5..02a663d660e 100644 --- a/src/cpp/server/server_cc.cc +++ b/src/cpp/server/server_cc.cc @@ -196,7 +196,8 @@ class Server::SyncRequest final : public internal::CompletionQueueTag { call_(mrd->call_, server, &cq_, server->max_receive_message_size()), ctx_(mrd->deadline_, &mrd->request_metadata_), has_request_payload_(mrd->has_request_payload_), - request_payload_(mrd->request_payload_), + request_payload_(has_request_payload_ ? mrd->request_payload_ + : nullptr), method_(mrd->method_), server_(server) { ctx_.set_call(mrd->call_);