Blame SOURCES/0143-SYSDB-sysdb_search_object_by_sid-returns-ENOENT.patch

905b4d
From 4bbcc2d6d3f16b015796818746a45134861c93a4 Mon Sep 17 00:00:00 2001
905b4d
From: Pavel Reichl <preichl@redhat.com>
905b4d
Date: Tue, 9 Dec 2014 11:01:13 +0000
905b4d
Subject: [PATCH 4/7] SYSDB: sysdb_search_object_by_sid returns ENOENT
905b4d
MIME-Version: 1.0
905b4d
Content-Type: text/plain; charset=UTF-8
905b4d
Content-Transfer-Encoding: 8bit
905b4d
905b4d
sysdb_search_object_by_sid returns ENOENT if no results are found.
905b4d
905b4d
Part od solution for:
905b4d
https://fedorahosted.org/sssd/ticket/1991
905b4d
905b4d
Fixes:
905b4d
https://fedorahosted.org/sssd/ticket/2520
905b4d
905b4d
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
905b4d
---
905b4d
 src/db/sysdb.h                 |  2 +-
905b4d
 src/db/sysdb_ops.c             | 68 ++++++------------------------------------
905b4d
 src/responder/nss/nsssrv_cmd.c | 25 ++++++++--------
905b4d
 src/responder/pac/pacsrv_cmd.c | 29 ++++++++++--------
905b4d
 src/tests/sysdb-tests.c        |  5 +---
905b4d
 5 files changed, 39 insertions(+), 90 deletions(-)
905b4d
905b4d
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
905b4d
index 01900425ac5e8733eb57877bbadef0e8da00475f..b1e057107cc6e3d4ce7b7bb8e821a2414c3424a7 100644
905b4d
--- a/src/db/sysdb.h
905b4d
+++ b/src/db/sysdb.h
905b4d
@@ -1035,7 +1035,7 @@ errno_t sysdb_search_object_by_sid(TALLOC_CTX *mem_ctx,
905b4d
                                    struct sss_domain_info *domain,
905b4d
                                    const char *sid_str,
905b4d
                                    const char **attrs,
905b4d
-                                   struct ldb_result **msg);
905b4d
+                                   struct ldb_result **res);
905b4d
 
905b4d
 errno_t sysdb_search_object_by_uuid(TALLOC_CTX *mem_ctx,
905b4d
                                     struct sss_domain_info *domain,
905b4d
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
905b4d
index 768f9455329b136b3de9794ad127dd349f1eaa43..b12540b68d1c81c419455416294f3449dd84914e 100644
905b4d
--- a/src/db/sysdb_ops.c
905b4d
+++ b/src/db/sysdb_ops.c
905b4d
@@ -2994,7 +2994,14 @@ int sysdb_delete_by_sid(struct sysdb_ctx *sysdb,
905b4d
     }
905b4d
 
905b4d
     ret = sysdb_search_object_by_sid(tmp_ctx, domain, sid_str, NULL, &res;;
905b4d
-    if (ret != EOK) {
905b4d
+
905b4d
+    if (ret == ENOENT) {
905b4d
+        /* No existing entry. Just quit. */
905b4d
+        DEBUG(SSSDBG_TRACE_FUNC,
905b4d
+              "search by sid did not return any results.\n");
905b4d
+        ret = EOK;
905b4d
+        goto done;
905b4d
+    } else if (ret != EOK) {
905b4d
         DEBUG(SSSDBG_OP_FAILURE, "search by sid failed: %d (%s)\n",
905b4d
               ret, strerror(ret));
905b4d
         goto done;
905b4d
@@ -3007,12 +3014,6 @@ int sysdb_delete_by_sid(struct sysdb_ctx *sysdb,
905b4d
         goto done;
905b4d
     }
905b4d
 
905b4d
-    if (res->count == 0) {
905b4d
-        /* No existing entry. Just quit. */
905b4d
-        ret = EOK;
905b4d
-        goto done;
905b4d
-    }
905b4d
-
905b4d
     ret = sysdb_delete_entry(sysdb, res->msgs[0]->dn, false);
905b4d
     if (ret != EOK) {
905b4d
         goto done;
905b4d
@@ -3564,61 +3565,10 @@ errno_t sysdb_search_object_by_sid(TALLOC_CTX *mem_ctx,
905b4d
                                    struct sss_domain_info *domain,
905b4d
                                    const char *sid_str,
905b4d
                                    const char **attrs,
905b4d
-                                   struct ldb_result **msg)
905b4d
+                                   struct ldb_result **res)
905b4d
 {
905b4d
-/* TODO: use
905b4d
     return sysdb_search_object_by_str_attr(mem_ctx, domain, SYSDB_SID_FILTER,
905b4d
                                            sid_str, attrs, res);
905b4d
-
905b4d
-    when verified that all callers can handle ENOENT correctly. */
905b4d
-
905b4d
-    TALLOC_CTX *tmp_ctx;
905b4d
-    const char *def_attrs[] = { SYSDB_NAME, SYSDB_UIDNUM, SYSDB_GIDNUM,
905b4d
-                                ORIGINALAD_PREFIX SYSDB_NAME,
905b4d
-                                SYSDB_OBJECTCLASS, NULL };
905b4d
-    struct ldb_dn *basedn;
905b4d
-    int ret;
905b4d
-    struct ldb_result *res = NULL;
905b4d
-
905b4d
-    tmp_ctx = talloc_new(NULL);
905b4d
-    if (!tmp_ctx) {
905b4d
-        return ENOMEM;
905b4d
-    }
905b4d
-
905b4d
-    basedn = ldb_dn_new_fmt(tmp_ctx, domain->sysdb->ldb, SYSDB_DOM_BASE, domain->name);
905b4d
-    if (basedn == NULL) {
905b4d
-        DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_new_fmt failed.\n");
905b4d
-        ret = ENOMEM;
905b4d
-        goto done;
905b4d
-    }
905b4d
-
905b4d
-    ret = ldb_search(domain->sysdb->ldb, tmp_ctx, &res,
905b4d
-                     basedn, LDB_SCOPE_SUBTREE, attrs?attrs:def_attrs,
905b4d
-                     SYSDB_SID_FILTER, sid_str);
905b4d
-    if (ret != EOK) {
905b4d
-        ret = sysdb_error_to_errno(ret);
905b4d
-        DEBUG(SSSDBG_OP_FAILURE, "ldb_search failed.\n");
905b4d
-        goto done;
905b4d
-    }
905b4d
-
905b4d
-    if (res->count > 1) {
905b4d
-        DEBUG(SSSDBG_CRIT_FAILURE, "Search for SID [%s] returned more than " \
905b4d
-                                    "one object.\n", sid_str);
905b4d
-        ret = EINVAL;
905b4d
-        goto done;
905b4d
-    }
905b4d
-
905b4d
-    *msg = talloc_steal(mem_ctx, res);
905b4d
-
905b4d
-done:
905b4d
-    if (ret == ENOENT) {
905b4d
-        DEBUG(SSSDBG_TRACE_FUNC, "No such entry.\n");
905b4d
-    } else if (ret) {
905b4d
-        DEBUG(SSSDBG_OP_FAILURE, "Error: %d (%s)\n", ret, strerror(ret));
905b4d
-    }
905b4d
-
905b4d
-    talloc_zfree(tmp_ctx);
905b4d
-    return ret;
905b4d
 }
905b4d
 
905b4d
 errno_t sysdb_search_object_by_uuid(TALLOC_CTX *mem_ctx,
905b4d
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
905b4d
index 80ac221e288665741d8b1e2bd020ecca568106c1..3c5d450714fb3f7655cd32aeef900b4f5e9782c7 100644
905b4d
--- a/src/responder/nss/nsssrv_cmd.c
905b4d
+++ b/src/responder/nss/nsssrv_cmd.c
905b4d
@@ -4491,20 +4491,10 @@ static errno_t nss_cmd_getbysid_search(struct nss_dom_ctx *dctx)
905b4d
 
905b4d
     ret = sysdb_search_object_by_sid(cmdctx, dom, cmdctx->secid, NULL,
905b4d
                                      &dctx->res);
905b4d
-    if (ret != EOK) {
905b4d
-        DEBUG(SSSDBG_CRIT_FAILURE, "Failed to make request to our cache!\n");
905b4d
-        return EIO;
905b4d
-    }
905b4d
-
905b4d
-    if (dctx->res->count > 1) {
905b4d
-        DEBUG(SSSDBG_FATAL_FAILURE, "getbysid call returned more than one " \
905b4d
-                                     "result !?!\n");
905b4d
-        return ENOENT;
905b4d
-    }
905b4d
-
905b4d
-    if (dctx->res->count == 0) {
905b4d
-        DEBUG(SSSDBG_OP_FAILURE, "No results for getbysid call.\n");
905b4d
+    if (ret == ENOENT) {
905b4d
         if (!dctx->check_provider) {
905b4d
+            DEBUG(SSSDBG_OP_FAILURE, "No results for getbysid call.\n");
905b4d
+
905b4d
             /* set negative cache only if not result of cache check */
905b4d
             ret = sss_ncache_set_sid(nctx->ncache, false, cmdctx->secid);
905b4d
             if (ret != EOK) {
905b4d
@@ -4513,6 +4503,15 @@ static errno_t nss_cmd_getbysid_search(struct nss_dom_ctx *dctx)
905b4d
             }
905b4d
         }
905b4d
         return ENOENT;
905b4d
+    } else if (ret != EOK) {
905b4d
+        DEBUG(SSSDBG_CRIT_FAILURE, "Failed to make request to our cache!\n");
905b4d
+        return EIO;
905b4d
+    }
905b4d
+
905b4d
+    if (dctx->res->count > 1) {
905b4d
+        DEBUG(SSSDBG_FATAL_FAILURE, "getbysid call returned more than one " \
905b4d
+                                     "result !?!\n");
905b4d
+        return ENOENT;
905b4d
     }
905b4d
 
905b4d
     /* if this is a caching provider (or if we haven't checked the cache
905b4d
diff --git a/src/responder/pac/pacsrv_cmd.c b/src/responder/pac/pacsrv_cmd.c
905b4d
index cc92592893899b1fa269188facc1a8154f80991d..07d2f0cf79b70429dc7cf2784a8e31d651e5095f 100644
905b4d
--- a/src/responder/pac/pacsrv_cmd.c
905b4d
+++ b/src/responder/pac/pacsrv_cmd.c
905b4d
@@ -297,17 +297,17 @@ static void pac_lookup_sids_done(struct tevent_req *req)
905b4d
             msg = NULL;
905b4d
             ret = sysdb_search_object_by_sid(pr_ctx, dom, entries[c].key.str,
905b4d
                                              NULL, &msg;;
905b4d
-            if (ret != EOK) {
905b4d
-                DEBUG(SSSDBG_OP_FAILURE, "sysdb_search_object_by_sid " \
905b4d
-                                          "failed.\n");
905b4d
-                continue;
905b4d
-            }
905b4d
-
905b4d
-            if (msg->count == 0) {
905b4d
+            if (ret == ENOENT) {
905b4d
                 DEBUG(SSSDBG_OP_FAILURE, "No entry found for SID [%s].\n",
905b4d
-                                          entries[c].key.str);
905b4d
+                      entries[c].key.str);
905b4d
                 continue;
905b4d
-            } else if (msg->count > 1) {
905b4d
+            } else if (ret != EOK) {
905b4d
+                DEBUG(SSSDBG_OP_FAILURE,
905b4d
+                      "sysdb_search_object_by_sid failed.\n");
905b4d
+                continue;
905b4d
+            }
905b4d
+
905b4d
+            if (msg->count > 1) {
905b4d
                 DEBUG(SSSDBG_CRIT_FAILURE, "More then one result returned " \
905b4d
                                             "for SID [%s].\n",
905b4d
                                             entries[c].key.str);
905b4d
@@ -911,10 +911,13 @@ pac_store_membership(struct pac_req_ctx *pr_ctx,
905b4d
 
905b4d
     ret = sysdb_search_object_by_sid(tmp_ctx, grp_dom, grp_sid_str,
905b4d
                                      group_attrs, &group);
905b4d
-    if (ret != EOK) {
905b4d
-        DEBUG(SSSDBG_TRACE_INTERNAL, "sysdb_search_object_by_sid " \
905b4d
-                                      "for SID [%s] failed [%d][%s].\n",
905b4d
-                                      grp_sid_str, ret, strerror(ret));
905b4d
+    if (ret == ENOENT) {
905b4d
+        DEBUG(SSSDBG_OP_FAILURE, "Unexpected number of groups returned.\n");
905b4d
+        goto done;
905b4d
+    } else if (ret != EOK) {
905b4d
+        DEBUG(SSSDBG_TRACE_INTERNAL,
905b4d
+              "sysdb_search_object_by_sid for SID [%s] failed [%d][%s].\n",
905b4d
+              grp_sid_str, ret, strerror(ret));
905b4d
         goto done;
905b4d
     }
905b4d
 
905b4d
diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c
905b4d
index d303982647547eefdce7c37ac5b70e1ffbe869ce..92b41e90d08c2d50775289ba8c922f39350ce625 100644
905b4d
--- a/src/tests/sysdb-tests.c
905b4d
+++ b/src/tests/sysdb-tests.c
905b4d
@@ -4861,13 +4861,10 @@ START_TEST (test_sysdb_search_return_ENOENT)
905b4d
     talloc_zfree(res);
905b4d
 
905b4d
     /* Search object */
905b4d
-    /* TODO: Should return ENOENT */
905b4d
     ret = sysdb_search_object_by_sid(test_ctx, test_ctx->domain,
905b4d
                                      "S-5-4-3-2-1", NULL, &res;;
905b4d
-    fail_unless(ret == EOK, "sysdb_search_object_by_sid_str failed with "
905b4d
+    fail_unless(ret == ENOENT, "sysdb_search_object_by_sid_str failed with "
905b4d
                              "[%d][%s].", ret, strerror(ret));
905b4d
-    fail_unless(res->count == 0, "sysdb_search_object_by_sid_str should not "
905b4d
-                                 "return anything.");
905b4d
     talloc_zfree(res);
905b4d
 
905b4d
     /* Search can return more results */
905b4d
-- 
905b4d
1.9.3
905b4d