diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index ffd1b70075a..5d8f75ed40a 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -1440,11 +1440,17 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops, error = GRPC_CALL_ERROR_INVALID_METADATA; goto done_with_error; } + + // On the server side, grpc-timeout metadata should not + // be passed. For the client, this may be set again below. + call->send_initial_metadata.Remove(grpc_core::GrpcTimeoutMetadata()); + /* TODO(ctiller): just make these the same variable? */ if (call->is_client && call->send_deadline != GRPC_MILLIS_INF_FUTURE) { call->send_initial_metadata.Set(grpc_core::GrpcTimeoutMetadata(), call->send_deadline); } + stream_op_payload->send_initial_metadata.send_initial_metadata = &call->send_initial_metadata; stream_op_payload->send_initial_metadata.send_initial_metadata_flags = @@ -1560,6 +1566,9 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops, } } + // On the server side, grpc-timeout metadata should not + // be passed. + call->send_trailing_metadata.Remove(grpc_core::GrpcTimeoutMetadata()); call->status_error.set(status_error); GRPC_ERROR_UNREF(status_error); diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5772603843543040 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5772603843543040 new file mode 100644 index 00000000000..9aa9ad66ede --- /dev/null +++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5772603843543040 @@ -0,0 +1,168 @@ +actions { + create_server { + } +} +actions { + create_channel { + target: "dns:server" + channel_actions { + add_n_bytes_writable: 1320 + add_n_bytes_readable: 10 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_writable: 10 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_readable: 20 + } + channel_actions { + add_n_bytes_writable: 20 + add_n_bytes_readable: 20 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_writable: 20 + add_n_bytes_readable: 214 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_readable: 1000 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_writable: 10 + add_n_bytes_readable: 10 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_writable: 10 + add_n_bytes_readable: 10 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_writable: 20 + add_n_bytes_readable: 20 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_writable: 10 + add_n_bytes_readable: 10 + wait_ms: 1000 + } + channel_actions { + add_n_bytes_writable: 20 + add_n_bytes_readable: 20 + wait_ms: 1000 + } + } +} +actions { + create_call { + propagation_mask: 536870912 + method { + value: "/foo" + } + timeout: 1000000000 + } +} +actions { + queue_batch { + operations { + send_initial_metadata { + } + } + operations { + send_message { + message { + value: "hello wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\202wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwworld" + } + } + } + } +} +actions { + request_call { + } +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 9997630 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 1000000 +} +actions { + advance_time: 5208000 +} +actions { + poll_cq { + } +} +actions { + change_active_call { + } +} +actions { + queue_batch { + operations { + send_initial_metadata { + metadata { + key { + value: "grpc-timeout" + } + } + } + } + } +} +actions { +} +actions { +} +actions { +} +actions { +} +actions { +} +actions { +} +actions { +} +actions { +} +actions { +} +actions { +}