diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-05-18 04:18:19 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:16:53 -0500 |
commit | 13a3fdf933c3ebdc0fd5bc0f3460d201a7c6b229 (patch) | |
tree | 423698967d0b07a429103033c9035809ded6d834 | |
parent | b836187484760a8ec5fe60a5d3f427c748c0a4f9 (diff) | |
download | samba-13a3fdf933c3ebdc0fd5bc0f3460d201a7c6b229.tar.gz samba-13a3fdf933c3ebdc0fd5bc0f3460d201a7c6b229.tar.bz2 samba-13a3fdf933c3ebdc0fd5bc0f3460d201a7c6b229.zip |
r6876: - fixed a memory leak in the cldap server
- keep the samdb open between requests
(This used to be commit ee75a8353b0dab579abf0e675395d796f1c39746)
-rw-r--r-- | source4/cldap_server/cldap_server.c | 1 | ||||
-rw-r--r-- | source4/cldap_server/cldap_server.h | 2 | ||||
-rw-r--r-- | source4/cldap_server/netlogon.c | 22 |
3 files changed, 14 insertions, 11 deletions
diff --git a/source4/cldap_server/cldap_server.c b/source4/cldap_server/cldap_server.c index ad4779da01..91682620ea 100644 --- a/source4/cldap_server/cldap_server.c +++ b/source4/cldap_server/cldap_server.c @@ -130,6 +130,7 @@ static void cldapd_task_init(struct task_server *task) } cldapd->task = task; + cldapd->samctx = NULL; /* start listening on the configured network interfaces */ status = cldapd_startup_interfaces(cldapd); diff --git a/source4/cldap_server/cldap_server.h b/source4/cldap_server/cldap_server.h index e3d7c06ab3..003835456d 100644 --- a/source4/cldap_server/cldap_server.h +++ b/source4/cldap_server/cldap_server.h @@ -27,5 +27,5 @@ */ struct cldapd_server { struct task_server *task; - const char *dns_domain; + struct ldb_context *samctx; }; diff --git a/source4/cldap_server/netlogon.c b/source4/cldap_server/netlogon.c index 252ae884ea..191b2b10b4 100644 --- a/source4/cldap_server/netlogon.c +++ b/source4/cldap_server/netlogon.c @@ -30,7 +30,7 @@ /* fill in the cldap netlogon union for a given version */ -static NTSTATUS cldapd_netlogon_fill(struct cldap_socket *cldap, +static NTSTATUS cldapd_netlogon_fill(struct cldapd_server *cldapd, TALLOC_CTX *mem_ctx, const char *domain, const char *domain_guid, @@ -39,7 +39,6 @@ static NTSTATUS cldapd_netlogon_fill(struct cldap_socket *cldap, uint32_t version, union nbt_cldap_netlogon *netlogon) { - struct ldb_context *samctx; const char *attrs[] = {"realm", "dnsDomain", "objectGUID", "name", NULL}; struct ldb_message **res; int ret; @@ -55,10 +54,12 @@ static NTSTATUS cldapd_netlogon_fill(struct cldap_socket *cldap, const char *site_name2; const char *pdc_ip; - samctx = samdb_connect(mem_ctx); - if (samctx == NULL) { - DEBUG(2,("Unable to open sam in cldap netlogon reply\n")); - return NT_STATUS_INTERNAL_DB_CORRUPTION; + if (cldapd->samctx == NULL) { + cldapd->samctx = samdb_connect(mem_ctx); + if (cldapd->samctx == NULL) { + DEBUG(2,("Unable to open sam in cldap netlogon reply\n")); + return NT_STATUS_INTERNAL_DB_CORRUPTION; + } } /* the domain has an optional trailing . */ @@ -67,7 +68,7 @@ static NTSTATUS cldapd_netlogon_fill(struct cldap_socket *cldap, } /* try and find the domain */ - ret = gendb_search(samctx, samctx, NULL, &res, attrs, + ret = gendb_search(cldapd->samctx, mem_ctx, NULL, &res, attrs, "(&(objectClass=domainDNS)(|(dnsDomain=%s)(objectGUID=%s)))", domain?domain:"", domain_guid?domain_guid:""); @@ -177,6 +178,7 @@ void cldapd_netlogon_request(struct cldap_socket *cldap, const char *filter, const char *src_address, int src_port) { + struct cldapd_server *cldapd = talloc_get_type(cldap->incoming.private, struct cldapd_server); struct ldap_parse_tree *tree; int i; const char *domain = NULL; @@ -191,7 +193,7 @@ void cldapd_netlogon_request(struct cldap_socket *cldap, TALLOC_CTX *tmp_ctx = talloc_new(cldap); - DEBUG(0,("cldap filter='%s'\n", filter)); + DEBUG(5,("cldap filter='%s'\n", filter)); tree = ldap_parse_filter_string(tmp_ctx, filter); if (tree == NULL) goto failed; @@ -249,10 +251,10 @@ void cldapd_netlogon_request(struct cldap_socket *cldap, goto failed; } - DEBUG(0,("cldap netlogon query domain=%s host=%s user=%s version=%d guid=%s\n", + DEBUG(5,("cldap netlogon query domain=%s host=%s user=%s version=%d guid=%s\n", domain, host, user, version, domain_guid)); - status = cldapd_netlogon_fill(cldap, tmp_ctx, domain, domain_guid, + status = cldapd_netlogon_fill(cldapd, tmp_ctx, domain, domain_guid, user, src_address, version, &netlogon); if (!NT_STATUS_IS_OK(status)) { |