diff options
author | Mark D. Roth <roth@google.com> | 2017-09-28 08:33:51 -0700 |
---|---|---|
committer | Mark D. Roth <roth@google.com> | 2017-09-28 08:33:51 -0700 |
commit | 55a807aec8f7b42b944225e104210c63fdf29d1c (patch) | |
tree | 70e70124ab9762c5f3c3d7925a1b4dd195ea5bf7 /src/core/lib | |
parent | c1af97d076f923d69e419bd010cd4efa1bcfb2e8 (diff) |
Fix race condition in composite credentials.
Diffstat (limited to 'src/core/lib')
-rw-r--r-- | src/core/lib/security/credentials/composite/composite_credentials.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/src/core/lib/security/credentials/composite/composite_credentials.c b/src/core/lib/security/credentials/composite/composite_credentials.c index 09fd60a12c..b67ff48d0f 100644 --- a/src/core/lib/security/credentials/composite/composite_credentials.c +++ b/src/core/lib/security/credentials/composite/composite_credentials.c @@ -87,6 +87,7 @@ static bool composite_call_get_request_metadata( ctx->on_request_metadata = on_request_metadata; GRPC_CLOSURE_INIT(&ctx->internal_on_request_metadata, composite_call_metadata_cb, ctx, grpc_schedule_on_exec_ctx); + bool synchronous = true; while (ctx->creds_index < ctx->composite_creds->inner.num_creds) { grpc_call_credentials *inner_creds = ctx->composite_creds->inner.creds_array[ctx->creds_index++]; @@ -95,19 +96,12 @@ static bool composite_call_get_request_metadata( ctx->md_array, &ctx->internal_on_request_metadata, error)) { if (*error != GRPC_ERROR_NONE) break; } else { + synchronous = false; // Async return. break; } } - // If we got through all creds synchronously or we got a synchronous - // error on one of them, return synchronously. - if (ctx->creds_index == ctx->composite_creds->inner.num_creds || - *error != GRPC_ERROR_NONE) { - gpr_free(ctx); - return true; - } - // At least one inner cred is returning asynchronously, so we'll - // return asynchronously as well. - return false; + if (synchronous) gpr_free(ctx); + return synchronous; } static void composite_call_cancel_get_request_metadata( |