[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