|
|
|
@ -151,9 +151,7 @@ typedef enum { |
|
|
|
|
SERVER_SHUTDOWN, |
|
|
|
|
} tag_name; |
|
|
|
|
|
|
|
|
|
static void *tag(tag_name name) { |
|
|
|
|
return (void*)(uintptr_t)name; |
|
|
|
|
} |
|
|
|
|
static void *tag(tag_name name) { return (void *)(uintptr_t)name; } |
|
|
|
|
|
|
|
|
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
|
|
|
|
grpc_test_only_set_metadata_hash_seed(0); |
|
|
|
@ -170,7 +168,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
|
|
|
|
|
|
|
|
|
grpc_completion_queue *cq = grpc_completion_queue_create(NULL); |
|
|
|
|
|
|
|
|
|
while (!is_eof(&inp) && channel && server) { |
|
|
|
|
while (!is_eof(&inp) || channel != NULL || server != NULL) { |
|
|
|
|
if (is_eof(&inp)) { |
|
|
|
|
if (channel != NULL) { |
|
|
|
|
grpc_channel_destroy(channel); |
|
|
|
@ -180,7 +178,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
|
|
|
|
if (!server_shutdown) { |
|
|
|
|
grpc_server_shutdown_and_notify(server, cq, tag(SERVER_SHUTDOWN)); |
|
|
|
|
server_shutdown = true; |
|
|
|
|
pending_server_shutdowns ++; |
|
|
|
|
pending_server_shutdowns++; |
|
|
|
|
} else if (pending_server_shutdowns == 0) { |
|
|
|
|
grpc_server_destroy(server); |
|
|
|
|
server = NULL; |
|
|
|
@ -196,12 +194,12 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
|
|
|
|
switch (ev.type) { |
|
|
|
|
case GRPC_OP_COMPLETE: |
|
|
|
|
switch ((tag_name)(uintptr_t)ev.type) { |
|
|
|
|
case SERVER_SHUTDOWN: |
|
|
|
|
GPR_ASSERT(pending_server_shutdowns); |
|
|
|
|
pending_server_shutdowns--; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
GPR_ASSERT(false); |
|
|
|
|
case SERVER_SHUTDOWN: |
|
|
|
|
GPR_ASSERT(pending_server_shutdowns); |
|
|
|
|
pending_server_shutdowns--; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
GPR_ASSERT(false); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case GRPC_QUEUE_TIMEOUT: |
|
|
|
@ -274,7 +272,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
|
|
|
|
} |
|
|
|
|
// destroy server
|
|
|
|
|
case 7: { |
|
|
|
|
if (server != NULL && server_shutdown && pending_server_shutdowns == 0) { |
|
|
|
|
if (server != NULL && server_shutdown && |
|
|
|
|
pending_server_shutdowns == 0) { |
|
|
|
|
grpc_server_destroy(server); |
|
|
|
|
server = NULL; |
|
|
|
|
} |
|
|
|
|