mirror of
https://github.com/samba-team/samba.git
synced 2025-02-23 09:57:40 +03:00
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 commit is contained in:
parent
83bf458ec9
commit
1c0a3de398
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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)) {
|
||||
|
@ -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)) {
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user