summaryrefslogtreecommitdiff
path: root/source4/librpc/rpc/dcerpc_schannel.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2004-10-30 11:37:17 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:05:04 -0500
commit173dda6bf4db2faf29a1845ce2b1028105511dab (patch)
tree9a0140c99f6c2e336f1cc821a7bb66457df219f2 /source4/librpc/rpc/dcerpc_schannel.c
parentfeff2e9cbdd2e3e8e9db5d9b01b5d5cec42943c0 (diff)
downloadsamba-173dda6bf4db2faf29a1845ce2b1028105511dab.tar.gz
samba-173dda6bf4db2faf29a1845ce2b1028105511dab.tar.bz2
samba-173dda6bf4db2faf29a1845ce2b1028105511dab.zip
r3391: fixed some memory leaks in the schannel code
(This used to be commit eb3366d3667ddddf7ab5eae5d1fbc5de86c41072)
Diffstat (limited to 'source4/librpc/rpc/dcerpc_schannel.c')
-rw-r--r--source4/librpc/rpc/dcerpc_schannel.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/source4/librpc/rpc/dcerpc_schannel.c b/source4/librpc/rpc/dcerpc_schannel.c
index 43f53d72b3..f53d77647a 100644
--- a/source4/librpc/rpc/dcerpc_schannel.c
+++ b/source4/librpc/rpc/dcerpc_schannel.c
@@ -28,7 +28,6 @@ enum schannel_position {
};
struct dcerpc_schannel_state {
- TALLOC_CTX *mem_ctx;
enum schannel_position state;
struct schannel_state *schannel_state;
struct creds_CredentialState creds;
@@ -173,7 +172,7 @@ static NTSTATUS dcerpc_schannel_update(struct gensec_security *gensec_security,
return status;
}
- dce_schan_state->account_name = talloc_strdup(dce_schan_state->mem_ctx, account_name);
+ dce_schan_state->account_name = talloc_strdup(dce_schan_state, account_name);
/* start up the schannel server code */
status = schannel_start(&dce_schan_state->schannel_state,
@@ -183,6 +182,7 @@ static NTSTATUS dcerpc_schannel_update(struct gensec_security *gensec_security,
account_name, nt_errstr(status)));
return status;
}
+ talloc_steal(dce_schan_state, dce_schan_state->schannel_state);
bind_schannel_ack.unknown1 = 1;
bind_schannel_ack.unknown2 = 0;
@@ -260,22 +260,13 @@ NTSTATUS dcerpc_schannel_creds(struct gensec_security *gensec_security,
static NTSTATUS dcerpc_schannel_start(struct gensec_security *gensec_security)
{
struct dcerpc_schannel_state *dce_schan_state;
- TALLOC_CTX *mem_ctx;
- mem_ctx = talloc_init("dcerpc_schannel_start");
- if (!mem_ctx) {
- return NT_STATUS_NO_MEMORY;
- }
- dce_schan_state = talloc_p(mem_ctx, struct dcerpc_schannel_state);
+ dce_schan_state = talloc_p(gensec_security, struct dcerpc_schannel_state);
if (!dce_schan_state) {
- talloc_destroy(mem_ctx);
return NT_STATUS_NO_MEMORY;
}
- dce_schan_state->mem_ctx = mem_ctx;
dce_schan_state->state = DCERPC_SCHANNEL_STATE_START;
-
-
gensec_security->private_data = dce_schan_state;
return NT_STATUS_OK;
@@ -315,6 +306,7 @@ static NTSTATUS dcerpc_schannel_client_start(struct gensec_security *gensec_secu
DEBUG(1, ("Failed to start schannel client\n"));
return status;
}
+ talloc_steal(dce_schan_state, dce_schan_state->schannel_state);
return NT_STATUS_OK;
}
@@ -328,7 +320,7 @@ static void dcerpc_schannel_end(struct gensec_security *gensec_security)
schannel_end(&dce_schan_state->schannel_state);
- talloc_destroy(dce_schan_state->mem_ctx);
+ talloc_free(dce_schan_state);
gensec_security->private_data = NULL;
}