diff options
-rw-r--r-- | source/include/client.h | 2 | ||||
-rw-r--r-- | source/libsmb/clientgen.c | 2 | ||||
-rw-r--r-- | source/libsmb/passchange.c | 13 | ||||
-rw-r--r-- | source/rpc_client/cli_netlogon.c | 4 | ||||
-rw-r--r-- | source/rpc_client/cli_pipe.c | 32 | ||||
-rw-r--r-- | source/smbd/change_trust_pw.c | 3 |
6 files changed, 32 insertions, 24 deletions
diff --git a/source/include/client.h b/source/include/client.h index 3c0b65576ca..0e73745edbb 100644 --- a/source/include/client.h +++ b/source/include/client.h @@ -60,6 +60,8 @@ struct cli_pipe_auth_data { struct rpc_pipe_client { struct rpc_pipe_client *prev, *next; + TALLOC_CTX *mem_ctx; + struct cli_state *cli; int pipe_idx; diff --git a/source/libsmb/clientgen.c b/source/libsmb/clientgen.c index 860cb948ac1..64191239d33 100644 --- a/source/libsmb/clientgen.c +++ b/source/libsmb/clientgen.c @@ -650,7 +650,7 @@ bool cli_rpc_pipe_close(struct rpc_pipe_client *cli) cli->pipe_name, cli->cli->desthost )); DLIST_REMOVE(cli->cli->pipe_list, cli); - talloc_destroy(cli); + talloc_destroy(cli->mem_ctx); return ret; } diff --git a/source/libsmb/passchange.c b/source/libsmb/passchange.c index 2f9a87dee4a..468750f8012 100644 --- a/source/libsmb/passchange.c +++ b/source/libsmb/passchange.c @@ -177,9 +177,8 @@ NTSTATUS remote_password_change(const char *remote_machine, const char *user_nam } } - result = rpccli_samr_chgpasswd_user(pipe_hnd, talloc_tos(), - user_name, new_passwd, old_passwd); - if (NT_STATUS_IS_OK(result)) { + if (NT_STATUS_IS_OK(result = rpccli_samr_chgpasswd_user(pipe_hnd, pipe_hnd->mem_ctx, user_name, + new_passwd, old_passwd))) { /* Great - it all worked! */ cli_shutdown(cli); return NT_STATUS_OK; @@ -207,9 +206,11 @@ NTSTATUS remote_password_change(const char *remote_machine, const char *user_nam pipe_hnd = cli_rpc_pipe_open_noauth(cli, PI_SAMR, &result); if ( pipe_hnd && - (NT_STATUS_IS_OK(result = rpccli_samr_chgpasswd_user( - pipe_hnd, talloc_tos(), user_name, - new_passwd, old_passwd)))) { + (NT_STATUS_IS_OK(result = rpccli_samr_chgpasswd_user(pipe_hnd, + pipe_hnd->mem_ctx, + user_name, + new_passwd, + old_passwd)))) { /* Great - it all worked! */ cli_shutdown(cli); return NT_STATUS_OK; diff --git a/source/rpc_client/cli_netlogon.c b/source/rpc_client/cli_netlogon.c index 478a8558824..851a4a8da82 100644 --- a/source/rpc_client/cli_netlogon.c +++ b/source/rpc_client/cli_netlogon.c @@ -159,7 +159,7 @@ NTSTATUS rpccli_netlogon_setup_creds(struct rpc_pipe_client *cli, generate_random_buffer(clnt_chal_send.data, 8); /* Get the server challenge. */ - result = rpccli_netr_ServerReqChallenge(cli, talloc_tos(), + result = rpccli_netr_ServerReqChallenge(cli, cli->mem_ctx, dc->remote_machine, clnt_name, &clnt_chal_send, @@ -180,7 +180,7 @@ NTSTATUS rpccli_netlogon_setup_creds(struct rpc_pipe_client *cli, * Send client auth-2 challenge and receive server repy. */ - result = rpccli_netr_ServerAuthenticate2(cli, talloc_tos(), + result = rpccli_netr_ServerAuthenticate2(cli, cli->mem_ctx, dc->remote_machine, dc->mach_acct, sec_chan_type, diff --git a/source/rpc_client/cli_pipe.c b/source/rpc_client/cli_pipe.c index a94da8b79b9..bc49e24df1d 100644 --- a/source/rpc_client/cli_pipe.c +++ b/source/rpc_client/cli_pipe.c @@ -1979,7 +1979,7 @@ static NTSTATUS rpc_finish_spnego_ntlmssp_bind(struct rpc_pipe_client *cli, /* Initialize the returning data struct. */ prs_mem_free(rbuf); - prs_init_empty(rbuf, talloc_tos(), UNMARSHALL); + prs_init_empty(rbuf, cli->mem_ctx, UNMARSHALL); nt_status = rpc_api_pipe(cli, &rpc_out, rbuf, RPC_ALTCONTRESP); if (!NT_STATUS_IS_OK(nt_status)) { @@ -2052,7 +2052,7 @@ static NTSTATUS rpc_pipe_bind(struct rpc_pipe_client *cli, return NT_STATUS_INVALID_PARAMETER; } - prs_init_empty(&rpc_out, talloc_tos(), MARSHALL); + prs_init_empty(&rpc_out, cli->mem_ctx, MARSHALL); rpc_call_id = get_rpc_call_id(); @@ -2068,7 +2068,7 @@ static NTSTATUS rpc_pipe_bind(struct rpc_pipe_client *cli, } /* Initialize the incoming data struct. */ - prs_init_empty(&rbuf, talloc_tos(), UNMARSHALL); + prs_init_empty(&rbuf, cli->mem_ctx, UNMARSHALL); /* send data on \PIPE\. receive a response */ status = rpc_api_pipe(cli, &rpc_out, &rbuf, RPC_BINDACK); @@ -2188,6 +2188,7 @@ static NTSTATUS rpc_pipe_bind(struct rpc_pipe_client *cli, static struct rpc_pipe_client *cli_rpc_pipe_open(struct cli_state *cli, int pipe_idx, NTSTATUS *perr) { + TALLOC_CTX *mem_ctx; struct rpc_pipe_client *result; int fnum; @@ -2203,11 +2204,18 @@ static struct rpc_pipe_client *cli_rpc_pipe_open(struct cli_state *cli, int pipe /* The pipe name index must fall within our array */ SMB_ASSERT((pipe_idx >= 0) && (pipe_idx < PI_MAX_PIPES)); - result = TALLOC_ZERO_P(NULL, struct rpc_pipe_client); + mem_ctx = talloc_init("struct rpc_pipe_client"); + if (mem_ctx == NULL) { + return NULL; + } + + result = TALLOC_ZERO_P(mem_ctx, struct rpc_pipe_client); if (result == NULL) { return NULL; } + result->mem_ctx = mem_ctx; + result->pipe_name = cli_get_pipe_name(pipe_idx); fnum = cli_nt_create(cli, result->pipe_name, DESIRED_ACCESS_PIPE); @@ -2218,7 +2226,7 @@ static struct rpc_pipe_client *cli_rpc_pipe_open(struct cli_state *cli, int pipe result->pipe_name, cli->desthost, cli_errstr(cli))); *perr = cli_get_nt_error(cli); - talloc_destroy(result); + talloc_destroy(result->mem_ctx); return NULL; } @@ -2230,9 +2238,9 @@ static struct rpc_pipe_client *cli_rpc_pipe_open(struct cli_state *cli, int pipe if (pipe_idx == PI_NETLOGON) { /* Set up a netlogon credential chain for a netlogon pipe. */ - result->dc = TALLOC_ZERO_P(result, struct dcinfo); + result->dc = TALLOC_ZERO_P(mem_ctx, struct dcinfo); if (result->dc == NULL) { - talloc_destroy(result); + talloc_destroy(result->mem_ctx); return NULL; } } @@ -2517,8 +2525,7 @@ struct rpc_pipe_client *cli_rpc_pipe_open_schannel_with_key(struct cli_state *cl return NULL; } - result->auth.a_u.schannel_auth = TALLOC_ZERO_P( - result, struct schannel_auth_struct); + result->auth.a_u.schannel_auth = TALLOC_ZERO_P(result->mem_ctx, struct schannel_auth_struct); if (!result->auth.a_u.schannel_auth) { cli_rpc_pipe_close(result); *perr = NT_STATUS_NO_MEMORY; @@ -2686,8 +2693,8 @@ struct rpc_pipe_client *cli_rpc_pipe_open_krb5(struct cli_state *cli, /* Default service principal is "desthost$@realm" */ if (!service_princ) { - service_princ = talloc_asprintf(result, "%s$@%s", - cli->desthost, lp_realm() ); + service_princ = talloc_asprintf(result->mem_ctx, "%s$@%s", + cli->desthost, lp_realm() ); if (!service_princ) { cli_rpc_pipe_close(result); return NULL; @@ -2703,8 +2710,7 @@ struct rpc_pipe_client *cli_rpc_pipe_open_krb5(struct cli_state *cli, } } - result->auth.a_u.kerberos_auth = TALLOC_ZERO_P( - result, struct kerberos_auth_struct); + result->auth.a_u.kerberos_auth = TALLOC_ZERO_P(result->mem_ctx, struct kerberos_auth_struct); if (!result->auth.a_u.kerberos_auth) { cli_rpc_pipe_close(result); *perr = NT_STATUS_NO_MEMORY; diff --git a/source/smbd/change_trust_pw.c b/source/smbd/change_trust_pw.c index 227b2d68999..4773eeff864 100644 --- a/source/smbd/change_trust_pw.c +++ b/source/smbd/change_trust_pw.c @@ -82,8 +82,7 @@ NTSTATUS change_trust_account_password( const char *domain, const char *remote_m goto failed; } - nt_status = trust_pw_find_change_and_store_it( - netlogon_pipe, netlogon_pipe, domain); + nt_status = trust_pw_find_change_and_store_it(netlogon_pipe, netlogon_pipe->mem_ctx, domain); cli_shutdown(cli); cli = NULL; |