[SSSD] [PATCH] LDAP: Handle errors from sdap_id_op properly in enum code

Jakub Hrozek jhrozek at redhat.com
Tue Feb 11 16:34:21 UTC 2014


Hi,

when testing the AD detection code, I realized that the sdap_id_op
handling in the enumeration code was wrong. It only handled recoverable
errors, but not the offline case or fatal errors.

I think this patch is another reason we should simplify handling of the
sdap_id_ops.
-------------- next part --------------
>From 78dcb3fbacd4a55b74220eafd2a87c5fad9268b8 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Tue, 11 Feb 2014 12:23:51 +0100
Subject: [PATCH] LDAP: Handle errors from sdap_id_op properly in enum code

---
 src/providers/ldap/sdap_async_enum.c | 42 +++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/providers/ldap/sdap_async_enum.c b/src/providers/ldap/sdap_async_enum.c
index cbee59ee5f517e25cb76db41df4d73104e979388..c23a1328563c2949e1134ed1a25d5711684e0cc1 100644
--- a/src/providers/ldap/sdap_async_enum.c
+++ b/src/providers/ldap/sdap_async_enum.c
@@ -236,7 +236,7 @@ static void sdap_dom_enum_ex_posix_check_done(struct tevent_req *subreq)
 
     ret = sdap_posix_check_recv(subreq, &has_posix);
     talloc_zfree(subreq);
-    if (ret != EOK) {
+    if (ret != EOK && ret != ERR_NO_POSIX) {
         /* We can only finish the id_op on error as the connection
          * is re-used by the user search
          */
@@ -249,6 +249,16 @@ static void sdap_dom_enum_ex_posix_check_done(struct tevent_req *subreq)
                 tevent_req_error(req, ret);
             }
             return;
+        } else if (dp_error == DP_ERR_OFFLINE) {
+            DEBUG(SSSDBG_TRACE_FUNC, ("Backend is offline, retrying later\n"));
+            tevent_req_done(req);
+            return;
+        } else {
+            /* Non-recoverable error */
+            DEBUG(SSSDBG_OP_FAILURE,
+                ("POSIX check failed: %d: %s\n", ret, sss_strerror(ret)));
+            tevent_req_error(req, ret);
+            return;
         }
     }
 
@@ -307,6 +317,16 @@ static void sdap_dom_enum_ex_users_done(struct tevent_req *subreq)
             return;
         }
         return;
+    } else if (dp_error == DP_ERR_OFFLINE) {
+        DEBUG(SSSDBG_TRACE_FUNC, ("Backend is offline, retrying later\n"));
+        tevent_req_done(req);
+        return;
+    } else if (ret != EOK && ret != ENOENT) {
+        /* Non-recoverable error */
+        DEBUG(SSSDBG_OP_FAILURE,
+              ("User enumeration failed: %d: %s\n", ret, sss_strerror(ret)));
+        tevent_req_error(req, ret);
+        return;
     }
 
     state->group_op = sdap_id_op_create(state, state->group_conn->conn_cache);
@@ -368,6 +388,16 @@ static void sdap_dom_enum_ex_groups_done(struct tevent_req *subreq)
             return;
         }
         return;
+    } else if (dp_error == DP_ERR_OFFLINE) {
+        DEBUG(SSSDBG_TRACE_FUNC, ("Backend is offline, retrying later\n"));
+        tevent_req_done(req);
+        return;
+    } else if (ret != EOK && ret != ENOENT) {
+        /* Non-recoverable error */
+        DEBUG(SSSDBG_OP_FAILURE,
+              ("Group enumeration failed: %d: %s\n", ret, sss_strerror(ret)));
+        tevent_req_error(req, ret);
+        return;
     }
 
 
@@ -427,6 +457,16 @@ static void sdap_dom_enum_ex_svcs_done(struct tevent_req *subreq)
             return;
         }
         return;
+    } else if (dp_error == DP_ERR_OFFLINE) {
+        DEBUG(SSSDBG_TRACE_FUNC, ("Backend is offline, retrying later\n"));
+        tevent_req_done(req);
+        return;
+    } else if (ret != EOK && ret != ENOENT) {
+        /* Non-recoverable error */
+        DEBUG(SSSDBG_OP_FAILURE,
+              ("Service enumeration failed: %d: %s\n", ret, sss_strerror(ret)));
+        tevent_req_error(req, ret);
+        return;
     }
 
     /* Ok, we've completed an enumeration. Save this to the
-- 
1.8.5.3



More information about the sssd-devel mailing list