Remove memset from call_data from gRPC server.

This was missed due to an explicit memset(0) in init_call_elem.
pull/17191/head
Soheil Hassas Yeganeh 6 years ago
parent 06cbe9baeb
commit 0831996388
  1. 84
      src/core/lib/surface/server.cc

@ -47,6 +47,10 @@
grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel");
static void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
static void server_recv_trailing_metadata_ready(void* user_data,
grpc_error* error);
namespace {
struct listener {
void* arg;
@ -128,38 +132,62 @@ typedef enum {
typedef struct request_matcher request_matcher;
struct call_data {
call_data(grpc_call_element* elem, const grpc_call_element_args& args)
: call(grpc_call_from_top_element(elem)),
call_combiner(args.call_combiner) {
GRPC_CLOSURE_INIT(&server_on_recv_initial_metadata,
::server_on_recv_initial_metadata, elem,
grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
server_recv_trailing_metadata_ready, elem,
grpc_schedule_on_exec_ctx);
}
~call_data() {
GPR_ASSERT(state != PENDING);
GRPC_ERROR_UNREF(recv_initial_metadata_error);
if (host_set) {
grpc_slice_unref_internal(host);
}
if (path_set) {
grpc_slice_unref_internal(path);
}
grpc_metadata_array_destroy(&initial_metadata);
grpc_byte_buffer_destroy(payload);
}
grpc_call* call;
gpr_atm state;
gpr_atm state = NOT_STARTED;
bool path_set;
bool host_set;
bool path_set = false;
bool host_set = false;
grpc_slice path;
grpc_slice host;
grpc_millis deadline;
grpc_millis deadline = GRPC_MILLIS_INF_FUTURE;
grpc_completion_queue* cq_new;
grpc_completion_queue* cq_new = nullptr;
grpc_metadata_batch* recv_initial_metadata;
uint32_t recv_initial_metadata_flags;
grpc_metadata_array initial_metadata;
grpc_metadata_batch* recv_initial_metadata = nullptr;
uint32_t recv_initial_metadata_flags = 0;
grpc_metadata_array initial_metadata =
grpc_metadata_array(); // Zero-initialize the C struct.
request_matcher* matcher;
grpc_byte_buffer* payload;
request_matcher* matcher = nullptr;
grpc_byte_buffer* payload = nullptr;
grpc_closure got_initial_metadata;
grpc_closure server_on_recv_initial_metadata;
grpc_closure kill_zombie_closure;
grpc_closure* on_done_recv_initial_metadata;
grpc_closure recv_trailing_metadata_ready;
grpc_error* recv_initial_metadata_error;
grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE;
grpc_closure* original_recv_trailing_metadata_ready;
grpc_error* recv_trailing_metadata_error;
bool seen_recv_trailing_metadata_ready;
grpc_error* recv_trailing_metadata_error = GRPC_ERROR_NONE;
bool seen_recv_trailing_metadata_ready = false;
grpc_closure publish;
call_data* pending_next;
call_data* pending_next = nullptr;
grpc_call_combiner* call_combiner;
};
@ -875,40 +903,18 @@ static void channel_connectivity_changed(void* cd, grpc_error* error) {
static grpc_error* init_call_elem(grpc_call_element* elem,
const grpc_call_element_args* args) {
call_data* calld = static_cast<call_data*>(elem->call_data);
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
memset(calld, 0, sizeof(call_data));
calld->deadline = GRPC_MILLIS_INF_FUTURE;
calld->call = grpc_call_from_top_element(elem);
calld->call_combiner = args->call_combiner;
GRPC_CLOSURE_INIT(&calld->server_on_recv_initial_metadata,
server_on_recv_initial_metadata, elem,
grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready,
server_recv_trailing_metadata_ready, elem,
grpc_schedule_on_exec_ctx);
server_ref(chand->server);
new (elem->call_data) call_data(elem, *args);
return GRPC_ERROR_NONE;
}
static void destroy_call_elem(grpc_call_element* elem,
const grpc_call_final_info* final_info,
grpc_closure* ignored) {
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
call_data* calld = static_cast<call_data*>(elem->call_data);
GPR_ASSERT(calld->state != PENDING);
GRPC_ERROR_UNREF(calld->recv_initial_metadata_error);
if (calld->host_set) {
grpc_slice_unref_internal(calld->host);
}
if (calld->path_set) {
grpc_slice_unref_internal(calld->path);
}
grpc_metadata_array_destroy(&calld->initial_metadata);
grpc_byte_buffer_destroy(calld->payload);
calld->~call_data();
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
server_unref(chand->server);
}

Loading…
Cancel
Save