diff options
author | Andrew Tridgell <tridge@samba.org> | 2006-09-16 16:59:37 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 14:18:52 -0500 |
commit | 655b710204e7a7d8e486da7ba675fcbeed116fea (patch) | |
tree | 30a4c72758cd1526ce79a1f1c289c4159dba3578 | |
parent | d01bbe68424da9fd0c67d2dc383f13a8ede8ac78 (diff) | |
download | samba-655b710204e7a7d8e486da7ba675fcbeed116fea.tar.gz samba-655b710204e7a7d8e486da7ba675fcbeed116fea.tar.bz2 samba-655b710204e7a7d8e486da7ba675fcbeed116fea.zip |
r18584: found one of the fd leaks. The registry backend was using a
talloc(NULL, xxx) to allocate the registry context. That had two
consequences
1) it was a massive memory leak, as all winreg operations leaked their
entire context (including an open ldb database) every time
2) event_context_find() never found the exsting event context, so we
used a new event context each time, which called epoll_create()
each time, which caused a fd to be allocated
(This used to be commit 1c0a3de39828b43149d8981fc7f10e7c8b59a392)
-rw-r--r-- | source4/gtk/tools/gregedit.c | 4 | ||||
-rw-r--r-- | source4/lib/registry/reg_samba.c | 7 | ||||
-rw-r--r-- | source4/lib/registry/tools/regdiff.c | 4 | ||||
-rw-r--r-- | source4/lib/registry/tools/regpatch.c | 2 | ||||
-rw-r--r-- | source4/lib/registry/tools/regshell.c | 2 | ||||
-rw-r--r-- | source4/lib/registry/tools/regtree.c | 2 | ||||
-rw-r--r-- | source4/rpc_server/winreg/rpc_winreg.c | 5 |
7 files changed, 16 insertions, 10 deletions
diff --git a/source4/gtk/tools/gregedit.c b/source4/gtk/tools/gregedit.c index e0717187d9..cf03eebec8 100644 --- a/source4/gtk/tools/gregedit.c +++ b/source4/gtk/tools/gregedit.c @@ -385,7 +385,7 @@ static void on_open_gconf_activate(GtkMenuItem *menuitem, gpointer user_data) static void on_open_local_activate(GtkMenuItem *menuitem, gpointer user_data) { - WERROR error = reg_open_local(®istry, NULL, NULL); + WERROR error = reg_open_local(NULL, ®istry, NULL, NULL); if(!W_ERROR_IS_OK(error)) { gtk_show_werror(mainwin, "Error while opening local registry", error); return; @@ -953,7 +953,7 @@ static GtkWidget* create_savefilewin (void) static int gregedit_load_defaults(void) { - WERROR error = reg_open_local(®istry, NULL, NULL); + WERROR error = reg_open_local(NULL, ®istry, NULL, NULL); if(!W_ERROR_IS_OK(error)) { gtk_show_werror(mainwin, "Error while loading local registry", error); return -1; diff --git a/source4/lib/registry/reg_samba.c b/source4/lib/registry/reg_samba.c index 4a88d96042..3553c4cb6d 100644 --- a/source4/lib/registry/reg_samba.c +++ b/source4/lib/registry/reg_samba.c @@ -68,9 +68,12 @@ static WERROR reg_samba_get_predef (struct registry_context *ctx, uint32_t hkey, return error; } -_PUBLIC_ WERROR reg_open_local (struct registry_context **ctx, struct auth_session_info *session_info, struct cli_credentials *credentials) +_PUBLIC_ WERROR reg_open_local (TALLOC_CTX *mem_ctx, + struct registry_context **ctx, + struct auth_session_info *session_info, + struct cli_credentials *credentials) { - *ctx = talloc(NULL, struct registry_context); + *ctx = talloc(mem_ctx, struct registry_context); (*ctx)->credentials = talloc_reference(*ctx, credentials); (*ctx)->session_info = talloc_reference(*ctx, session_info); (*ctx)->get_predefined_key = reg_samba_get_predef; diff --git a/source4/lib/registry/tools/regdiff.c b/source4/lib/registry/tools/regdiff.c index dbbe555ad6..b8bf654a6b 100644 --- a/source4/lib/registry/tools/regdiff.c +++ b/source4/lib/registry/tools/regdiff.c @@ -54,8 +54,8 @@ int main(int argc, char **argv) error = WERR_OK; switch(opt) { case 'L': - if (!h1 && !from_null) error = reg_open_local(&h1, NULL, cmdline_credentials); - else if (!h2) error = reg_open_local(&h2, NULL, cmdline_credentials); + if (!h1 && !from_null) error = reg_open_local(NULL, &h1, NULL, cmdline_credentials); + else if (!h2) error = reg_open_local(NULL, &h2, NULL, cmdline_credentials); break; case 'R': if (!h1 && !from_null) diff --git a/source4/lib/registry/tools/regpatch.c b/source4/lib/registry/tools/regpatch.c index 7ed246566c..42cdac860b 100644 --- a/source4/lib/registry/tools/regpatch.c +++ b/source4/lib/registry/tools/regpatch.c @@ -52,7 +52,7 @@ int main(int argc, char **argv) if (remote) { error = reg_open_remote (&h, NULL, cmdline_credentials, remote, NULL); } else { - error = reg_open_local (&h, NULL, cmdline_credentials); + error = reg_open_local (NULL, &h, NULL, cmdline_credentials); } if (W_ERROR_IS_OK(error)) { diff --git a/source4/lib/registry/tools/regshell.c b/source4/lib/registry/tools/regshell.c index 0bc1cfe324..8436a3f505 100644 --- a/source4/lib/registry/tools/regshell.c +++ b/source4/lib/registry/tools/regshell.c @@ -434,7 +434,7 @@ static char **reg_completion(const char *text, int start, int end) } else if (backend) { error = reg_open_hive(NULL, backend, poptGetArg(pc), NULL, cmdline_credentials, &curkey); } else { - error = reg_open_local(&h, NULL, cmdline_credentials); + error = reg_open_local(NULL, &h, NULL, cmdline_credentials); } if(!W_ERROR_IS_OK(error)) { diff --git a/source4/lib/registry/tools/regtree.c b/source4/lib/registry/tools/regtree.c index 31f5a89a1b..6b3c20eae3 100644 --- a/source4/lib/registry/tools/regtree.c +++ b/source4/lib/registry/tools/regtree.c @@ -122,7 +122,7 @@ int main(int argc, char **argv) return 1; } } else { - error = reg_open_local (&h, NULL, cmdline_credentials); + error = reg_open_local (NULL, &h, NULL, cmdline_credentials); if(!W_ERROR_IS_OK(error)) { fprintf(stderr, "Unable to open local registry:%s \n", win_errstr(error)); diff --git a/source4/rpc_server/winreg/rpc_winreg.c b/source4/rpc_server/winreg/rpc_winreg.c index adcbb749da..e32f620e5b 100644 --- a/source4/rpc_server/winreg/rpc_winreg.c +++ b/source4/rpc_server/winreg/rpc_winreg.c @@ -32,7 +32,10 @@ enum handle_types { HTYPE_REGVAL, HTYPE_REGKEY }; static NTSTATUS dcerpc_winreg_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface) { struct registry_context *ctx; - reg_open_local(&ctx, dce_call->conn->auth_state.session_info, NULL); + WERROR err; + + err = reg_open_local(dce_call->context, + &ctx, dce_call->conn->auth_state.session_info, NULL); dce_call->context->private = ctx; |