>From c19f9f0b183331be033f7a4561d71089d9eab8a6 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Mon, 16 Dec 2013 03:32:46 +0100 Subject: [PATCH] AD: Retry and terminate sdap_id_op if possible We created the sdap_id_op but never terminated it correctly. --- src/providers/ad/ad_id.c | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/providers/ad/ad_id.c b/src/providers/ad/ad_id.c index a7a74443f009ca6590dbc100d10caa37363cc154..3a90a17f387a6714958e31d603a50ab8e58b82a6 100644 --- a/src/providers/ad/ad_id.c +++ b/src/providers/ad/ad_id.c @@ -427,6 +427,7 @@ struct ad_enumeration_state { struct sdap_domain *sdom; }; +static errno_t ad_enumeration_retry(struct tevent_req *req); static void ad_enumeration_conn_done(struct tevent_req *subreq); static void ad_enumeration_master_done(struct tevent_req *subreq); static void ad_enumeration_done(struct tevent_req *subreq); @@ -439,7 +440,6 @@ ad_enumeration_send(TALLOC_CTX *mem_ctx, void *pvt) { struct tevent_req *req; - struct tevent_req *subreq; struct ad_enumeration_state *state; struct ldap_enum_ctx *ectx; errno_t ret; @@ -464,20 +464,37 @@ ad_enumeration_send(TALLOC_CTX *mem_ctx, goto fail; } + ret = ad_enumeration_retry(req); + if (ret != EOK) { + goto fail; + } + + /* Execution resumes in ad_enumeration_conn_done */ + return req; + +fail: + tevent_req_error(req, ret); + tevent_req_post(req, ev); + return req; +} + +static errno_t +ad_enumeration_retry(struct tevent_req *req) +{ + struct tevent_req *subreq; + errno_t ret; + struct ad_enumeration_state *state = tevent_req_data(req, + struct ad_enumeration_state); + subreq = sdap_id_op_connect_send(state->sdap_op, state, &ret); if (subreq == NULL) { DEBUG(SSSDBG_OP_FAILURE, ("sdap_id_op_connect_send failed: %d(%s).\n", ret, strerror(ret))); - goto fail; + return ret; } + tevent_req_set_callback(subreq, ad_enumeration_conn_done, req); - - return req; - -fail: - tevent_req_error(req, ret); - tevent_req_post(req, ev); - return req; + return EOK; } static void @@ -527,13 +544,20 @@ ad_enumeration_master_done(struct tevent_req *subreq) struct ad_enumeration_state); char *flat_name; char *master_sid; + int dp_error; ret = ad_master_domain_recv(subreq, state, &flat_name, &master_sid); talloc_zfree(subreq); - if (ret != EOK) { - DEBUG(SSSDBG_OP_FAILURE, ("Cannot retrieve master domain info\n")); - tevent_req_error(req, ret); + ret = sdap_id_op_done(state->sdap_op, ret, &dp_error); + if (dp_error == DP_ERR_OK && ret != EOK) { + /* retry */ + ret = ad_enumeration_retry(req); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, ("Cannot retrieve master domain info\n")); + tevent_req_error(req, ret); + return; + } return; } -- 1.8.4.2