summaryrefslogtreecommitdiff
path: root/source4/libcli
diff options
context:
space:
mode:
Diffstat (limited to 'source4/libcli')
-rw-r--r--source4/libcli/cliconnect.c9
-rw-r--r--source4/libcli/composite/connect.c9
-rw-r--r--source4/libcli/raw/clisession.c11
-rw-r--r--source4/libcli/raw/clitransport.c13
-rw-r--r--source4/libcli/raw/clitree.c12
-rw-r--r--source4/libcli/util/clilsa.c2
6 files changed, 32 insertions, 24 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;
}