Blame SOURCES/0105-RESPONDER-Fallback-to-global-domain-resolution-order.patch

bb7cd1
From b7d2310e9ddd79bfdea2bc334bd11d4df9be37a2 Mon Sep 17 00:00:00 2001
bb7cd1
From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= <fidencio@redhat.com>
bb7cd1
Date: Wed, 12 Apr 2017 10:43:25 +0200
bb7cd1
Subject: [PATCH 105/110] RESPONDER: Fallback to global domain resolution order
bb7cd1
 in case the view doesn't have this option set
bb7cd1
MIME-Version: 1.0
bb7cd1
Content-Type: text/plain; charset=UTF-8
bb7cd1
Content-Transfer-Encoding: 8bit
bb7cd1
bb7cd1
The current code has been ignoring the domain resolution order set
bb7cd1
globally on IPA in case there's a view but this doesn't have any domain
bb7cd1
resolution order set.
bb7cd1
bb7cd1
It happens because we haven't been checking whether the view attribute
bb7cd1
didn't exist and then we ended up populating the list cache_req domains'
bb7cd1
list assuming that no order has been set instead of falling back to the
bb7cd1
next preferred method.
bb7cd1
bb7cd1
Related:
bb7cd1
https://pagure.io/SSSD/sssd/issue/3001
bb7cd1
bb7cd1
Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
bb7cd1
bb7cd1
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
bb7cd1
(cherry picked from commit a3faad0e4dc1ca4473746c3822ecfc5aed876e6d)
bb7cd1
---
bb7cd1
 src/responder/common/cache_req/cache_req_domain.c |  14 ++-
bb7cd1
 src/responder/common/cache_req/cache_req_domain.h |   5 +-
bb7cd1
 src/responder/common/responder_common.c           | 108 +++++++++++++---------
bb7cd1
 3 files changed, 74 insertions(+), 53 deletions(-)
bb7cd1
bb7cd1
diff --git a/src/responder/common/cache_req/cache_req_domain.c b/src/responder/common/cache_req/cache_req_domain.c
bb7cd1
index bbabd695f1c6b6c29b7e61f571382ab9adfb0ea2..86a88efd54ca0f4a0748b44ece1b8515438d4628 100644
bb7cd1
--- a/src/responder/common/cache_req/cache_req_domain.c
bb7cd1
+++ b/src/responder/common/cache_req/cache_req_domain.c
bb7cd1
@@ -120,20 +120,21 @@ done:
bb7cd1
     return cr_domains;
bb7cd1
 }
bb7cd1
 
bb7cd1
-struct cache_req_domain *
bb7cd1
+errno_t
bb7cd1
 cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
                                         TALLOC_CTX *mem_ctx,
bb7cd1
                                         struct sss_domain_info *domains,
bb7cd1
-                                        const char *domain_resolution_order)
bb7cd1
+                                        const char *domain_resolution_order,
bb7cd1
+                                        struct cache_req_domain **_cr_domains)
bb7cd1
 {
bb7cd1
     TALLOC_CTX *tmp_ctx;
bb7cd1
-    struct cache_req_domain *cr_domains = NULL;
bb7cd1
+    struct cache_req_domain *cr_domains;
bb7cd1
     char **list = NULL;
bb7cd1
     errno_t ret;
bb7cd1
 
bb7cd1
     tmp_ctx = talloc_new(NULL);
bb7cd1
     if (tmp_ctx == NULL) {
bb7cd1
-        return NULL;
bb7cd1
+        return ENOMEM;
bb7cd1
     }
bb7cd1
 
bb7cd1
     if (domain_resolution_order != NULL) {
bb7cd1
@@ -160,7 +161,10 @@ cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
         goto done;
bb7cd1
     }
bb7cd1
 
bb7cd1
+    *_cr_domains = cr_domains;
bb7cd1
+    ret = EOK;
bb7cd1
+
bb7cd1
 done:
bb7cd1
     talloc_free(tmp_ctx);
bb7cd1
-    return cr_domains;
bb7cd1
+    return ret;
bb7cd1
 }
bb7cd1
diff --git a/src/responder/common/cache_req/cache_req_domain.h b/src/responder/common/cache_req/cache_req_domain.h
bb7cd1
index 41c50e8c293d7b032cb2f05482c40e93e4f723dc..000087e5ca2074f22169a4af627810f4f287e430 100644
bb7cd1
--- a/src/responder/common/cache_req/cache_req_domain.h
bb7cd1
+++ b/src/responder/common/cache_req/cache_req_domain.h
bb7cd1
@@ -34,11 +34,12 @@ struct cache_req_domain *
bb7cd1
 cache_req_domain_get_domain_by_name(struct cache_req_domain *domains,
bb7cd1
                                     const char *name);
bb7cd1
 
bb7cd1
-struct cache_req_domain *
bb7cd1
+errno_t
bb7cd1
 cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
                                         TALLOC_CTX *mem_ctx,
bb7cd1
                                         struct sss_domain_info *domains,
bb7cd1
-                                        const char *domain_resolution_order);
bb7cd1
+                                        const char *domain_resolution_order,
bb7cd1
+                                        struct cache_req_domain **_cr_domains);
bb7cd1
 
bb7cd1
 void cache_req_domain_list_zfree(struct cache_req_domain **cr_domains);
bb7cd1
 
bb7cd1
diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c
bb7cd1
index ac6320b08de09bc6c7e8dd1af72e0a493a449f7a..62b71b5104fdbb585d086d44d2ca2ab9717dd788 100644
bb7cd1
--- a/src/responder/common/responder_common.c
bb7cd1
+++ b/src/responder/common/responder_common.c
bb7cd1
@@ -1486,10 +1486,11 @@ fail:
bb7cd1
 }
bb7cd1
 
bb7cd1
 /* ====== Helper functions for the domain resolution order ======= */
bb7cd1
-static struct cache_req_domain *
bb7cd1
+static errno_t
bb7cd1
 sss_resp_new_cr_domains_from_ipa_id_view(TALLOC_CTX *mem_ctx,
bb7cd1
                                          struct sss_domain_info *domains,
bb7cd1
-                                         struct sysdb_ctx *sysdb)
bb7cd1
+                                         struct sysdb_ctx *sysdb,
bb7cd1
+                                         struct cache_req_domain **_cr_domains)
bb7cd1
 {
bb7cd1
     TALLOC_CTX *tmp_ctx;
bb7cd1
     struct cache_req_domain *cr_domains = NULL;
bb7cd1
@@ -1498,7 +1499,7 @@ sss_resp_new_cr_domains_from_ipa_id_view(TALLOC_CTX *mem_ctx,
bb7cd1
 
bb7cd1
     tmp_ctx = talloc_new(NULL);
bb7cd1
     if (tmp_ctx == NULL) {
bb7cd1
-        return NULL;
bb7cd1
+        return ENOMEM;
bb7cd1
     }
bb7cd1
 
bb7cd1
     ret = sysdb_get_view_domain_resolution_order(tmp_ctx, sysdb,
bb7cd1
@@ -1510,12 +1511,13 @@ sss_resp_new_cr_domains_from_ipa_id_view(TALLOC_CTX *mem_ctx,
bb7cd1
         goto done;
bb7cd1
     }
bb7cd1
 
bb7cd1
-    /* Using mem_ctx (which is rctx) directly here to avoid copying
bb7cd1
-     * this memory around. */
bb7cd1
-    cr_domains = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
-                                    mem_ctx, domains, domain_resolution_order);
bb7cd1
-    if (cr_domains == NULL) {
bb7cd1
-        ret = ENOMEM;
bb7cd1
+    if (ret == ENOENT) {
bb7cd1
+        goto done;
bb7cd1
+    }
bb7cd1
+
bb7cd1
+    ret = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
+                        mem_ctx, domains, domain_resolution_order, &cr_domains);
bb7cd1
+    if (ret != EOK) {
bb7cd1
         DEBUG(SSSDBG_DEFAULT,
bb7cd1
               "cache_req_domain_new_list_from_domain_resolution_order() "
bb7cd1
               "failed [%d]: [%s].\n",
bb7cd1
@@ -1523,25 +1525,31 @@ sss_resp_new_cr_domains_from_ipa_id_view(TALLOC_CTX *mem_ctx,
bb7cd1
         goto done;
bb7cd1
     }
bb7cd1
 
bb7cd1
+    *_cr_domains = cr_domains;
bb7cd1
+
bb7cd1
+    ret = EOK;
bb7cd1
+
bb7cd1
 done:
bb7cd1
     talloc_free(tmp_ctx);
bb7cd1
-    return cr_domains;
bb7cd1
+    return ret;
bb7cd1
 }
bb7cd1
 
bb7cd1
-static struct cache_req_domain *
bb7cd1
+static errno_t
bb7cd1
 sss_resp_new_cr_domains_from_ipa_config(TALLOC_CTX *mem_ctx,
bb7cd1
                                         struct sss_domain_info *domains,
bb7cd1
                                         struct sysdb_ctx *sysdb,
bb7cd1
-                                        const char *domain)
bb7cd1
+                                        const char *domain,
bb7cd1
+                                        struct cache_req_domain **_cr_domains)
bb7cd1
 {
bb7cd1
     TALLOC_CTX *tmp_ctx;
bb7cd1
-    struct cache_req_domain *cr_domains = NULL;
bb7cd1
     const char *domain_resolution_order = NULL;
bb7cd1
     errno_t ret;
bb7cd1
 
bb7cd1
+    *_cr_domains = NULL;
bb7cd1
+
bb7cd1
     tmp_ctx = talloc_new(NULL);
bb7cd1
     if (tmp_ctx == NULL) {
bb7cd1
-        return NULL;
bb7cd1
+        return ENOMEM;
bb7cd1
     }
bb7cd1
 
bb7cd1
     ret = sysdb_domain_get_domain_resolution_order(tmp_ctx, sysdb, domain,
bb7cd1
@@ -1554,11 +1562,13 @@ sss_resp_new_cr_domains_from_ipa_config(TALLOC_CTX *mem_ctx,
bb7cd1
         goto done;
bb7cd1
     }
bb7cd1
 
bb7cd1
-    /* Using mem_ctx (which is rctx) directly here to avoid copying
bb7cd1
-     * this memory around. */
bb7cd1
-    cr_domains = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
-                                    mem_ctx, domains, domain_resolution_order);
bb7cd1
-    if (cr_domains == NULL) {
bb7cd1
+    if (ret == ENOENT) {
bb7cd1
+        goto done;
bb7cd1
+    }
bb7cd1
+
bb7cd1
+    ret = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
+                        mem_ctx, domains, domain_resolution_order, _cr_domains);
bb7cd1
+    if (ret != EOK) {
bb7cd1
         DEBUG(SSSDBG_DEFAULT,
bb7cd1
               "cache_req_domain_new_list_from_domain_resolution_order() "
bb7cd1
               "failed [%d]: [%s].\n",
bb7cd1
@@ -1566,9 +1576,11 @@ sss_resp_new_cr_domains_from_ipa_config(TALLOC_CTX *mem_ctx,
bb7cd1
         goto done;
bb7cd1
     }
bb7cd1
 
bb7cd1
+    ret = EOK;
bb7cd1
+
bb7cd1
 done:
bb7cd1
     talloc_free(tmp_ctx);
bb7cd1
-    return cr_domains;
bb7cd1
+    return ret;
bb7cd1
 }
bb7cd1
 
bb7cd1
 errno_t sss_resp_populate_cr_domains(struct resp_ctx *rctx)
bb7cd1
@@ -1578,16 +1590,16 @@ errno_t sss_resp_populate_cr_domains(struct resp_ctx *rctx)
bb7cd1
     errno_t ret;
bb7cd1
 
bb7cd1
     if (rctx->domain_resolution_order != NULL) {
bb7cd1
-        cr_domains = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
-                            rctx, rctx->domains, rctx->domain_resolution_order);
bb7cd1
-
bb7cd1
-        if (cr_domains == NULL) {
bb7cd1
+        ret = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
+                rctx, rctx->domains,
bb7cd1
+                rctx->domain_resolution_order, &cr_domains);
bb7cd1
+        if (ret == EOK) {
bb7cd1
+            goto done;
bb7cd1
+        } else {
bb7cd1
             DEBUG(SSSDBG_MINOR_FAILURE,
bb7cd1
                   "Failed to use domain_resolution_order set in the config file.\n"
bb7cd1
                   "Trying to fallback to use ipaDomainOrderResolution setup by "
bb7cd1
                   "IPA.\n");
bb7cd1
-        } else {
bb7cd1
-            goto done;
bb7cd1
         }
bb7cd1
     }
bb7cd1
 
bb7cd1
@@ -1598,9 +1610,9 @@ errno_t sss_resp_populate_cr_domains(struct resp_ctx *rctx)
bb7cd1
     }
bb7cd1
 
bb7cd1
     if (dom == NULL) {
bb7cd1
-        cr_domains = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
-                                                    rctx, rctx->domains, NULL);
bb7cd1
-        if (cr_domains == NULL) {
bb7cd1
+        ret = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
+                                        rctx, rctx->domains, NULL, &cr_domains);
bb7cd1
+        if (ret != EOK) {
bb7cd1
             DEBUG(SSSDBG_CRIT_FAILURE,
bb7cd1
                   "Failed to flatten the list of domains.\n");
bb7cd1
         }
bb7cd1
@@ -1608,44 +1620,48 @@ errno_t sss_resp_populate_cr_domains(struct resp_ctx *rctx)
bb7cd1
     }
bb7cd1
 
bb7cd1
     if (dom->has_views) {
bb7cd1
-        cr_domains = sss_resp_new_cr_domains_from_ipa_id_view(rctx,
bb7cd1
-                                                              rctx->domains,
bb7cd1
-                                                              dom->sysdb);
bb7cd1
-        if (cr_domains == NULL) {
bb7cd1
+        ret = sss_resp_new_cr_domains_from_ipa_id_view(rctx, rctx->domains,
bb7cd1
+                                                       dom->sysdb,
bb7cd1
+                                                       &cr_domains);
bb7cd1
+        if (ret == EOK) {
bb7cd1
+            goto done;
bb7cd1
+        }
bb7cd1
+
bb7cd1
+        if (ret != ENOENT) {
bb7cd1
             DEBUG(SSSDBG_MINOR_FAILURE,
bb7cd1
                   "Failed to use ipaDomainResolutionOrder set for the "
bb7cd1
                   "view \"%s\".\n"
bb7cd1
                   "Trying to fallback to use ipaDomainOrderResolution "
bb7cd1
                   "set in ipaConfig for the domain: %s.\n",
bb7cd1
                   dom->view_name, dom->name);
bb7cd1
-        } else {
bb7cd1
-            goto done;
bb7cd1
         }
bb7cd1
     }
bb7cd1
 
bb7cd1
-    cr_domains = sss_resp_new_cr_domains_from_ipa_config(rctx, rctx->domains,
bb7cd1
-                                                         dom->sysdb,
bb7cd1
-                                                         dom->name);
bb7cd1
-    if (cr_domains == NULL) {
bb7cd1
+    ret = sss_resp_new_cr_domains_from_ipa_config(rctx, rctx->domains,
bb7cd1
+                                                  dom->sysdb, dom->name,
bb7cd1
+                                                  &cr_domains);
bb7cd1
+    if (ret == EOK) {
bb7cd1
+        goto done;
bb7cd1
+    }
bb7cd1
+
bb7cd1
+    if (ret != ENOENT) {
bb7cd1
         DEBUG(SSSDBG_MINOR_FAILURE,
bb7cd1
               "Failed to use ipaDomainResolutionOrder set in ipaConfig "
bb7cd1
               "for the domain: \"%s\".\n"
bb7cd1
               "No ipaDomainResolutionOrder will be followed.\n",
bb7cd1
               dom->name);
bb7cd1
-    } else {
bb7cd1
-        goto done;
bb7cd1
     }
bb7cd1
 
bb7cd1
-    cr_domains = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
-                                                    rctx, rctx->domains, NULL);
bb7cd1
-    if (cr_domains == NULL) {
bb7cd1
+    ret = cache_req_domain_new_list_from_domain_resolution_order(
bb7cd1
+                                        rctx, rctx->domains, NULL, &cr_domains);
bb7cd1
+    if (ret != EOK) {
bb7cd1
         DEBUG(SSSDBG_CRIT_FAILURE, "Failed to flatten the list of domains.\n");
bb7cd1
         goto done;
bb7cd1
     }
bb7cd1
 
bb7cd1
-done:
bb7cd1
-    ret = cr_domains != NULL ? EOK : ENOMEM;
bb7cd1
+    ret = EOK;
bb7cd1
 
bb7cd1
+done:
bb7cd1
     cache_req_domain_list_zfree(&rctx->cr_domains);
bb7cd1
     rctx->cr_domains = cr_domains;
bb7cd1
 
bb7cd1
-- 
bb7cd1
2.9.3
bb7cd1