aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/security
diff options
context:
space:
mode:
authorGravatar Julien Boeuf <jboeuf@google.com>2015-09-15 15:20:11 -0700
committerGravatar Julien Boeuf <jboeuf@google.com>2015-09-15 15:20:11 -0700
commit1928d496a237c3850365e2557ae41ae73125fc80 (patch)
treeb5b2de2b1cc522ec6f3d664d6a6ea9ef096a8c58 /src/core/security
parent4ffbf0d22c915b57eb92b6256d8987aea3c68c44 (diff)
Adding C++ tests and fixing a few things.
Diffstat (limited to 'src/core/security')
-rw-r--r--src/core/security/client_auth_filter.c35
-rw-r--r--src/core/security/credentials.c10
2 files changed, 26 insertions, 19 deletions
diff --git a/src/core/security/client_auth_filter.c b/src/core/security/client_auth_filter.c
index f3ecfd0e60..c8811325b9 100644
--- a/src/core/security/client_auth_filter.c
+++ b/src/core/security/client_auth_filter.c
@@ -63,6 +63,7 @@ typedef struct {
int sent_initial_metadata;
gpr_uint8 security_context_set;
grpc_linked_mdelem md_links[MAX_CREDENTIALS_METADATA_COUNT];
+ char *service_url;
} call_data;
/* We can have a per-channel credentials. */
@@ -75,6 +76,13 @@ typedef struct {
grpc_mdstr *status_key;
} channel_data;
+static void reset_service_url(call_data *calld) {
+ if (calld->service_url != NULL) {
+ gpr_free(calld->service_url);
+ calld->service_url = NULL;
+ }
+}
+
static void bubble_up_error(grpc_call_element *elem, grpc_status_code status,
const char *error_msg) {
call_data *calld = elem->call_data;
@@ -93,6 +101,7 @@ static void on_credentials_metadata(void *user_data,
grpc_transport_stream_op *op = &calld->op;
grpc_metadata_batch *mdb;
size_t i;
+ reset_service_url(calld);
if (status != GRPC_CREDENTIALS_OK) {
bubble_up_error(elem, GRPC_STATUS_UNAUTHENTICATED,
"Credentials failed to get metadata.");
@@ -111,8 +120,7 @@ static void on_credentials_metadata(void *user_data,
grpc_call_next_op(elem, op);
}
-static char *build_service_url(const char *url_scheme, call_data *calld) {
- char *service_url;
+void build_service_url(const char *url_scheme, call_data *calld) {
char *service = gpr_strdup(grpc_mdstr_as_c_string(calld->method));
char *last_slash = strrchr(service, '/');
if (last_slash == NULL) {
@@ -125,10 +133,10 @@ static char *build_service_url(const char *url_scheme, call_data *calld) {
*last_slash = '\0';
}
if (url_scheme == NULL) url_scheme = "";
- gpr_asprintf(&service_url, "%s://%s%s", url_scheme,
+ reset_service_url(calld);
+ gpr_asprintf(&calld->service_url, "%s://%s%s", url_scheme,
grpc_mdstr_as_c_string(calld->host), service);
gpr_free(service);
- return service_url;
}
static void send_security_metadata(grpc_call_element *elem,
@@ -137,7 +145,6 @@ static void send_security_metadata(grpc_call_element *elem,
channel_data *chand = elem->channel_data;
grpc_client_security_context *ctx =
(grpc_client_security_context *)op->context[GRPC_CONTEXT_SECURITY].value;
- char *service_url = NULL;
grpc_credentials *channel_creds =
chand->security_connector->request_metadata_creds;
int channel_creds_has_md =
@@ -165,13 +172,12 @@ static void send_security_metadata(grpc_call_element *elem,
grpc_credentials_ref(call_creds_has_md ? ctx->creds : channel_creds);
}
- service_url =
- build_service_url(chand->security_connector->base.url_scheme, calld);
+ build_service_url(chand->security_connector->base.url_scheme, calld);
calld->op = *op; /* Copy op (originates from the caller's stack). */
GPR_ASSERT(calld->pollset);
- grpc_credentials_get_request_metadata(
- calld->creds, calld->pollset, service_url, on_credentials_metadata, elem);
- gpr_free(service_url);
+ grpc_credentials_get_request_metadata(calld->creds, calld->pollset,
+ calld->service_url,
+ on_credentials_metadata, elem);
}
static void on_host_checked(void *user_data, grpc_security_status status) {
@@ -274,13 +280,7 @@ static void init_call_elem(grpc_call_element *elem,
const void *server_transport_data,
grpc_transport_stream_op *initial_op) {
call_data *calld = elem->call_data;
- calld->creds = NULL;
- calld->host = NULL;
- calld->method = NULL;
- calld->pollset = NULL;
- calld->sent_initial_metadata = 0;
- calld->security_context_set = 0;
-
+ memset(calld, 0, sizeof(*calld));
GPR_ASSERT(!initial_op || !initial_op->send_ops);
}
@@ -294,6 +294,7 @@ static void destroy_call_elem(grpc_call_element *elem) {
if (calld->method != NULL) {
GRPC_MDSTR_UNREF(calld->method);
}
+ reset_service_url(calld);
}
/* Constructor for channel_data */
diff --git a/src/core/security/credentials.c b/src/core/security/credentials.c
index afe980a5b0..5d3c7c90b0 100644
--- a/src/core/security/credentials.c
+++ b/src/core/security/credentials.c
@@ -1221,9 +1221,9 @@ static void plugin_md_request_metadata_ready(void *request,
}
r->cb(r->user_data, NULL, 0, GRPC_CREDENTIALS_ERROR);
} else {
+ size_t i;
grpc_credentials_md *md_array = NULL;
if (num_md > 0) {
- size_t i;
md_array = gpr_malloc(num_md * sizeof(grpc_credentials_md));
for (i = 0; i < num_md; i++) {
md_array[i].key = gpr_slice_from_copied_string(md[i].key);
@@ -1232,7 +1232,13 @@ static void plugin_md_request_metadata_ready(void *request,
}
}
r->cb(r->user_data, md_array, num_md, GRPC_CREDENTIALS_OK);
- if (md_array != NULL) gpr_free(md_array);
+ if (md_array != NULL) {
+ for (i = 0; i < num_md; i++) {
+ gpr_slice_unref(md_array[i].key);
+ gpr_slice_unref(md_array[i].value);
+ }
+ gpr_free(md_array);
+ }
}
gpr_free(r);
}