|
|
|
@ -381,6 +381,33 @@ static call_state *new_call(call_state *sibling, call_state_type type) { |
|
|
|
|
return c; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static call_state *maybe_delete_call_state(call_state **active, call_state *call) { |
|
|
|
|
call_state *next = call->next; |
|
|
|
|
|
|
|
|
|
if (call->call != NULL) return next; |
|
|
|
|
|
|
|
|
|
if (call == *active) { |
|
|
|
|
*active = call->next; |
|
|
|
|
GPR_ASSERT(call != *active); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
call->prev->next = call->next; |
|
|
|
|
call->next->prev = call->prev; |
|
|
|
|
grpc_metadata_array_destroy(&call->recv_initial_metadata); |
|
|
|
|
grpc_metadata_array_destroy(&call->recv_trailing_metadata); |
|
|
|
|
gpr_free(call->recv_status_details); |
|
|
|
|
grpc_call_details_destroy(&call->call_details); |
|
|
|
|
gpr_free(call); |
|
|
|
|
|
|
|
|
|
return next; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static call_state *destroy_call(call_state **active, call_state *call) { |
|
|
|
|
grpc_call_destroy(call->call); |
|
|
|
|
call->call = NULL; |
|
|
|
|
return maybe_delete_call_state(active, call); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
|
|
|
|
grpc_test_only_set_metadata_hash_seed(0); |
|
|
|
|
if (squelch) gpr_set_log_function(dont_log); |
|
|
|
@ -422,6 +449,12 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
|
|
|
|
g_server = NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
call_state *s = active_call; |
|
|
|
|
do { |
|
|
|
|
if (s->type != PENDING_SERVER && s->call != NULL) { |
|
|
|
|
s = destroy_call(&active_call, s); |
|
|
|
|
} |
|
|
|
|
} while (s != active_call); |
|
|
|
|
|
|
|
|
|
g_now = gpr_time_add(g_now, gpr_time_from_seconds(1, GPR_TIMESPAN)); |
|
|
|
|
} |
|
|
|
@ -791,6 +824,16 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
// destroy a call
|
|
|
|
|
case 20: { |
|
|
|
|
if (active_call->type != ROOT && active_call->type != PENDING_SERVER && |
|
|
|
|
active_call->call != NULL) { |
|
|
|
|
destroy_call(&active_call, active_call); |
|
|
|
|
} else { |
|
|
|
|
end(&inp); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|