[SSSD] [PATCH] AD: Retry and terminate sdap_id_op if possible
Jakub Hrozek
jhrozek at redhat.com
Tue Dec 17 13:07:47 UTC 2013
Hi,
another smaller issue I found when working on other patches. I quickly
scanned the rest of the code and I think we have a similar issue
elsewhere, so we can either accept this patch or file a ticket and fix
it everywhere.
-------------- next part --------------
>From c19f9f0b183331be033f7a4561d71089d9eab8a6 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
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
More information about the sssd-devel
mailing list