diff options
-rw-r--r-- | source4/libcli/cliconnect.c | 9 | ||||
-rw-r--r-- | source4/libcli/composite/connect.c | 9 | ||||
-rw-r--r-- | source4/libcli/raw/clisession.c | 11 | ||||
-rw-r--r-- | source4/libcli/raw/clitransport.c | 13 | ||||
-rw-r--r-- | source4/libcli/raw/clitree.c | 12 | ||||
-rw-r--r-- | source4/libcli/util/clilsa.c | 2 | ||||
-rw-r--r-- | source4/torture/basic/secleak.c | 2 | ||||
-rw-r--r-- | source4/torture/raw/context.c | 10 | ||||
-rw-r--r-- | source4/torture/rpc/xplogin.c | 17 |
9 files changed, 41 insertions, 44 deletions
diff --git a/source4/libcli/cliconnect.c b/source4/libcli/cliconnect.c index 4d9fb5ba1f..5aabb55f5d 100644 --- a/source4/libcli/cliconnect.c +++ b/source4/libcli/cliconnect.c @@ -40,8 +40,7 @@ BOOL smbcli_socket_connect(struct smbcli_state *cli, const char *server) return False; } - cli->transport = smbcli_transport_init(sock); - talloc_free(sock); + cli->transport = smbcli_transport_init(sock, cli, True); if (!cli->transport) { return False; } @@ -73,9 +72,8 @@ NTSTATUS smbcli_session_setup(struct smbcli_state *cli, NTSTATUS status; TALLOC_CTX *mem_ctx; - cli->session = smbcli_session_init(cli->transport); + cli->session = smbcli_session_init(cli->transport, cli, True); if (!cli->session) return NT_STATUS_UNSUCCESSFUL; - talloc_free(cli->transport); mem_ctx = talloc_init("smbcli_session_setup"); if (!mem_ctx) return NT_STATUS_NO_MEMORY; @@ -114,8 +112,7 @@ NTSTATUS smbcli_send_tconX(struct smbcli_state *cli, const char *sharename, TALLOC_CTX *mem_ctx; NTSTATUS status; - cli->tree = smbcli_tree_init(cli->session); - talloc_free(cli->session); + cli->tree = smbcli_tree_init(cli->session, cli, True); if (!cli->tree) return NT_STATUS_UNSUCCESSFUL; mem_ctx = talloc_init("tcon"); diff --git a/source4/libcli/composite/connect.c b/source4/libcli/composite/connect.c index 69b394310e..8dd7fe39ab 100644 --- a/source4/libcli/composite/connect.c +++ b/source4/libcli/composite/connect.c @@ -112,7 +112,7 @@ static NTSTATUS connect_session_setup(struct smbcli_composite *c, state->session->vuid = state->io_setup->out.vuid; /* setup for a tconx */ - io->out.tree = smbcli_tree_init(state->session); + io->out.tree = smbcli_tree_init(state->session, state, True); NT_STATUS_HAVE_NO_MEMORY(io->out.tree); state->io_tcon = talloc(c, union smb_tcon); @@ -157,12 +157,9 @@ static NTSTATUS connect_negprot(struct smbcli_composite *c, NT_STATUS_NOT_OK_RETURN(status); /* next step is a session setup */ - state->session = smbcli_session_init(state->transport); + state->session = smbcli_session_init(state->transport, state, True); NT_STATUS_HAVE_NO_MEMORY(state->session); - /* get rid of the extra reference to the transport */ - talloc_free(state->transport); - state->io_setup = talloc(c, struct smb_composite_sesssetup); NT_STATUS_HAVE_NO_MEMORY(state->io_setup); @@ -214,7 +211,7 @@ static NTSTATUS connect_socket(struct smbcli_composite *c, NT_STATUS_NOT_OK_RETURN(status); /* the socket is up - we can initialise the smbcli transport layer */ - state->transport = smbcli_transport_init(state->sock); + state->transport = smbcli_transport_init(state->sock, state, True); NT_STATUS_HAVE_NO_MEMORY(state->transport); calling.name = io->in.calling_name; diff --git a/source4/libcli/raw/clisession.c b/source4/libcli/raw/clisession.c index ed50601c25..30382e0837 100644 --- a/source4/libcli/raw/clisession.c +++ b/source4/libcli/raw/clisession.c @@ -33,18 +33,23 @@ /**************************************************************************** Initialize the session context ****************************************************************************/ -struct smbcli_session *smbcli_session_init(struct smbcli_transport *transport) +struct smbcli_session *smbcli_session_init(struct smbcli_transport *transport, + TALLOC_CTX *parent_ctx, BOOL primary) { struct smbcli_session *session; uint16_t flags2; uint32_t capabilities; - session = talloc_zero(transport, struct smbcli_session); + session = talloc_zero(parent_ctx, struct smbcli_session); if (!session) { return NULL; } - session->transport = talloc_reference(session, transport); + if (primary) { + session->transport = talloc_steal(session, transport); + } else { + session->transport = talloc_reference(session, transport); + } session->pid = (uint16_t)getpid(); session->vuid = UID_FIELD_INVALID; diff --git a/source4/libcli/raw/clitransport.c b/source4/libcli/raw/clitransport.c index e3a8281f3f..c993fd7e60 100644 --- a/source4/libcli/raw/clitransport.c +++ b/source4/libcli/raw/clitransport.c @@ -61,16 +61,19 @@ static int transport_destructor(void *ptr) /* create a transport structure based on an established socket */ -struct smbcli_transport *smbcli_transport_init(struct smbcli_socket *sock) +struct smbcli_transport *smbcli_transport_init(struct smbcli_socket *sock, + TALLOC_CTX *parent_ctx, BOOL primary) { struct smbcli_transport *transport; - transport = talloc_p(sock, struct smbcli_transport); + transport = talloc_zero(parent_ctx, struct smbcli_transport); if (!transport) return NULL; - ZERO_STRUCTP(transport); - - transport->socket = talloc_reference(transport, sock); + if (primary) { + transport->socket = talloc_steal(transport, sock); + } else { + transport->socket = talloc_reference(transport, sock); + } transport->negotiate.protocol = PROTOCOL_NT1; transport->options.use_spnego = lp_use_spnego(); transport->options.max_xmit = lp_max_xmit(); diff --git a/source4/libcli/raw/clitree.c b/source4/libcli/raw/clitree.c index 06963d5bc4..ce4dafca9f 100644 --- a/source4/libcli/raw/clitree.c +++ b/source4/libcli/raw/clitree.c @@ -33,16 +33,22 @@ /**************************************************************************** Initialize the tree context ****************************************************************************/ -struct smbcli_tree *smbcli_tree_init(struct smbcli_session *session) +struct smbcli_tree *smbcli_tree_init(struct smbcli_session *session, + TALLOC_CTX *parent_ctx, BOOL primary) { struct smbcli_tree *tree; - tree = talloc_zero(session, struct smbcli_tree); + tree = talloc_zero(parent_ctx, struct smbcli_tree); if (!tree) { return NULL; } - tree->session = talloc_reference(tree, session); + if (primary) { + tree->session = talloc_steal(tree, session); + } else { + tree->session = talloc_reference(tree, session); + } + return tree; } diff --git a/source4/libcli/util/clilsa.c b/source4/libcli/util/clilsa.c index eac6984254..40991a8855 100644 --- a/source4/libcli/util/clilsa.c +++ b/source4/libcli/util/clilsa.c @@ -58,7 +58,7 @@ static NTSTATUS smblsa_connect(struct smbcli_state *cli) return NT_STATUS_NO_MEMORY; } - lsa->ipc_tree = smbcli_tree_init(cli->session); + lsa->ipc_tree = smbcli_tree_init(cli->session, lsa, False); if (lsa->ipc_tree == NULL) { return NT_STATUS_NO_MEMORY; } diff --git a/source4/torture/basic/secleak.c b/source4/torture/basic/secleak.c index 4ff34e166f..31c23ff5f7 100644 --- a/source4/torture/basic/secleak.c +++ b/source4/torture/basic/secleak.c @@ -31,7 +31,7 @@ static BOOL try_failed_login(struct smbcli_state *cli) struct smb_composite_sesssetup setup; struct smbcli_session *session; - session = smbcli_session_init(cli->transport); + session = smbcli_session_init(cli->transport, cli, False); setup.in.sesskey = cli->transport->negotiate.sesskey; setup.in.capabilities = cli->transport->negotiate.capabilities; setup.in.password = "INVALID-PASSWORD"; diff --git a/source4/torture/raw/context.c b/source4/torture/raw/context.c index 4f1c6337eb..5b6a2dd2ad 100644 --- a/source4/torture/raw/context.c +++ b/source4/torture/raw/context.c @@ -81,7 +81,7 @@ static BOOL test_session(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) domain = lp_parm_string(-1, "torture", "userdomain"); printf("create a second security context on the same transport\n"); - session = smbcli_session_init(cli->transport); + session = smbcli_session_init(cli->transport, mem_ctx, False); setup.in.sesskey = cli->transport->negotiate.sesskey; setup.in.capabilities = cli->transport->negotiate.capabilities; /* ignored in secondary session setup, except by our libs, which care about the extended security bit */ @@ -95,7 +95,7 @@ static BOOL test_session(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) session->vuid = setup.out.vuid; printf("create a third security context on the same transport, with vuid set\n"); - session2 = smbcli_session_init(cli->transport); + session2 = smbcli_session_init(cli->transport, mem_ctx, False); session2->vuid = session->vuid; setup.in.sesskey = cli->transport->negotiate.sesskey; @@ -115,7 +115,7 @@ static BOOL test_session(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) if (cli->transport->negotiate.capabilities & CAP_EXTENDED_SECURITY) { printf("create a fourth security context on the same transport, without extended security\n"); - session3 = smbcli_session_init(cli->transport); + session3 = smbcli_session_init(cli->transport, mem_ctx, False); session3->vuid = session->vuid; setup.in.sesskey = cli->transport->negotiate.sesskey; @@ -131,7 +131,7 @@ static BOOL test_session(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) } printf("use the same tree as the existing connection\n"); - tree = smbcli_tree_init(session); + tree = smbcli_tree_init(session, mem_ctx, False); tree->tid = cli->tree->tid; printf("create a file using the new vuid\n"); @@ -217,7 +217,7 @@ static BOOL test_tree(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) share = lp_parm_string(-1, "torture", "share"); printf("create a second tree context on the same session\n"); - tree = smbcli_tree_init(cli->session); + tree = smbcli_tree_init(cli->session, mem_ctx, False); tcon.generic.level = RAW_TCON_TCONX; tcon.tconx.in.flags = 0; diff --git a/source4/torture/rpc/xplogin.c b/source4/torture/rpc/xplogin.c index 25bda40da9..3c4a881d96 100644 --- a/source4/torture/rpc/xplogin.c +++ b/source4/torture/rpc/xplogin.c @@ -28,13 +28,6 @@ #include "librpc/gen_ndr/ndr_srvsvc.h" #include "libcli/composite/composite.h" -static int destroy_transport(void *ptr) -{ - struct smbcli_transport *trans = ptr; - talloc_free(trans->socket); - return 0; -} - static NTSTATUS after_negprot(struct smbcli_transport **dst_transport, const char *dest_host, uint16_t port, const char *my_name) @@ -54,13 +47,10 @@ static NTSTATUS after_negprot(struct smbcli_transport **dst_transport, return NT_STATUS_UNSUCCESSFUL; } - transport = smbcli_transport_init(sock); - talloc_free(sock); + transport = smbcli_transport_init(sock, NULL, True); if (transport == NULL) return NT_STATUS_NO_MEMORY; - talloc_set_destructor(transport, destroy_transport); - { struct nbt_name calling; struct nbt_name called; @@ -115,7 +105,7 @@ static NTSTATUS anon_ipc(struct smbcli_transport *transport, TALLOC_CTX *mem_ctx; NTSTATUS status; - session = smbcli_session_init(transport); + session = smbcli_session_init(transport, NULL, True); if (session == NULL) return NT_STATUS_NO_MEMORY; @@ -144,8 +134,7 @@ static NTSTATUS anon_ipc(struct smbcli_transport *transport, talloc_set_destructor(session, destroy_session); - tree = smbcli_tree_init(session); - talloc_free(session); + tree = smbcli_tree_init(session, NULL, True); if (tree == NULL) { talloc_free(mem_ctx); return NT_STATUS_NO_MEMORY; |