diff options
author | Pavel Reichl <preichl@redhat.com> | 2015-11-27 07:53:00 -0500 |
---|---|---|
committer | Lukas Slebodnik <lslebodn@redhat.com> | 2016-02-16 11:46:32 +0100 |
commit | 5232e1e7e3267be04f9bdee614b5f81367050fbd (patch) | |
tree | b2902256fd54fd534ebf53cb90ad6c2c26ee34f0 | |
parent | af0834223167694bdec7964c451d174213fba1e1 (diff) | |
download | sssd-5232e1e7e3267be04f9bdee614b5f81367050fbd.tar.gz sssd-5232e1e7e3267be04f9bdee614b5f81367050fbd.tar.xz sssd-5232e1e7e3267be04f9bdee614b5f81367050fbd.zip |
NSS: Fix memory leak netgroup
Resolves:
https://fedorahosted.org/sssd/ticket/2865
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
(cherry picked from commit 4231a17e66e0809a9c3d42207b45f95429cbb46c)
(cherry picked from commit 4a6cae7d917a4c8e1a02cfaf5d27a021dd6545c1)
-rw-r--r-- | src/responder/nss/nsssrv_netgroup.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/src/responder/nss/nsssrv_netgroup.c b/src/responder/nss/nsssrv_netgroup.c index e824699b7..50b66bcb4 100644 --- a/src/responder/nss/nsssrv_netgroup.c +++ b/src/responder/nss/nsssrv_netgroup.c @@ -435,14 +435,18 @@ static errno_t create_negcache_netgr(struct setent_step_ctx *step_ctx) errno_t ret; struct getent_ctx *netgr; - netgr = talloc_zero(step_ctx->nctx, struct getent_ctx); - if (netgr == NULL) { - DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero failed.\n"); - ret = ENOMEM; - goto done; - } else { - netgr->ready = true; - netgr->found = false; + /* Is there already netgroup with such name? */ + ret = get_netgroup_entry(step_ctx->nctx, step_ctx->name, + &netgr); + if (ret != EOK || netgr == NULL) { + + netgr = talloc_zero(step_ctx->nctx, struct getent_ctx); + if (netgr == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero failed.\n"); + ret = ENOMEM; + goto done; + } + netgr->entries = NULL; netgr->lookup_table = step_ctx->nctx->netgroups; netgr->name = talloc_strdup(netgr, step_ctx->name); @@ -457,13 +461,20 @@ static errno_t create_negcache_netgr(struct setent_step_ctx *step_ctx) DEBUG(SSSDBG_CRIT_FAILURE, "set_netgroup_entry failed.\n"); goto done; } - set_netgr_lifetime(step_ctx->nctx->neg_timeout, step_ctx, netgr); } + netgr->ready = true; + netgr->found = false; + + set_netgr_lifetime(step_ctx->nctx->neg_timeout, step_ctx, netgr); + + ret = EOK; + done: if (ret != EOK) { talloc_free(netgr); } + return ret; } @@ -475,6 +486,12 @@ static errno_t lookup_netgr_step(struct setent_step_ctx *step_ctx) struct sysdb_ctx *sysdb; char *name = NULL; uint32_t lifetime; + TALLOC_CTX *tmp_ctx; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; + } /* Check each domain for this netgroup name */ while (dom) { @@ -495,8 +512,7 @@ static errno_t lookup_netgr_step(struct setent_step_ctx *step_ctx) /* make sure to update the dctx if we changed domain */ step_ctx->dctx->domain = dom; - talloc_free(name); - name = sss_get_cased_name(step_ctx, step_ctx->name, + name = sss_get_cased_name(tmp_ctx, step_ctx->name, dom->case_sensitive); if (!name) { DEBUG(SSSDBG_CRIT_FAILURE, "sss_get_cased_name failed\n"); @@ -628,10 +644,11 @@ static errno_t lookup_netgr_step(struct setent_step_ctx *step_ctx) "create_negcache_netgr failed with: %d:[%s], ignored.\n", ret, sss_strerror(ret)); } + ret = ENOENT; done: - talloc_free(name); + talloc_free(tmp_ctx); return ret; } |