Blame SOURCES/0010-CACHE_REQ-Copy-the-cr_domain-list-for-each-request.patch

9f2ebf
From ec3334b5a09328de492804c391654073553ff7e7 Mon Sep 17 00:00:00 2001
60d7aa
From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= <fidencio@redhat.com>
60d7aa
Date: Fri, 20 Oct 2017 09:26:43 +0200
9f2ebf
Subject: [PATCH 10/21] CACHE_REQ: Copy the cr_domain list for each request
60d7aa
MIME-Version: 1.0
60d7aa
Content-Type: text/plain; charset=UTF-8
60d7aa
Content-Transfer-Encoding: 8bit
60d7aa
60d7aa
Let's copy the cr_domain list for each request as this list may be
60d7aa
free'd due to a refresh domains request.
60d7aa
60d7aa
Resolves: https://pagure.io/SSSD/sssd/issue/3551
60d7aa
60d7aa
Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
60d7aa
60d7aa
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
60d7aa
(cherry picked from commit 0f44eefe2ce75a0814c8688495477f6c57f3d39a)
60d7aa
---
60d7aa
 src/responder/common/cache_req/cache_req.c        | 14 +++++++--
60d7aa
 src/responder/common/cache_req/cache_req_domain.c | 38 +++++++++++++++++++++++
60d7aa
 src/responder/common/cache_req/cache_req_domain.h |  5 +++
60d7aa
 3 files changed, 55 insertions(+), 2 deletions(-)
60d7aa
60d7aa
diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c
9f2ebf
index abcb9cba351b06e833bacde26a504e5ee3445528..5fed7a2ab8beded2fee91f679a12f9a0ff6013ec 100644
60d7aa
--- a/src/responder/common/cache_req/cache_req.c
60d7aa
+++ b/src/responder/common/cache_req/cache_req.c
9f2ebf
@@ -699,6 +699,7 @@ struct cache_req_state {
60d7aa
     const char *domain_name;
60d7aa
 
60d7aa
     /* work data */
60d7aa
+    struct cache_req_domain *cr_domains;
60d7aa
     struct cache_req_result **results;
60d7aa
     size_t num_results;
60d7aa
     bool first_iteration;
9f2ebf
@@ -953,6 +954,7 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
60d7aa
     bool bypass_cache;
60d7aa
     bool bypass_dp;
60d7aa
     bool search;
60d7aa
+    errno_t ret;
60d7aa
 
60d7aa
     state = tevent_req_data(req, struct cache_req_state);
60d7aa
 
9f2ebf
@@ -964,12 +966,20 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
60d7aa
         return EOK;
60d7aa
     }
60d7aa
 
60d7aa
+    ret = cache_req_domain_copy_cr_domains(state,
60d7aa
+                                           state->cr->rctx->cr_domains,
60d7aa
+                                           &state->cr_domains);
60d7aa
+    if (ret != EOK) {
60d7aa
+        DEBUG(SSSDBG_CRIT_FAILURE, "cache_req_copy_cr_domains() failed\n");
60d7aa
+        return EINVAL;
60d7aa
+    }
60d7aa
+
60d7aa
     if (domain_name != NULL) {
60d7aa
         CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, state->cr,
60d7aa
                         "Performing a single domain search\n");
60d7aa
 
60d7aa
         cr_domain = cache_req_domain_get_domain_by_name(
60d7aa
-                                    state->cr->rctx->cr_domains, domain_name);
60d7aa
+                                    state->cr_domains, domain_name);
60d7aa
         if (cr_domain == NULL) {
60d7aa
             return ERR_DOMAIN_NOT_FOUND;
60d7aa
         }
9f2ebf
@@ -978,7 +988,7 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
60d7aa
         CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, state->cr,
60d7aa
                         "Performing a multi-domain search\n");
60d7aa
 
60d7aa
-        cr_domain = state->cr->rctx->cr_domains;
60d7aa
+        cr_domain = state->cr_domains;
60d7aa
         check_next = true;
60d7aa
     }
60d7aa
 
60d7aa
diff --git a/src/responder/common/cache_req/cache_req_domain.c b/src/responder/common/cache_req/cache_req_domain.c
9f2ebf
index 7b58f7c94a77881429f870bc5162fb2fe0aa57c6..15893ba548f6d0e3979010d6d5bbf27441d5fa97 100644
60d7aa
--- a/src/responder/common/cache_req/cache_req_domain.c
60d7aa
+++ b/src/responder/common/cache_req/cache_req_domain.c
60d7aa
@@ -47,6 +47,44 @@ cache_req_domain_get_domain_by_name(struct cache_req_domain *domains,
60d7aa
     return ret;
60d7aa
 }
60d7aa
 
60d7aa
+errno_t
60d7aa
+cache_req_domain_copy_cr_domains(TALLOC_CTX *mem_ctx,
60d7aa
+                                 struct cache_req_domain *src,
60d7aa
+                                 struct cache_req_domain **_dest)
60d7aa
+{
60d7aa
+    struct cache_req_domain *cr_domains = NULL;
60d7aa
+    struct cache_req_domain *cr_domain;
60d7aa
+    struct cache_req_domain *iter;
60d7aa
+    errno_t ret;
60d7aa
+
60d7aa
+    if (src == NULL) {
60d7aa
+        return EINVAL;
60d7aa
+    }
60d7aa
+
60d7aa
+    DLIST_FOR_EACH(iter, src) {
60d7aa
+        cr_domain = talloc_zero(mem_ctx, struct cache_req_domain);
60d7aa
+        if (cr_domain == NULL) {
60d7aa
+            ret = ENOMEM;
60d7aa
+            goto done;
60d7aa
+        }
60d7aa
+
60d7aa
+        cr_domain->domain = iter->domain;
60d7aa
+        cr_domain->fqnames = iter->fqnames;
60d7aa
+
60d7aa
+        DLIST_ADD_END(cr_domains, cr_domain, struct cache_req_domain *);
60d7aa
+    }
60d7aa
+
60d7aa
+    *_dest = cr_domains;
60d7aa
+    ret = EOK;
60d7aa
+
60d7aa
+done:
60d7aa
+    if (ret != EOK) {
60d7aa
+        cache_req_domain_list_zfree(&cr_domains);
60d7aa
+    }
60d7aa
+
60d7aa
+    return ret;
60d7aa
+}
60d7aa
+
60d7aa
 void cache_req_domain_list_zfree(struct cache_req_domain **cr_domains)
60d7aa
 {
60d7aa
     struct cache_req_domain *p, *q, *r;
60d7aa
diff --git a/src/responder/common/cache_req/cache_req_domain.h b/src/responder/common/cache_req/cache_req_domain.h
60d7aa
index 3780a5d8d88d76e100738d28d1dd0e697edf5eae..ebdc71dd635d5d8a5d06e30e96c5d4101b6d98bf 100644
60d7aa
--- a/src/responder/common/cache_req/cache_req_domain.h
60d7aa
+++ b/src/responder/common/cache_req/cache_req_domain.h
60d7aa
@@ -50,6 +50,11 @@ cache_req_domain_new_list_from_domain_resolution_order(
60d7aa
                                         const char *domain_resolution_order,
60d7aa
                                         struct cache_req_domain **_cr_domains);
60d7aa
 
60d7aa
+errno_t
60d7aa
+cache_req_domain_copy_cr_domains(TALLOC_CTX *mem_ctx,
60d7aa
+                                 struct cache_req_domain *src,
60d7aa
+                                 struct cache_req_domain **_dest);
60d7aa
+
60d7aa
 void cache_req_domain_list_zfree(struct cache_req_domain **cr_domains);
60d7aa
 
60d7aa
 
60d7aa
-- 
60d7aa
2.13.5
60d7aa