summaryrefslogtreecommitdiffstats
path: root/src/responder/common/cache_req/cache_req.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.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.c')
-rw-r--r--src/responder/common/cache_req/cache_req.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c
index abcb9cba3..5fed7a2ab 100644
--- a/src/responder/common/cache_req/cache_req.c
+++ b/src/responder/common/cache_req/cache_req.c
@@ -699,6 +699,7 @@ struct cache_req_state {
const char *domain_name;
/* work data */
+ struct cache_req_domain *cr_domains;
struct cache_req_result **results;
size_t num_results;
bool first_iteration;
@@ -953,6 +954,7 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
bool bypass_cache;
bool bypass_dp;
bool search;
+ errno_t ret;
state = tevent_req_data(req, struct cache_req_state);
@@ -964,12 +966,20 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
return EOK;
}
+ ret = cache_req_domain_copy_cr_domains(state,
+ state->cr->rctx->cr_domains,
+ &state->cr_domains);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "cache_req_copy_cr_domains() failed\n");
+ return EINVAL;
+ }
+
if (domain_name != NULL) {
CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, state->cr,
"Performing a single domain search\n");
cr_domain = cache_req_domain_get_domain_by_name(
- state->cr->rctx->cr_domains, domain_name);
+ state->cr_domains, domain_name);
if (cr_domain == NULL) {
return ERR_DOMAIN_NOT_FOUND;
}
@@ -978,7 +988,7 @@ static errno_t cache_req_select_domains(struct tevent_req *req,
CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, state->cr,
"Performing a multi-domain search\n");
- cr_domain = state->cr->rctx->cr_domains;
+ cr_domain = state->cr_domains;
check_next = true;
}