[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Mon Apr 29 09:49:02 UTC 2024


The branch, master has been updated
       via  96b5cfe4e6c s3:libsmb: Pass a memory context to get_ipc_connect()
       via  56426eda9bd s3:libsmb: Make get_ipc_connect() static
       via  bf688e0d2af s3:libnet: Fix memory leak in libnet_join_connect_dc_ipc()
       via  d2297b41a20 s3:libsmb: Pass memory context to cli_full_connection_creds()
       via  5c63d5bdab1 s3:libsmb: Pass memory context to cli_full_connection_creds_recv()
       via  8888f95947b s3:libsmb: Pass a memory context to cli_start_connection()
       via  f3fda1e440c s3:libsmb: Pass a memory context to cli_start_connection_recv()
       via  bbb21797bf6 s3:libsmb: Pass memory context to cli_connect_nb()
       via  4f62937dfab s3:torture: Remove trailing spaces in torture.c
       via  c8eabee18bd s3:nmbd: Remove trailing spaces in nmbd_synclists.c
       via  2154bd37e41 s3:libsmb: Pass a memory context to cli_connect_nb_recv()
      from  73e3ffb8418 python:tests: Store keys as bytes rather than as lists of ints

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 96b5cfe4e6c4b727c286b0856446c1d5a31b920b
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Nov 23 15:53:29 2023 +0100

    s3:libsmb: Pass a memory context to get_ipc_connect()
    
    Indirect leak of 792 byte(s) in 1 object(s) allocated from:                                                                                                                              #0 0x7f261b8dc03f in malloc (/lib64/libasan.so.8+0xdc03f) (BuildId: 3e1694ad218c99a8b1b69231666a27df63cf19d0)
        #1 0x7f261b2c2bc2 in __talloc_with_prefix ../../lib/talloc/talloc.c:783                                                                                                              #2 0x7f261b2c473d in __talloc ../../lib/talloc/talloc.c:825
        #3 0x7f261b2c473d in _talloc_named_const ../../lib/talloc/talloc.c:982
        #4 0x7f261b2c473d in _talloc_zero ../../lib/talloc/talloc.c:2421                                                                                                                     #5 0x7f2618cb42bc in smbXcli_conn_create ../../libcli/smb/smbXcli_base.c:350
        #6 0x7f261a74acd3 in cli_state_create ../../source3/libsmb/clientgen.c:196                                                                                                           #7 0x7f261a751f0d in cli_connect_nb_done ../../source3/libsmb/cliconnect.c:2715
        #8 0x7f261a69bacf in _tevent_req_notify_callback ../../lib/tevent/tevent_req.c:177                                                                                                   #9 0x7f261a69bd06 in tevent_req_finish ../../lib/tevent/tevent_req.c:234
        #10 0x7f261a69bd6e in _tevent_req_done ../../lib/tevent/tevent_req.c:240                                                                                                             #11 0x7f261a752dde in cli_connect_sock_done ../../source3/libsmb/cliconnect.c:2624
        #12 0x7f261a69bacf in _tevent_req_notify_callback ../../lib/tevent/tevent_req.c:177
        #13 0x7f261a69bd06 in tevent_req_finish ../../lib/tevent/tevent_req.c:234
        #14 0x7f261a69bd6e in _tevent_req_done ../../lib/tevent/tevent_req.c:240
        #15 0x7f261a7ba2c4 in smbsock_any_connect_connected ../../source3/libsmb/smbsock_connect.c:788
        #16 0x7f261a69bacf in _tevent_req_notify_callback ../../lib/tevent/tevent_req.c:177
        #17 0x7f261a69bd06 in tevent_req_finish ../../lib/tevent/tevent_req.c:234
        #18 0x7f261a69bd6e in _tevent_req_done ../../lib/tevent/tevent_req.c:240
        #19 0x7f261a7b75ad in smbsock_connect_connected ../../source3/libsmb/smbsock_connect.c:524
        #20 0x7f261a69bacf in _tevent_req_notify_callback ../../lib/tevent/tevent_req.c:177
        #21 0x7f261a69bd06 in tevent_req_finish ../../lib/tevent/tevent_req.c:234
        #22 0x7f261a69bd6e in _tevent_req_done ../../lib/tevent/tevent_req.c:240
        #23 0x7f261b4b400a in open_socket_out_connected ../../source3/lib/util_sock.c:484
        #24 0x7f261a69bacf in _tevent_req_notify_callback ../../lib/tevent/tevent_req.c:177
        #25 0x7f261a69bd06 in tevent_req_finish ../../lib/tevent/tevent_req.c:234
        #26 0x7f261a69be3e in tevent_req_trigger ../../lib/tevent/tevent_req.c:291
        #27 0x7f261a699df4 in tevent_common_invoke_immediate_handler ../../lib/tevent/tevent_immediate.c:190
        #28 0x7f261a699e31 in tevent_common_loop_immediate ../../lib/tevent/tevent_immediate.c:236
        #29 0x7f261a6ad3ec in epoll_event_loop_once ../../lib/tevent/tevent_epoll.c:905
        #30 0x7f261a6a679e in std_event_loop_once ../../lib/tevent/tevent_standard.c:110
        #31 0x7f261a696538 in _tevent_loop_once ../../lib/tevent/tevent.c:820
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Mon Apr 29 09:48:47 UTC 2024 on atb-devel-224

commit 56426eda9bdb0c530e3ae6c69a9ce261af5469a7
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Nov 23 15:52:05 2023 +0100

    s3:libsmb: Make get_ipc_connect() static
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit bf688e0d2afb8e2d28ac06a306296fd071dd6128
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Nov 23 15:21:49 2023 +0100

    s3:libnet: Fix memory leak in libnet_join_connect_dc_ipc()
    
    Direct leak of 885 byte(s) in 1 object(s) allocated from:
        #0 0x7f261b8dc03f in malloc (/lib64/libasan.so.8+0xdc03f) (BuildId: 3e1694ad218c99a8b1b69231666a27df63cf19d0)
        #1 0x7f261b2c2bc2 in __talloc_with_prefix ../../lib/talloc/talloc.c:783
        #2 0x7f261b2c543c in _talloc_pool ../../lib/talloc/talloc.c:838
        #3 0x7f261b2c543c in _talloc_pooled_object ../../lib/talloc/talloc.c:906
        #4 0x7f261a69cac9 in __tevent_req_create ../../lib/tevent/tevent_req.c:98
        #5 0x7f261a75bf55 in cli_full_connection_creds_send ../../source3/libsmb/cliconnect.c:3455
        #6 0x7f261a75c4b7 in cli_full_connection_creds ../../source3/libsmb/cliconnect.c:3818
        #7 0x7f261b70d39f in libnet_join_connect_dc_ipc ../../source3/libnet/libnet_join.c:1146
        #8 0x7f261b715794 in libnet_join_lookup_dc_rpc ../../source3/libnet/libnet_join.c:1188
        #9 0x7f261b715794 in libnet_DomainJoin ../../source3/libnet/libnet_join.c:2812
        #10 0x7f261b715794 in libnet_Join ../../source3/libnet/libnet_join.c:3040
        #11 0x555bd93671ea in net_ads_join ../../source3/utils/net_ads.c:1855
        #12 0x555bd9415ca9 in net_join ../../source3/utils/net_join.c:45
        #13 0x555bd940b972 in net_run_function ../../source3/utils/net_util.c:464
        #14 0x555bd9363129 in main ../../source3/utils/net.c:1372
        #15 0x7f2616a281af in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit d2297b41a20056ed44ed27fee10fab640a6fe7a3
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Nov 23 15:07:53 2023 +0100

    s3:libsmb: Pass memory context to cli_full_connection_creds()
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 5c63d5bdab156d1b14e07b56d02032f485530ff0
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Nov 23 14:57:42 2023 +0100

    s3:libsmb: Pass memory context to cli_full_connection_creds_recv()
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 8888f95947b67371696acfa9f76a61b55302d312
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Nov 23 14:51:48 2023 +0100

    s3:libsmb: Pass a memory context to cli_start_connection()
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit f3fda1e440cda83e091d0039a114ad7c15364787
Author: Andreas Schneider <asn at samba.org>
Date:   Tue Oct 31 15:05:35 2023 +0100

    s3:libsmb: Pass a memory context to cli_start_connection_recv()
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit bbb21797bf6b48857af85579240e30cbc00e3f7f
Author: Andreas Schneider <asn at samba.org>
Date:   Tue Oct 31 15:13:04 2023 +0100

    s3:libsmb: Pass memory context to cli_connect_nb()
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 4f62937dfaba644755ff9f349145d1a5704e5f88
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Apr 25 11:55:17 2024 +0200

    s3:torture: Remove trailing spaces in torture.c
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit c8eabee18bd0c634f8b8b5ba878c395daea609b0
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Apr 25 11:49:31 2024 +0200

    s3:nmbd: Remove trailing spaces in nmbd_synclists.c
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 2154bd37e41153676f29001b556698b09e4edff1
Author: Andreas Schneider <asn at samba.org>
Date:   Tue Oct 31 14:58:49 2023 +0100

    s3:libsmb: Pass a memory context to cli_connect_nb_recv()
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 examples/fuse/smb2mount.c                   |  15 ++--
 examples/winexe/winexe.c                    |   2 +
 source3/client/client.c                     |   3 +-
 source3/client/smbspool.c                   |  10 ++-
 source3/libnet/libnet_join.c                |  19 +++--
 source3/libsmb/cliconnect.c                 |  67 ++++++++++------
 source3/libsmb/clidfs.c                     |  18 ++++-
 source3/libsmb/libsmb_server.c              |  39 ++++++---
 source3/libsmb/passchange.c                 |  11 ++-
 source3/libsmb/proto.h                      |  22 +++--
 source3/libsmb/pylibsmb.c                   |   2 +-
 source3/nmbd/nmbd_synclists.c               |  30 ++++---
 source3/rpc_server/spoolss/srv_spoolss_nt.c |  14 +++-
 source3/rpcclient/cmd_spoolss.c             |  15 ++--
 source3/rpcclient/rpcclient.c               |  21 ++---
 source3/torture/locktest2.c                 |   3 +-
 source3/torture/torture.c                   | 119 ++++++++++++++++------------
 source3/utils/mdsearch.c                    |   3 +-
 source3/utils/net_ads.c                     |  15 ++--
 source3/utils/net_rpc.c                     |  12 ++-
 source3/utils/net_time.c                    |  11 ++-
 source3/utils/net_util.c                    |  30 ++++---
 source3/utils/netlookup.c                   |  15 ++--
 source3/utils/smbcacls.c                    |  15 ++--
 source3/utils/smbcquotas.c                  |  15 ++--
 source3/utils/wspsearch.c                   |  19 ++---
 26 files changed, 352 insertions(+), 193 deletions(-)


Changeset truncated at 500 lines:

diff --git a/examples/fuse/smb2mount.c b/examples/fuse/smb2mount.c
index 0594ced1308..69c14af9df1 100644
--- a/examples/fuse/smb2mount.c
+++ b/examples/fuse/smb2mount.c
@@ -34,11 +34,16 @@ static struct cli_state *connect_one(struct cli_credentials *creds,
 	NTSTATUS nt_status;
 	uint32_t flags = 0;
 
-	nt_status = cli_full_connection_creds(&c, lp_netbios_name(), server,
-				NULL, port,
-				share, "?????",
-				creds,
-				flags);
+	nt_status = cli_full_connection_creds(talloc_tos(),
+					      &c,
+					      lp_netbios_name(),
+					      server,
+					      NULL,
+					      port,
+					      share,
+					      "?????",
+					      creds,
+					      flags);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		DBG_ERR("cli_full_connection failed! (%s)\n",
 			nt_errstr(nt_status));
diff --git a/examples/winexe/winexe.c b/examples/winexe/winexe.c
index 5c2529cb2de..774d07a14d0 100644
--- a/examples/winexe/winexe.c
+++ b/examples/winexe/winexe.c
@@ -295,6 +295,7 @@ static NTSTATUS winexe_svc_upload(
 	const DATA_BLOB *binary = NULL;
 
 	status = cli_full_connection_creds(
+		talloc_tos(),
 		&cli,
 		NULL,
 		hostname,
@@ -1857,6 +1858,7 @@ int main(int argc, char *argv[])
 	}
 
 	status = cli_full_connection_creds(
+		talloc_tos(),
 		&cli,
 		lp_netbios_name(),
 		options.hostname,
diff --git a/source3/client/client.c b/source3/client/client.c
index 267e3ebeb99..65012f51260 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -6407,7 +6407,8 @@ static int do_message_op(struct cli_credentials *creds)
 		return 1;
 	}
 
-	status = cli_connect_nb(desthost, have_ip ? &dest_ss : NULL,
+	status = cli_connect_nb(talloc_tos(),
+				desthost, have_ip ? &dest_ss : NULL,
 				port ? port : NBT_SMB_PORT, name_type,
 				lp_netbios_name(),
 				SMB_SIGNING_OFF,
diff --git a/source3/client/smbspool.c b/source3/client/smbspool.c
index b3da87556d2..363f14a085f 100644
--- a/source3/client/smbspool.c
+++ b/source3/client/smbspool.c
@@ -544,8 +544,14 @@ smb_complete_connection(struct cli_state **output_cli,
 	struct cli_credentials *creds = NULL;
 
 	/* Start the SMB connection */
-	nt_status = cli_start_connection(&cli, myname, server, NULL, port,
-					 SMB_SIGNING_DEFAULT, 0);
+	nt_status = cli_start_connection(talloc_tos(),
+					 &cli,
+					 myname,
+					 server,
+					 NULL,
+					 port,
+					 SMB_SIGNING_DEFAULT,
+					 0);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		fprintf(stderr, "ERROR: Connection failed: %s\n", nt_errstr(nt_status));
 		return nt_status;
diff --git a/source3/libnet/libnet_join.c b/source3/libnet/libnet_join.c
index d3194bd181b..89e5239fd9e 100644
--- a/source3/libnet/libnet_join.c
+++ b/source3/libnet/libnet_join.c
@@ -1110,7 +1110,8 @@ static bool libnet_join_joindomain_store_secrets(TALLOC_CTX *mem_ctx,
  Connect dc's IPC$ share
 ****************************************************************/
 
-static NTSTATUS libnet_join_connect_dc_ipc(const char *dc,
+static NTSTATUS libnet_join_connect_dc_ipc(TALLOC_CTX *mem_ctx,
+					   const char *dc,
 					   const char *user,
 					   const char *domain,
 					   const char *pass,
@@ -1143,7 +1144,8 @@ static NTSTATUS libnet_join_connect_dc_ipc(const char *dc,
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	status = cli_full_connection_creds(cli,
+	status = cli_full_connection_creds(mem_ctx,
+					   cli,
 					   NULL,
 					   dc,
 					   NULL, 0,
@@ -1184,7 +1186,8 @@ static NTSTATUS libnet_join_lookup_dc_rpc(TALLOC_CTX *mem_ctx,
 		use_kerberos = false;
 	}
 
-	status = libnet_join_connect_dc_ipc(r->in.dc_name,
+	status = libnet_join_connect_dc_ipc(mem_ctx,
+					    r->in.dc_name,
 					    account,
 					    domain,
 					    password,
@@ -1773,7 +1776,9 @@ NTSTATUS libnet_join_ok(struct messaging_context *msg_ctx,
 						   CRED_SPECIFIED);
 	}
 
-	status = cli_full_connection_creds(&cli, NULL,
+	status = cli_full_connection_creds(frame,
+					   &cli,
+					   NULL,
 					   dc_name,
 					   NULL, 0,
 					   "IPC$", "IPC",
@@ -1789,7 +1794,8 @@ NTSTATUS libnet_join_ok(struct messaging_context *msg_ctx,
 			return NT_STATUS_NO_MEMORY;
 		}
 
-		status = cli_full_connection_creds(&cli,
+		status = cli_full_connection_creds(frame,
+						   &cli,
 						   NULL,
 						   dc_name,
 						   NULL, 0,
@@ -1930,7 +1936,8 @@ static NTSTATUS libnet_join_unjoindomain_rpc(TALLOC_CTX *mem_ctx,
 	ZERO_STRUCT(domain_pol);
 	ZERO_STRUCT(user_pol);
 
-	status = libnet_join_connect_dc_ipc(r->in.dc_name,
+	status = libnet_join_connect_dc_ipc(mem_ctx,
+					    r->in.dc_name,
 					    r->in.admin_account,
 					    r->in.admin_domain,
 					    r->in.admin_password,
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index b8f06330260..724cdfb99ea 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -2737,6 +2737,7 @@ static void cli_connect_nb_done(struct tevent_req *subreq)
 }
 
 static NTSTATUS cli_connect_nb_recv(struct tevent_req *req,
+				    TALLOC_CTX *mem_ctx,
 				    struct cli_state **pcli)
 {
 	struct cli_connect_nb_state *state = tevent_req_data(
@@ -2746,19 +2747,25 @@ static NTSTATUS cli_connect_nb_recv(struct tevent_req *req,
 	if (tevent_req_is_nterror(req, &status)) {
 		return status;
 	}
-	*pcli = talloc_move(NULL, &state->cli);
+	*pcli = talloc_move(mem_ctx, &state->cli);
 	return NT_STATUS_OK;
 }
 
-NTSTATUS cli_connect_nb(const char *host, const struct sockaddr_storage *dest_ss,
-			uint16_t port, int name_type, const char *myname,
-			enum smb_signing_setting signing_state, int flags, struct cli_state **pcli)
+NTSTATUS cli_connect_nb(TALLOC_CTX *mem_ctx,
+			const char *host,
+			const struct sockaddr_storage *dest_ss,
+			uint16_t port,
+			int name_type,
+			const char *myname,
+			enum smb_signing_setting signing_state,
+			int flags,
+			struct cli_state **pcli)
 {
 	struct tevent_context *ev;
 	struct tevent_req *req;
 	NTSTATUS status = NT_STATUS_NO_MEMORY;
 
-	ev = samba_tevent_context_init(talloc_tos());
+	ev = samba_tevent_context_init(mem_ctx);
 	if (ev == NULL) {
 		goto fail;
 	}
@@ -2773,7 +2780,7 @@ NTSTATUS cli_connect_nb(const char *host, const struct sockaddr_storage *dest_ss
 	if (!tevent_req_poll_ntstatus(req, ev, &status)) {
 		goto fail;
 	}
-	status = cli_connect_nb_recv(req, pcli);
+	status = cli_connect_nb_recv(req, mem_ctx, pcli);
 fail:
 	TALLOC_FREE(ev);
 	return status;
@@ -2894,7 +2901,7 @@ static void cli_start_connection_connected(struct tevent_req *subreq)
 		req, struct cli_start_connection_state);
 	NTSTATUS status;
 
-	status = cli_connect_nb_recv(subreq, &state->cli);
+	status = cli_connect_nb_recv(subreq, state, &state->cli);
 	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
@@ -2939,6 +2946,7 @@ static void cli_start_connection_done(struct tevent_req *subreq)
 }
 
 static NTSTATUS cli_start_connection_recv(struct tevent_req *req,
+					  TALLOC_CTX *mem_ctx,
 					  struct cli_state **output_cli)
 {
 	struct cli_start_connection_state *state = tevent_req_data(
@@ -2948,12 +2956,13 @@ static NTSTATUS cli_start_connection_recv(struct tevent_req *req,
 	if (tevent_req_is_nterror(req, &status)) {
 		return status;
 	}
-	*output_cli = state->cli;
+	*output_cli = talloc_move(mem_ctx, &state->cli);
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS cli_start_connection(struct cli_state **output_cli,
+NTSTATUS cli_start_connection(TALLOC_CTX *mem_ctx,
+			      struct cli_state **output_cli,
 			      const char *my_name,
 			      const char *dest_host,
 			      const struct sockaddr_storage *dest_ss, int port,
@@ -2963,7 +2972,7 @@ NTSTATUS cli_start_connection(struct cli_state **output_cli,
 	struct tevent_req *req;
 	NTSTATUS status = NT_STATUS_NO_MEMORY;
 
-	ev = samba_tevent_context_init(talloc_tos());
+	ev = samba_tevent_context_init(mem_ctx);
 	if (ev == NULL) {
 		goto fail;
 	}
@@ -2975,7 +2984,7 @@ NTSTATUS cli_start_connection(struct cli_state **output_cli,
 	if (!tevent_req_poll_ntstatus(req, ev, &status)) {
 		goto fail;
 	}
-	status = cli_start_connection_recv(req, output_cli);
+	status = cli_start_connection_recv(req, mem_ctx, output_cli);
 fail:
 	TALLOC_FREE(ev);
 	return status;
@@ -3501,7 +3510,7 @@ static void cli_full_connection_creds_conn_done(struct tevent_req *subreq)
 		req, struct cli_full_connection_creds_state);
 	NTSTATUS status;
 
-	status = cli_start_connection_recv(subreq, &state->cli);
+	status = cli_start_connection_recv(subreq, state, &state->cli);
 	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
@@ -3782,7 +3791,8 @@ static void cli_full_connection_creds_tcon_done(struct tevent_req *subreq)
 }
 
 NTSTATUS cli_full_connection_creds_recv(struct tevent_req *req,
-				  struct cli_state **output_cli)
+					TALLOC_CTX *mem_ctx,
+					struct cli_state **output_cli)
 {
 	struct cli_full_connection_creds_state *state = tevent_req_data(
 		req, struct cli_full_connection_creds_state);
@@ -3791,12 +3801,13 @@ NTSTATUS cli_full_connection_creds_recv(struct tevent_req *req,
 	if (tevent_req_is_nterror(req, &status)) {
 		return status;
 	}
-	*output_cli = state->cli;
+	*output_cli = talloc_move(mem_ctx, &state->cli);
 	talloc_set_destructor(state, NULL);
 	return NT_STATUS_OK;
 }
 
-NTSTATUS cli_full_connection_creds(struct cli_state **output_cli,
+NTSTATUS cli_full_connection_creds(TALLOC_CTX *mem_ctx,
+				   struct cli_state **output_cli,
 				   const char *my_name,
 				   const char *dest_host,
 				   const struct sockaddr_storage *dest_ss, int port,
@@ -3808,7 +3819,7 @@ NTSTATUS cli_full_connection_creds(struct cli_state **output_cli,
 	struct tevent_req *req;
 	NTSTATUS status = NT_STATUS_NO_MEMORY;
 
-	ev = samba_tevent_context_init(talloc_tos());
+	ev = samba_tevent_context_init(mem_ctx);
 	if (ev == NULL) {
 		goto fail;
 	}
@@ -3822,7 +3833,7 @@ NTSTATUS cli_full_connection_creds(struct cli_state **output_cli,
 	if (!tevent_req_poll_ntstatus(req, ev, &status)) {
 		goto fail;
 	}
-	status = cli_full_connection_creds_recv(req, output_cli);
+	status = cli_full_connection_creds_recv(req, mem_ctx, output_cli);
  fail:
 	TALLOC_FREE(ev);
 	return status;
@@ -3947,9 +3958,10 @@ fail:
 
 /* Return a cli_state pointing at the IPC$ share for the given server */
 
-struct cli_state *get_ipc_connect(char *server,
-				struct sockaddr_storage *server_ss,
-				struct cli_credentials *creds)
+static struct cli_state *get_ipc_connect(TALLOC_CTX *mem_ctx,
+					 char *server,
+					 struct sockaddr_storage *server_ss,
+					 struct cli_credentials *creds)
 {
         struct cli_state *cli;
 	NTSTATUS nt_status;
@@ -3958,9 +3970,16 @@ struct cli_state *get_ipc_connect(char *server,
 	flags |= CLI_FULL_CONNECTION_FORCE_SMB1;
 	flags |= CLI_FULL_CONNECTION_IPC;
 
-	nt_status = cli_full_connection_creds(&cli, NULL, server, server_ss, 0, "IPC$", "IPC",
+	nt_status = cli_full_connection_creds(mem_ctx,
+					      &cli,
+					      NULL,
+					      server,
+					      server_ss,
+					      0,
+					      "IPC$",
+					      "IPC",
 					      creds,
-					flags);
+					      flags);
 
 	if (NT_STATUS_IS_OK(nt_status)) {
 		return cli;
@@ -3970,7 +3989,7 @@ struct cli_state *get_ipc_connect(char *server,
 	    fstring remote_name;
 
 	    if (name_status_find("*", 0, 0, server_ss, remote_name)) {
-		cli = get_ipc_connect(remote_name, server_ss, creds);
+		cli = get_ipc_connect(mem_ctx, remote_name, server_ss, creds);
 		if (cli)
 		    return cli;
 	    }
@@ -4035,7 +4054,7 @@ struct cli_state *get_ipc_connect_master_ip(TALLOC_CTX *ctx,
 	DEBUG(4, ("found master browser %s, %s\n", name, addr));
 
 	print_sockaddr(addr, sizeof(addr), &server_ss);
-	cli = get_ipc_connect(addr, &server_ss, creds);
+	cli = get_ipc_connect(ctx, addr, &server_ss, creds);
 
 	return cli;
 }
diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c
index 939b3b0da09..de8ac4dc1ea 100644
--- a/source3/libsmb/clidfs.c
+++ b/source3/libsmb/clidfs.c
@@ -178,10 +178,20 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx,
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
-	status = cli_connect_nb(
-		server, dest_ss, port, name_type, NULL,
-		signing_state,
-		flags, &c);
+	/*
+	 * The functions cli_resolve_path() and cli_cm_open() might not create a
+	 * new cli context, but might return an already existing one. This
+	 * forces us to have a long lived cli allocated on the NULL context.
+	 */
+	status = cli_connect_nb(NULL,
+				server,
+				dest_ss,
+				port,
+				name_type,
+				NULL,
+				signing_state,
+				flags,
+				&c);
 
 	if (!NT_STATUS_IS_OK(status)) {
 		if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
diff --git a/source3/libsmb/libsmb_server.c b/source3/libsmb/libsmb_server.c
index 69b51b829f6..8808781d410 100644
--- a/source3/libsmb/libsmb_server.c
+++ b/source3/libsmb/libsmb_server.c
@@ -529,9 +529,15 @@ SMBC_server_internal(TALLOC_CTX *ctx,
 			/*
 			 * Try 139 first for IPC$
 			 */
-			status = cli_connect_nb(server_n, NULL, NBT_SMB_PORT, 0x20,
-					smbc_getNetbiosName(context),
-					signing_state, flags, &c);
+			status = cli_connect_nb(NULL,
+						server_n,
+						NULL,
+						NBT_SMB_PORT,
+						0x20,
+						smbc_getNetbiosName(context),
+						signing_state,
+						flags,
+						&c);
 		}
 	}
 
@@ -539,9 +545,15 @@ SMBC_server_internal(TALLOC_CTX *ctx,
 		/*
 		 * No IPC$ or 139 did not work
 		 */
-		status = cli_connect_nb(server_n, NULL, port, 0x20,
+		status = cli_connect_nb(NULL,
+					server_n,
+					NULL,
+					port,
+					0x20,
 					smbc_getNetbiosName(context),
-					signing_state, flags, &c);
+					signing_state,
+					flags,
+					&c);
 	}
 
 	if (!NT_STATUS_IS_OK(status)) {
@@ -832,12 +844,17 @@ SMBC_attr_server(TALLOC_CTX *ctx,
 			return NULL;
 		}
 
-		nt_status = cli_full_connection_creds(&ipc_cli,
-						lp_netbios_name(), server,
-						NULL, 0, "IPC$", "?????",
-						creds,
-						flags);
-                if (! NT_STATUS_IS_OK(nt_status)) {
+		nt_status = cli_full_connection_creds(NULL,
+						      &ipc_cli,
+						      lp_netbios_name(),
+						      server,
+						      NULL,
+						      0,
+						      "IPC$",
+						      "?????",
+						      creds,
+						      flags);
+		if (! NT_STATUS_IS_OK(nt_status)) {
 			TALLOC_FREE(creds);
                         DEBUG(1,("cli_full_connection failed! (%s)\n",
                                  nt_errstr(nt_status)));
diff --git a/source3/libsmb/passchange.c b/source3/libsmb/passchange.c
index b3304ed6fc5..3231d0bfff2 100644
--- a/source3/libsmb/passchange.c
+++ b/source3/libsmb/passchange.c
@@ -44,8 +44,15 @@ NTSTATUS remote_password_change(const char *remote_machine,
 
 	*err_str = NULL;
 
-	result = cli_connect_nb(remote_machine, NULL, 0, 0x20, NULL,
-				SMB_SIGNING_IPC_DEFAULT, 0, &cli);
+	result = cli_connect_nb(talloc_tos(),
+				remote_machine,
+				NULL,
+				0,
+				0x20,
+				NULL,
+				SMB_SIGNING_IPC_DEFAULT,
+				0,
+				&cli);
 	if (!NT_STATUS_IS_OK(result)) {
 		if (NT_STATUS_EQUAL(result, NT_STATUS_NOT_SUPPORTED)) {
 			if (asprintf(err_str, "Unable to connect to SMB server on "
diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h
index 35b6577a4bd..afeea0f739e 100644
--- a/source3/libsmb/proto.h
+++ b/source3/libsmb/proto.h
@@ -82,10 +82,17 @@ NTSTATUS cli_tree_connect_creds(struct cli_state *cli,
 NTSTATUS cli_tree_connect(struct cli_state *cli, const char *share,
 			  const char *dev, const char *pass);
 NTSTATUS cli_tdis(struct cli_state *cli);
-NTSTATUS cli_connect_nb(const char *host, const struct sockaddr_storage *dest_ss,
-			uint16_t port, int name_type, const char *myname,
-			enum smb_signing_setting signing_state, int flags, struct cli_state **pcli);
-NTSTATUS cli_start_connection(struct cli_state **output_cli,
+NTSTATUS cli_connect_nb(TALLOC_CTX *mem_ctx,
+			const char *host,
+			const struct sockaddr_storage *dest_ss,
+			uint16_t port,
+			int name_type,
+			const char *myname,
+			enum smb_signing_setting signing_state,
+			int flags,
+			struct cli_state **pcli);
+NTSTATUS cli_start_connection(TALLOC_CTX *mem_ctx,
+			      struct cli_state **output_cli,
 			      const char *my_name,
 			      const char *dest_host,
 			      const struct sockaddr_storage *dest_ss, int port,
@@ -103,8 +110,10 @@ struct tevent_req *cli_full_connection_creds_send(
 	int flags,
 	struct smb2_negotiate_contexts *negotiate_contexts);
 NTSTATUS cli_full_connection_creds_recv(struct tevent_req *req,
+					TALLOC_CTX *mem_ctx,


-- 
Samba Shared Repository



More information about the samba-cvs mailing list