Merge pull request #8659 from dgquintas/grpclb_call_cancel_locked

Fixed unprotected access to lb policy data
pull/8664/merge
David G. Quintas 8 years ago committed by GitHub
commit 8797e94cfc
  1. 32
      src/core/ext/lb_policy/grpclb/grpclb.c

@ -756,6 +756,18 @@ static void glb_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
glb_policy->pending_picks = NULL; glb_policy->pending_picks = NULL;
pending_ping *pping = glb_policy->pending_pings; pending_ping *pping = glb_policy->pending_pings;
glb_policy->pending_pings = NULL; glb_policy->pending_pings = NULL;
if (glb_policy->rr_policy) {
GRPC_LB_POLICY_UNREF(exec_ctx, glb_policy->rr_policy, "glb_shutdown");
}
if (glb_policy->started_picking) {
if (glb_policy->lb_call != NULL) {
grpc_call_cancel(glb_policy->lb_call, NULL);
/* lb_on_server_status_received will pick up the cancel and clean up */
}
}
grpc_connectivity_state_set(
exec_ctx, &glb_policy->state_tracker, GRPC_CHANNEL_SHUTDOWN,
GRPC_ERROR_CREATE("Channel Shutdown"), "glb_shutdown");
gpr_mu_unlock(&glb_policy->mu); gpr_mu_unlock(&glb_policy->mu);
while (pp != NULL) { while (pp != NULL) {
@ -772,22 +784,6 @@ static void glb_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
GRPC_ERROR_NONE, NULL); GRPC_ERROR_NONE, NULL);
pping = next; pping = next;
} }
if (glb_policy->rr_policy) {
GRPC_LB_POLICY_UNREF(exec_ctx, glb_policy->rr_policy, "glb_shutdown");
}
if (glb_policy->started_picking) {
if (glb_policy->lb_call != NULL) {
grpc_call_cancel(glb_policy->lb_call, NULL);
/* lb_on_server_status_received will pick up the cancellation and clean up
*/
}
}
grpc_connectivity_state_set(
exec_ctx, &glb_policy->state_tracker, GRPC_CHANNEL_SHUTDOWN,
GRPC_ERROR_CREATE("Channel Shutdown"), "glb_shutdown");
} }
static void glb_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, static void glb_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
@ -994,7 +990,7 @@ static void lb_call_init(glb_lb_policy *glb_policy) {
BACKOFF_MAX_SECONDS * 1000); BACKOFF_MAX_SECONDS * 1000);
} }
static void lb_call_destroy(glb_lb_policy *glb_policy) { static void lb_call_destroy_locked(glb_lb_policy *glb_policy) {
GPR_ASSERT(glb_policy->lb_call != NULL); GPR_ASSERT(glb_policy->lb_call != NULL);
grpc_call_destroy(glb_policy->lb_call); grpc_call_destroy(glb_policy->lb_call);
glb_policy->lb_call = NULL; glb_policy->lb_call = NULL;
@ -1199,7 +1195,7 @@ static void lb_on_server_status_received(grpc_exec_ctx *exec_ctx, void *arg,
} }
/* We need to performe cleanups no matter what. */ /* We need to performe cleanups no matter what. */
lb_call_destroy(glb_policy); lb_call_destroy_locked(glb_policy);
if (!glb_policy->shutting_down) { if (!glb_policy->shutting_down) {
/* if we aren't shutting down, restart the LB client call after some time */ /* if we aren't shutting down, restart the LB client call after some time */

Loading…
Cancel
Save