|  | @@ -34,7 +34,7 @@
 | 
	
		
			
				|  |  |  #ifndef GRPCXX_IMPL_CALL_H
 | 
	
		
			
				|  |  |  #define GRPCXX_IMPL_CALL_H
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#include <grpc/grpc.h>
 | 
	
		
			
				|  |  | +#include <grpc/support/alloc.h>
 | 
	
		
			
				|  |  |  #include <grpc++/client_context.h>
 | 
	
		
			
				|  |  |  #include <grpc++/completion_queue.h>
 | 
	
		
			
				|  |  |  #include <grpc++/config.h>
 | 
	
	
		
			
				|  | @@ -85,6 +85,8 @@ class CallOpSendInitialMetadata {
 | 
	
		
			
				|  |  |      op->data.send_initial_metadata.metadata = initial_metadata_;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    void FinishOp(bool* status, int max_message_size) {
 | 
	
		
			
				|  |  | +    if (!send_) return;
 | 
	
		
			
				|  |  | +    gpr_free(initial_metadata_);
 | 
	
		
			
				|  |  |      send_ = false;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -244,6 +246,7 @@ class CallOpServerSendStatus {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |   protected:
 | 
	
		
			
				|  |  |    void AddOp(grpc_op* ops, size_t* nops) {
 | 
	
		
			
				|  |  | +    if (!send_status_available_) return;
 | 
	
		
			
				|  |  |      grpc_op* op = &ops[(*nops)++];
 | 
	
		
			
				|  |  |      op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
 | 
	
		
			
				|  |  |      op->data.send_status_from_server.trailing_metadata_count =
 | 
	
	
		
			
				|  | @@ -255,7 +258,9 @@ class CallOpServerSendStatus {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    void FinishOp(bool* status, int max_message_size) {
 | 
	
		
			
				|  |  | -    send_status_details_ = false;
 | 
	
		
			
				|  |  | +    if (!send_status_available_) return;
 | 
	
		
			
				|  |  | +    gpr_free(trailing_metadata_);
 | 
	
		
			
				|  |  | +    send_status_available_ = false;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |   private:
 | 
	
	
		
			
				|  | @@ -269,7 +274,6 @@ class CallOpServerSendStatus {
 | 
	
		
			
				|  |  |  class CallOpRecvInitialMetadata {
 | 
	
		
			
				|  |  |   public:
 | 
	
		
			
				|  |  |    CallOpRecvInitialMetadata() : recv_initial_metadata_(nullptr) {
 | 
	
		
			
				|  |  | -    memset(&recv_initial_metadata_arr_, 0, sizeof(recv_initial_metadata_arr_));
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    void RecvInitialMetadata(ClientContext* context) {
 | 
	
	
		
			
				|  | @@ -280,6 +284,7 @@ class CallOpRecvInitialMetadata {
 | 
	
		
			
				|  |  |   protected:
 | 
	
		
			
				|  |  |    void AddOp(grpc_op* ops, size_t* nops) {
 | 
	
		
			
				|  |  |      if (!recv_initial_metadata_) return;
 | 
	
		
			
				|  |  | +    memset(&recv_initial_metadata_arr_, 0, sizeof(recv_initial_metadata_arr_));
 | 
	
		
			
				|  |  |      grpc_op* op = &ops[(*nops)++];
 | 
	
		
			
				|  |  |      op->op = GRPC_OP_RECV_INITIAL_METADATA;
 | 
	
		
			
				|  |  |      op->data.recv_initial_metadata = &recv_initial_metadata_arr_;
 | 
	
	
		
			
				|  | @@ -297,7 +302,7 @@ class CallOpRecvInitialMetadata {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class CallOpClientRecvStatus {
 | 
	
		
			
				|  |  |   public:
 | 
	
		
			
				|  |  | -  CallOpClientRecvStatus() { memset(this, 0, sizeof(*this)); }
 | 
	
		
			
				|  |  | +  CallOpClientRecvStatus() : recv_status_(nullptr) {}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    void ClientRecvStatus(ClientContext* context, Status* status) {
 | 
	
		
			
				|  |  |      recv_trailing_metadata_ = &context->trailing_metadata_;
 | 
	
	
		
			
				|  | @@ -307,6 +312,9 @@ class CallOpClientRecvStatus {
 | 
	
		
			
				|  |  |   protected:
 | 
	
		
			
				|  |  |    void AddOp(grpc_op* ops, size_t* nops) {
 | 
	
		
			
				|  |  |      if (recv_status_ == nullptr) return;
 | 
	
		
			
				|  |  | +    memset(&recv_trailing_metadata_arr_, 0, sizeof(recv_trailing_metadata_arr_));
 | 
	
		
			
				|  |  | +    status_details_ = nullptr;
 | 
	
		
			
				|  |  | +    status_details_capacity_ = 0;
 | 
	
		
			
				|  |  |      grpc_op* op = &ops[(*nops)++];
 | 
	
		
			
				|  |  |      op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
 | 
	
		
			
				|  |  |      op->data.recv_status_on_client.trailing_metadata =
 | 
	
	
		
			
				|  | @@ -323,6 +331,7 @@ class CallOpClientRecvStatus {
 | 
	
		
			
				|  |  |      *recv_status_ = Status(
 | 
	
		
			
				|  |  |          static_cast<StatusCode>(status_code_),
 | 
	
		
			
				|  |  |          status_details_ ? grpc::string(status_details_) : grpc::string());
 | 
	
		
			
				|  |  | +    gpr_free(status_details_);
 | 
	
		
			
				|  |  |      recv_status_ = nullptr;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 |