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

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