|  | @@ -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(
 |