summaryrefslogtreecommitdiff
path: root/grpc/src/core/lib/security/transport/server_auth_filter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/src/core/lib/security/transport/server_auth_filter.cc')
-rw-r--r--grpc/src/core/lib/security/transport/server_auth_filter.cc35
1 files changed, 24 insertions, 11 deletions
diff --git a/grpc/src/core/lib/security/transport/server_auth_filter.cc b/grpc/src/core/lib/security/transport/server_auth_filter.cc
index 67351892..65a7e405 100644
--- a/grpc/src/core/lib/security/transport/server_auth_filter.cc
+++ b/grpc/src/core/lib/security/transport/server_auth_filter.cc
@@ -28,8 +28,9 @@
#include "src/core/lib/security/transport/auth_filters.h"
#include "src/core/lib/slice/slice_internal.h"
-static void recv_initial_metadata_ready(void* arg, grpc_error* error);
-static void recv_trailing_metadata_ready(void* user_data, grpc_error* error);
+static void recv_initial_metadata_ready(void* arg, grpc_error_handle error);
+static void recv_trailing_metadata_ready(void* user_data,
+ grpc_error_handle error);
namespace {
enum async_state {
@@ -79,10 +80,10 @@ struct call_data {
grpc_transport_stream_op_batch* recv_initial_metadata_batch;
grpc_closure* original_recv_initial_metadata_ready;
grpc_closure recv_initial_metadata_ready;
- grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE;
+ grpc_error_handle recv_initial_metadata_error = GRPC_ERROR_NONE;
grpc_closure recv_trailing_metadata_ready;
grpc_closure* original_recv_trailing_metadata_ready;
- grpc_error* recv_trailing_metadata_error;
+ grpc_error_handle recv_trailing_metadata_error;
bool seen_recv_trailing_metadata_ready = false;
grpc_metadata_array md;
const grpc_metadata* consumed_md;
@@ -135,7 +136,7 @@ static void on_md_processing_done_inner(grpc_call_element* elem,
size_t num_consumed_md,
const grpc_metadata* response_md,
size_t num_response_md,
- grpc_error* error) {
+ grpc_error_handle error) {
call_data* calld = static_cast<call_data*>(elem->call_data);
grpc_transport_stream_op_batch* batch = calld->recv_initial_metadata_batch;
/* TODO(jboeuf): Implement support for response_md. */
@@ -175,7 +176,7 @@ static void on_md_processing_done(
// If the call was not cancelled while we were in flight, process the result.
if (gpr_atm_full_cas(&calld->state, static_cast<gpr_atm>(STATE_INIT),
static_cast<gpr_atm>(STATE_DONE))) {
- grpc_error* error = GRPC_ERROR_NONE;
+ grpc_error_handle error = GRPC_ERROR_NONE;
if (status != GRPC_STATUS_OK) {
if (error_details == nullptr) {
error_details = "Authentication metadata processing failed.";
@@ -196,7 +197,7 @@ static void on_md_processing_done(
GRPC_CALL_STACK_UNREF(calld->owning_call, "server_auth_metadata");
}
-static void cancel_call(void* arg, grpc_error* error) {
+static void cancel_call(void* arg, grpc_error_handle error) {
grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
call_data* calld = static_cast<call_data*>(elem->call_data);
// If the result was not already processed, invoke the callback now.
@@ -206,9 +207,10 @@ static void cancel_call(void* arg, grpc_error* error) {
on_md_processing_done_inner(elem, nullptr, 0, nullptr, 0,
GRPC_ERROR_REF(error));
}
+ GRPC_CALL_STACK_UNREF(calld->owning_call, "cancel_call");
}
-static void recv_initial_metadata_ready(void* arg, grpc_error* error) {
+static void recv_initial_metadata_ready(void* arg, grpc_error_handle error) {
grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
call_data* calld = static_cast<call_data*>(elem->call_data);
@@ -218,6 +220,9 @@ static void recv_initial_metadata_ready(void* arg, grpc_error* error) {
chand->creds->auth_metadata_processor().process != nullptr) {
// We're calling out to the application, so we need to make sure
// to drop the call combiner early if we get cancelled.
+ // TODO(yashykt): We would not need this ref if call combiners used
+ // Closure::Run() instead of ExecCtx::Run()
+ GRPC_CALL_STACK_REF(calld->owning_call, "cancel_call");
GRPC_CLOSURE_INIT(&calld->cancel_closure, cancel_call, elem,
grpc_schedule_on_exec_ctx);
calld->call_combiner->SetNotifyOnCancel(&calld->cancel_closure);
@@ -242,7 +247,8 @@ static void recv_initial_metadata_ready(void* arg, grpc_error* error) {
grpc_core::Closure::Run(DEBUG_LOCATION, closure, GRPC_ERROR_REF(error));
}
-static void recv_trailing_metadata_ready(void* user_data, grpc_error* err) {
+static void recv_trailing_metadata_ready(void* user_data,
+ grpc_error_handle err) {
grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
call_data* calld = static_cast<call_data*>(elem->call_data);
if (calld->original_recv_initial_metadata_ready != nullptr) {
@@ -280,7 +286,7 @@ static void server_auth_start_transport_stream_op_batch(
}
/* Constructor for call_data */
-static grpc_error* server_auth_init_call_elem(
+static grpc_error_handle server_auth_init_call_elem(
grpc_call_element* elem, const grpc_call_element_args* args) {
new (elem->call_data) call_data(elem, *args);
return GRPC_ERROR_NONE;
@@ -295,11 +301,18 @@ static void server_auth_destroy_call_elem(
}
/* Constructor for channel_data */
-static grpc_error* server_auth_init_channel_elem(
+static grpc_error_handle server_auth_init_channel_elem(
grpc_channel_element* elem, grpc_channel_element_args* args) {
GPR_ASSERT(!args->is_last);
grpc_auth_context* auth_context =
grpc_find_auth_context_in_args(args->channel_args);
+ if (auth_context == nullptr) {
+ grpc_error_handle error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "No authorization context found. This might be a TRANSIENT failure due "
+ "to certificates not having been loaded yet.");
+ gpr_log(GPR_DEBUG, "%s", grpc_error_std_string(error).c_str());
+ return error;
+ }
GPR_ASSERT(auth_context != nullptr);
grpc_server_credentials* creds =
grpc_find_server_credentials_in_args(args->channel_args);