diff options
author | Sumit Bose <sbose@redhat.com> | 2016-07-12 13:16:43 +0200 |
---|---|---|
committer | Lukas Slebodnik <lslebodn@redhat.com> | 2016-07-25 16:08:46 +0200 |
commit | 74bef2150c76c8814bf4c1654ecd3660604eb4e6 (patch) | |
tree | 3bbcd330e61eb3414ba4302739661ba7e0728bfb | |
parent | a2eba280a64dc40a0735ecc0b8e2548ad0b5aa1a (diff) | |
download | sssd-74bef2150c76c8814bf4c1654ecd3660604eb4e6.tar.gz sssd-74bef2150c76c8814bf4c1654ecd3660604eb4e6.tar.xz sssd-74bef2150c76c8814bf4c1654ecd3660604eb4e6.zip |
AD: avoid memory leak in netlogon_get_domain_info() and make it public
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
-rw-r--r-- | src/providers/ad/ad_common.h | 6 | ||||
-rw-r--r-- | src/providers/ad/ad_domain_info.c | 29 |
2 files changed, 26 insertions, 9 deletions
diff --git a/src/providers/ad/ad_common.h b/src/providers/ad/ad_common.h index ce363c5a4..f4a90e4f0 100644 --- a/src/providers/ad/ad_common.h +++ b/src/providers/ad/ad_common.h @@ -185,4 +185,10 @@ errno_t ad_autofs_init(TALLOC_CTX *mem_ctx, errno_t ad_machine_account_password_renewal_init(struct be_ctx *be_ctx, struct ad_options *ad_opts); +errno_t netlogon_get_domain_info(TALLOC_CTX *mem_ctx, + struct sysdb_attrs *reply, + char **_flat_name, + char **_site, + char **_forest); + #endif /* AD_COMMON_H_ */ diff --git a/src/providers/ad/ad_domain_info.c b/src/providers/ad/ad_domain_info.c index 5f17ae542..a06379c26 100644 --- a/src/providers/ad/ad_domain_info.c +++ b/src/providers/ad/ad_domain_info.c @@ -35,12 +35,11 @@ #include "providers/ad/ad_common.h" #include "util/util.h" -static errno_t -netlogon_get_domain_info(TALLOC_CTX *mem_ctx, - struct sysdb_attrs *reply, - char **_flat_name, - char **_site, - char **_forest) +errno_t netlogon_get_domain_info(TALLOC_CTX *mem_ctx, + struct sysdb_attrs *reply, + char **_flat_name, + char **_site, + char **_forest) { errno_t ret; struct ldb_message_element *el; @@ -51,6 +50,7 @@ netlogon_get_domain_info(TALLOC_CTX *mem_ctx, const char *flat_name; const char *site; const char *forest; + TALLOC_CTX *tmp_ctx; ret = sysdb_attrs_get_el(reply, AD_AT_NETLOGON, &el); if (ret != EOK) { @@ -66,13 +66,24 @@ netlogon_get_domain_info(TALLOC_CTX *mem_ctx, return EIO; } + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n"); + return ENOMEM; + } + blob.data = el->values[0].data; blob.length = el->values[0].length; - ndr_pull = ndr_pull_init_blob(&blob, mem_ctx); + /* The ndr_pull_* calls do not use ndr_pull as a talloc context to + * allocate memory but the second argument of ndr_pull_init_blob(). To + * make sure no memory is leaked here a temporary talloc context is + * needed. */ + ndr_pull = ndr_pull_init_blob(&blob, tmp_ctx); if (ndr_pull == NULL) { DEBUG(SSSDBG_OP_FAILURE, "ndr_pull_init_blob() failed.\n"); - return ENOMEM; + ret = ENOMEM; + goto done; } ndr_err = ndr_pull_netlogon_samlogon_response(ndr_pull, NDR_SCALARS, @@ -146,7 +157,7 @@ netlogon_get_domain_info(TALLOC_CTX *mem_ctx, ret = EOK; done: - talloc_free(ndr_pull); + talloc_free(tmp_ctx); return ret; } |