Skip to content
Snippets Groups Projects
Commit 9d2822a1 authored by Craig Tiller's avatar Craig Tiller
Browse files

Fix fuzzer bugs

parent 2f9fc7be
No related branches found
No related tags found
No related merge requests found
Showing
with 23 additions and 7 deletions
...@@ -354,6 +354,7 @@ typedef struct call_state { ...@@ -354,6 +354,7 @@ typedef struct call_state {
int cancelled; int cancelled;
int pending_ops; int pending_ops;
grpc_call_details call_details; grpc_call_details call_details;
grpc_byte_buffer *send_message;
// starts at 0, individual flags from DONE_FLAG_xxx are set // starts at 0, individual flags from DONE_FLAG_xxx are set
// as different operations are completed // as different operations are completed
uint64_t done_flags; uint64_t done_flags;
...@@ -466,6 +467,15 @@ static void finished_batch(void *p, bool success) { ...@@ -466,6 +467,15 @@ static void finished_batch(void *p, bool success) {
(bi->cs->done_flags & DONE_FLAG_CALL_CLOSED)) { (bi->cs->done_flags & DONE_FLAG_CALL_CLOSED)) {
GPR_ASSERT(bi->cs->recv_message == NULL); GPR_ASSERT(bi->cs->recv_message == NULL);
} }
if ((bi->has_ops & (1u << GRPC_OP_RECV_MESSAGE) &&
bi->cs->recv_message != NULL)) {
grpc_byte_buffer_destroy(bi->cs->recv_message);
bi->cs->recv_message = NULL;
}
if ((bi->has_ops & (1u << GRPC_OP_SEND_MESSAGE))) {
grpc_byte_buffer_destroy(bi->cs->send_message);
bi->cs->send_message = NULL;
}
if ((bi->has_ops & (1u << GRPC_OP_RECV_STATUS_ON_CLIENT)) || if ((bi->has_ops & (1u << GRPC_OP_RECV_STATUS_ON_CLIENT)) ||
(bi->has_ops & (1u << GRPC_OP_RECV_CLOSE_ON_SERVER))) { (bi->has_ops & (1u << GRPC_OP_RECV_CLOSE_ON_SERVER))) {
bi->cs->done_flags |= DONE_FLAG_CALL_CLOSED; bi->cs->done_flags |= DONE_FLAG_CALL_CLOSED;
...@@ -746,8 +756,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { ...@@ -746,8 +756,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
break; break;
case GRPC_OP_SEND_MESSAGE: case GRPC_OP_SEND_MESSAGE:
op->op = GRPC_OP_SEND_MESSAGE; op->op = GRPC_OP_SEND_MESSAGE;
has_ops |= 1 << GRPC_OP_SEND_MESSAGE; if (g_active_call->send_message != NULL) {
op->data.send_message = read_message(&inp); ok = false;
} else {
has_ops |= 1 << GRPC_OP_SEND_MESSAGE;
g_active_call->send_message = op->data.send_message =
read_message(&inp);
}
break; break;
case GRPC_OP_SEND_CLOSE_FROM_CLIENT: case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
...@@ -808,17 +823,18 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { ...@@ -808,17 +823,18 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
} else { } else {
end(&inp); end(&inp);
} }
if (!ok && (has_ops & (1 << GRPC_OP_SEND_MESSAGE))) {
grpc_byte_buffer_destroy(g_active_call->send_message);
g_active_call->send_message = NULL;
}
for (i = 0; i < num_ops; i++) { for (i = 0; i < num_ops; i++) {
op = &ops[i]; op = &ops[i];
switch (op->op) { switch (op->op) {
case GRPC_OP_SEND_INITIAL_METADATA:
break;
case GRPC_OP_SEND_MESSAGE:
grpc_byte_buffer_destroy(op->data.send_message);
break;
case GRPC_OP_SEND_STATUS_FROM_SERVER: case GRPC_OP_SEND_STATUS_FROM_SERVER:
gpr_free((void *)op->data.send_status_from_server.status_details); gpr_free((void *)op->data.send_status_from_server.status_details);
break; break;
case GRPC_OP_SEND_MESSAGE:
case GRPC_OP_SEND_INITIAL_METADATA:
case GRPC_OP_SEND_CLOSE_FROM_CLIENT: case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
case GRPC_OP_RECV_INITIAL_METADATA: case GRPC_OP_RECV_INITIAL_METADATA:
case GRPC_OP_RECV_MESSAGE: case GRPC_OP_RECV_MESSAGE:
......
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment