diff options
author | Fabiano Fidêncio <fidencio@redhat.com> | 2017-10-20 09:26:43 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2017-10-26 10:24:44 +0200 |
commit | 0f44eefe2ce75a0814c8688495477f6c57f3d39a (patch) | |
tree | 783eb4249faad3e87b1fe80f266c4f5183c9ebb8 /src/responder/common/cache_req/cache_req_domain.c | |
parent | 6c802b2009c1b6dd0c3306ba97056e64acc0ec9e (diff) | |
download | sssd-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.c | 38 |
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; |