summaryrefslogtreecommitdiffstats
path: root/src/responder/common/cache_req/cache_req_domain.c
diff options
context:
space:
mode:
authorFabiano Fidêncio <fidencio@redhat.com>2017-10-20 09:26:43 +0200
committerJakub Hrozek <jhrozek@redhat.com>2017-10-26 10:24:44 +0200
commit0f44eefe2ce75a0814c8688495477f6c57f3d39a (patch)
tree783eb4249faad3e87b1fe80f266c4f5183c9ebb8 /src/responder/common/cache_req/cache_req_domain.c
parent6c802b2009c1b6dd0c3306ba97056e64acc0ec9e (diff)
downloadsssd-0f44eefe2ce75a0814c8688495477f6c57f3d39a.tar.gz
sssd-0f44eefe2ce75a0814c8688495477f6c57f3d39a.tar.xz
sssd-0f44eefe2ce75a0814c8688495477f6c57f3d39a.zip
CACHE_REQ: Copy the cr_domain list for each request
Let's copy the cr_domain list for each request as this list may be free'd due to a refresh domains request. Resolves: https://pagure.io/SSSD/sssd/issue/3551 Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com> Reviewed-by: Pavel Březina <pbrezina@redhat.com>
Diffstat (limited to 'src/responder/common/cache_req/cache_req_domain.c')
-rw-r--r--src/responder/common/cache_req/cache_req_domain.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/responder/common/cache_req/cache_req_domain.c b/src/responder/common/cache_req/cache_req_domain.c
index 7b58f7c94..15893ba54 100644
--- a/src/responder/common/cache_req/cache_req_domain.c
+++ b/src/responder/common/cache_req/cache_req_domain.c
@@ -47,6 +47,44 @@ cache_req_domain_get_domain_by_name(struct cache_req_domain *domains,
return ret;
}
+errno_t
+cache_req_domain_copy_cr_domains(TALLOC_CTX *mem_ctx,
+ struct cache_req_domain *src,
+ struct cache_req_domain **_dest)
+{
+ struct cache_req_domain *cr_domains = NULL;
+ struct cache_req_domain *cr_domain;
+ struct cache_req_domain *iter;
+ errno_t ret;
+
+ if (src == NULL) {
+ return EINVAL;
+ }
+
+ DLIST_FOR_EACH(iter, src) {
+ cr_domain = talloc_zero(mem_ctx, struct cache_req_domain);
+ if (cr_domain == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ cr_domain->domain = iter->domain;
+ cr_domain->fqnames = iter->fqnames;
+
+ DLIST_ADD_END(cr_domains, cr_domain, struct cache_req_domain *);
+ }
+
+ *_dest = cr_domains;
+ ret = EOK;
+
+done:
+ if (ret != EOK) {
+ cache_req_domain_list_zfree(&cr_domains);
+ }
+
+ return ret;
+}
+
void cache_req_domain_list_zfree(struct cache_req_domain **cr_domains)
{
struct cache_req_domain *p, *q, *r;