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.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.c')
-rw-r--r-- | src/responder/common/cache_req/cache_req.c | 14 |
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; } |