[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Wed Feb 26 21:12:05 UTC 2020


The branch, master has been updated
       via  4edece5e973 s3:smb2_tcon: pass down in_flags to smbd_smb2_tree_connect_send()
       via  3a7480d6124 s3:lib: Allow open_socket_out without a timeout
       via  09ea7248e01 lib/async_req: remove useless "reentrant" support from async_connect_send()
       via  a26be7eeedc s3:lib: avoid calling async_connect_send() again and again in open_socket_out*()
       via  d48fba7c096 s3:lib: avoid goto's in open_socket_out_send()
       via  ce1a3f2cb20 s3:lib: s/result/req in open_socket_out_send()
       via  048a4230b27 lib/async_req: make sure we return errors early from async_connect_send/recv
       via  6d63fa02466 lib/tsocket: add a comment regarding TEVENT_FD_READ in tstream_bsd_connect_send()
       via  aab5c8470f7 s3:wscript: split out dsgetdcname subsystem
       via  f99d8ffcbfe s3:wscript: move libsmb/clidgram.c to LIBNMB
       via  b1ebfec39ee s3:libsmb: move cli_set_message() to source3/libsmb/nmblib.c
       via  03562cf1282 s3:libsmb: use only a timeout of 250ms in name_resolve_bcast_send()
       via  08a7f5c47dd s3:libsmb: pass dest_ss to cli_cm_open()
       via  e0c502728fb s3:libsmb: pass dest_ss to cli_cm_connect() down to cli_connect_nb()
      from  c3242b4dfc8 libsmb: Fill in device which we don't get from cli_posix_stat

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


- Log -----------------------------------------------------------------
commit 4edece5e973ac22ce735be3ca2944147d26bdb5d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Sep 3 15:28:21 2018 +0200

    s3:smb2_tcon: pass down in_flags to smbd_smb2_tree_connect_send()
    
    SMB 3.1.1 converted the reserved field to a flags field.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Wed Feb 26 21:11:59 UTC 2020 on sn-devel-184

commit 3a7480d6124e39dcf99c67e602e0c2837e22d438
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Nov 27 10:15:39 2018 +0100

    s3:lib: Allow open_socket_out without a timeout
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 09ea7248e017eddd4764a2b643b720b73c6ec21b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Feb 26 14:16:05 2020 +0100

    lib/async_req: remove useless "reentrant" support from async_connect_send()
    
    Now that open_socket_out*() doesn't do the strange reentrant calls,
    we can remove support for this in async_connect_send(), so that we'll
    never get any new users of this.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit a26be7eeedc4995ea1a99f4bbb6ce8beaafda012
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Feb 26 13:36:05 2020 +0100

    s3:lib: avoid calling async_connect_send() again and again in open_socket_out*()
    
    There's really no need to do that!
    
    Once connect() is called and returned EINPROGRESS, the kernel
    knowns what to do and reports any state change via
    TEVENT_FD_READ or TEVENT_FD_WRITE.
    The actual success or failure is available via
    getsockopt(.., SOL_SOCKET, SO_ERROR, ...).
    
    Before this commit we called connect() (via async_connect_send()) again
    and again until we reached the final caller provided timeout,
    even if the kernel already found out that the destination is
    unreachable.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d48fba7c09603e0dcfc7d268d07eec557759b968
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Feb 26 13:27:32 2020 +0100

    s3:lib: avoid goto's in open_socket_out_send()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit ce1a3f2cb2047e90da8b6f1bfdfdee1347a5b30c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Feb 26 13:21:15 2020 +0100

    s3:lib: s/result/req in open_socket_out_send()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 048a4230b2774f4dd1ec706af5b675226da1e872
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Oct 2 07:56:30 2019 -0700

    lib/async_req: make sure we return errors early from async_connect_send/recv
    
    While it is true that [e]poll() only needs POLLOUT
    and POLLERR/POLLHUP are added implicitly.
    For tevent we need TEVENT_FD_READ in order to see POLLERR/POLLHUP.
    
    The socket becomes only readable when we hit an error.
    Waiting for TEVENT_FD_WRITE is needed for getting success,
    while TEVENT_FD_READ is required to get failures.
    
    This matches what we have in tstream_bsd_connect_send().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6d63fa024668d1f02fee0fa6b309497703be6a96
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Feb 26 16:36:30 2020 +0100

    lib/tsocket: add a comment regarding TEVENT_FD_READ in tstream_bsd_connect_send()
    
    This is different compared to the raw usage of [e]poll
    where [E]POLLOUT is enough to see errors via POLLERR/POLLHUP.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit aab5c8470f72f601b4185bb49d5539c4f29b3cd8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Oct 30 15:55:32 2019 +0100

    s3:wscript: split out dsgetdcname subsystem
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit f99d8ffcbfeaf287363ca222f89c193526b6d076
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Oct 30 16:20:19 2019 +0100

    s3:wscript: move libsmb/clidgram.c to LIBNMB
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit b1ebfec39ee53dd42715e8ce6b3b0ab9872aa542
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Oct 30 16:19:40 2019 +0100

    s3:libsmb: move cli_set_message() to source3/libsmb/nmblib.c
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 03562cf12821ab038040aa569a8883ab93ebd3b5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Oct 31 07:47:53 2019 +0100

    s3:libsmb: use only a timeout of 250ms in name_resolve_bcast_send()
    
    We use the same value for broadcasts in name_query().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 08a7f5c47ddc9673bca7377caf121ad5aad1e3b4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 23 09:21:41 2018 +0200

    s3:libsmb: pass dest_ss to cli_cm_open()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit e0c502728fb6036a2b629285cbc6ea8c624cecb0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 23 09:20:49 2018 +0200

    s3:libsmb: pass dest_ss to cli_cm_connect() down to cli_connect_nb()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 lib/async_req/async_sock.c | 15 +++++----
 lib/tsocket/tsocket_bsd.c  |  8 +++++
 source3/client/client.c    | 26 +++++++++------
 source3/lib/netapi/cm.c    |  2 +-
 source3/lib/util_sock.c    | 81 +++++++++-------------------------------------
 source3/libsmb/clidfs.c    | 14 +++++---
 source3/libsmb/clientgen.c | 15 ---------
 source3/libsmb/namequery.c |  2 +-
 source3/libsmb/nmblib.c    | 15 +++++++++
 source3/libsmb/nmblib.h    |  1 +
 source3/libsmb/proto.h     |  2 +-
 source3/smbd/smb2_tcon.c   | 10 ++++++
 source3/wscript_build      | 14 ++++++--
 13 files changed, 100 insertions(+), 105 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c
index 0a8a333f4f3..e436d00ac79 100644
--- a/lib/async_req/async_sock.c
+++ b/lib/async_req/async_sock.c
@@ -131,10 +131,6 @@ struct tevent_req *async_connect_send(
 	 * The only errno indicating that an initial connect is still
 	 * in flight is EINPROGRESS.
 	 *
-	 * We get EALREADY when someone calls us a second time for a
-	 * given fd and the connect is still in flight (and returned
-	 * EINPROGRESS the first time).
-	 *
 	 * This allows callers like open_socket_out_send() to reuse
 	 * fds and call us with an fd for which the connect is still
 	 * in flight. The proper thing to do for callers would be
@@ -142,12 +138,19 @@ struct tevent_req *async_connect_send(
 	 * socket.
 	 */
 
-	if (errno != EINPROGRESS && errno != EALREADY) {
+	if (errno != EINPROGRESS) {
 		tevent_req_error(req, errno);
 		return tevent_req_post(req, ev);
 	}
 
-	state->fde = tevent_add_fd(ev, state, fd, TEVENT_FD_WRITE,
+	/*
+	 * Note for historic reasons TEVENT_FD_WRITE is not enough
+	 * to get notified for POLLERR or EPOLLHUP even if they
+	 * come together with POLLOUT. That means we need to
+	 * use TEVENT_FD_READ in addition until we have
+	 * TEVENT_FD_ERROR.
+	 */
+	state->fde = tevent_add_fd(ev, state, fd, TEVENT_FD_READ|TEVENT_FD_WRITE,
 				   async_connect_connected, req);
 	if (state->fde == NULL) {
 		tevent_req_error(req, ENOMEM);
diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c
index 1627051f3ec..6ad40bd0ada 100644
--- a/lib/tsocket/tsocket_bsd.c
+++ b/lib/tsocket/tsocket_bsd.c
@@ -2341,6 +2341,14 @@ static struct tevent_req *tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
 	goto post;
 
  async:
+
+	/*
+	 * Note for historic reasons TEVENT_FD_WRITE is not enough
+	 * to get notified for POLLERR or EPOLLHUP even if they
+	 * come together with POLLOUT. That means we need to
+	 * use TEVENT_FD_READ in addition until we have
+	 * TEVENT_FD_ERROR.
+	 */
 	state->fde = tevent_add_fd(ev, state,
 				   state->fd,
 				   TEVENT_FD_READ | TEVENT_FD_WRITE,
diff --git a/source3/client/client.c b/source3/client/client.c
index d907890ddaf..8d329216d58 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -5719,10 +5719,12 @@ static int process_command_string(const char *cmd_in)
 		NTSTATUS status;
 
 		status = cli_cm_open(talloc_tos(), NULL,
-				     have_ip ? dest_ss_str : desthost,
+				     desthost,
 				     service, popt_get_cmdline_auth_info(),
 				     smb_encrypt,
-				     max_protocol, port, name_type,
+				     max_protocol,
+				     have_ip ? &dest_ss : NULL, port,
+				     name_type,
 				     &cli);
 		if (!NT_STATUS_IS_OK(status)) {
 			return 1;
@@ -6162,9 +6164,10 @@ static int process(const char *base_directory)
 	NTSTATUS status;
 
 	status = cli_cm_open(talloc_tos(), NULL,
-			     have_ip ? dest_ss_str : desthost,
+			     desthost,
 			     service, popt_get_cmdline_auth_info(),
-			     smb_encrypt, max_protocol, port,
+			     smb_encrypt, max_protocol,
+			     have_ip ? &dest_ss : NULL, port,
 			     name_type, &cli);
 	if (!NT_STATUS_IS_OK(status)) {
 		return 1;
@@ -6199,9 +6202,10 @@ static int do_host_query(const char *query_host)
 	NTSTATUS status;
 
 	status = cli_cm_open(talloc_tos(), NULL,
-			     have_ip ? dest_ss_str : query_host,
+			     query_host,
 			     "IPC$", popt_get_cmdline_auth_info(),
-			     smb_encrypt, max_protocol, port,
+			     smb_encrypt, max_protocol,
+			     have_ip ? &dest_ss : NULL, port,
 			     name_type, &cli);
 	if (!NT_STATUS_IS_OK(status)) {
 		return 1;
@@ -6245,10 +6249,11 @@ static int do_host_query(const char *query_host)
 		cli_shutdown(cli);
 		d_printf("Reconnecting with SMB1 for workgroup listing.\n");
 		status = cli_cm_open(talloc_tos(), NULL,
-				     have_ip ? dest_ss_str : query_host,
+				     query_host,
 				     "IPC$", popt_get_cmdline_auth_info(),
 				     smb_encrypt, max_proto,
-				     NBT_SMB_PORT, name_type, &cli);
+				     have_ip ? &dest_ss : NULL, NBT_SMB_PORT,
+				     name_type, &cli);
 		if (!NT_STATUS_IS_OK(status)) {
 			d_printf("Unable to connect with SMB1 "
 				 "-- no workgroup available\n");
@@ -6278,10 +6283,11 @@ static int do_tar_op(const char *base_directory)
 		NTSTATUS status;
 
 		status = cli_cm_open(talloc_tos(), NULL,
-				     have_ip ? dest_ss_str : desthost,
+				     desthost,
 				     service, popt_get_cmdline_auth_info(),
 				     smb_encrypt, max_protocol,
-				     port, name_type, &cli);
+				     have_ip ? &dest_ss : NULL, port,
+				     name_type, &cli);
 		if (!NT_STATUS_IS_OK(status)) {
             ret = 1;
             goto out;
diff --git a/source3/lib/netapi/cm.c b/source3/lib/netapi/cm.c
index 95132f28f05..1b8f2a4e97a 100644
--- a/source3/lib/netapi/cm.c
+++ b/source3/lib/netapi/cm.c
@@ -112,7 +112,7 @@ static WERROR libnetapi_open_ipc_connection(struct libnetapi_ctx *ctx,
 			     auth_info,
 			     false,
 			     lp_client_ipc_max_protocol(),
-			     0, 0x20, &cli_ipc);
+			     NULL, 0, 0x20, &cli_ipc);
 	if (!NT_STATUS_IS_OK(status)) {
 		cli_ipc = NULL;
 	}
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index 8fd2f7fa315..0b7029706a6 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -417,7 +417,6 @@ struct open_socket_out_state {
 	struct sockaddr_storage ss;
 	socklen_t salen;
 	uint16_t port;
-	int wait_usec;
 	struct tevent_req *connect_subreq;
 };
 
@@ -459,32 +458,34 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX *mem_ctx,
 					int timeout)
 {
 	char addr[INET6_ADDRSTRLEN];
-	struct tevent_req *result;
+	struct tevent_req *req;
 	struct open_socket_out_state *state;
 	NTSTATUS status;
 
-	result = tevent_req_create(mem_ctx, &state,
-				   struct open_socket_out_state);
-	if (result == NULL) {
+	req = tevent_req_create(mem_ctx, &state,
+				struct open_socket_out_state);
+	if (req == NULL) {
 		return NULL;
 	}
 	state->ev = ev;
 	state->ss = *pss;
 	state->port = port;
-	state->wait_usec = 10000;
 	state->salen = -1;
 
 	state->fd = socket(state->ss.ss_family, SOCK_STREAM, 0);
 	if (state->fd == -1) {
 		status = map_nt_error_from_unix(errno);
-		goto post_status;
+		tevent_req_nterror(req, status);
+		return tevent_req_post(req, ev);
 	}
 
-	tevent_req_set_cleanup_fn(result, open_socket_out_cleanup);
+	tevent_req_set_cleanup_fn(req, open_socket_out_cleanup);
 
-	if (!tevent_req_set_endtime(
-		    result, ev, timeval_current_ofs_msec(timeout))) {
-		goto fail;
+	if ((timeout != 0) &&
+	    !tevent_req_set_endtime(
+		    req, ev, timeval_current_ofs_msec(timeout))) {
+		tevent_req_oom(req);
+		return tevent_req_post(req, ev);
 	}
 
 #if defined(HAVE_IPV6)
@@ -517,22 +518,12 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX *mem_ctx,
 	state->connect_subreq = async_connect_send(
 		state, state->ev, state->fd, (struct sockaddr *)&state->ss,
 		state->salen, NULL, NULL, NULL);
-	if ((state->connect_subreq == NULL)
-	    || !tevent_req_set_endtime(
-		    state->connect_subreq, state->ev,
-		    timeval_current_ofs(0, state->wait_usec))) {
-		goto fail;
+	if (tevent_req_nomem(state->connect_subreq, NULL)) {
+		return tevent_req_post(req, ev);
 	}
 	tevent_req_set_callback(state->connect_subreq,
-				open_socket_out_connected, result);
-	return result;
-
- post_status:
-	tevent_req_nterror(result, status);
-	return tevent_req_post(result, ev);
- fail:
-	TALLOC_FREE(result);
-	return NULL;
+				open_socket_out_connected, req);
+	return req;
 }
 
 static void open_socket_out_connected(struct tevent_req *subreq)
@@ -552,46 +543,6 @@ static void open_socket_out_connected(struct tevent_req *subreq)
 		return;
 	}
 
-	if (
-#ifdef ETIMEDOUT
-		(sys_errno == ETIMEDOUT) ||
-#endif
-		(sys_errno == EINPROGRESS) ||
-		(sys_errno == EALREADY) ||
-		(sys_errno == EAGAIN)) {
-
-		/*
-		 * retry
-		 */
-
-		if (state->wait_usec < 250000) {
-			state->wait_usec *= 1.5;
-		}
-
-		subreq = async_connect_send(state, state->ev, state->fd,
-					    (struct sockaddr *)&state->ss,
-					    state->salen, NULL, NULL, NULL);
-		if (tevent_req_nomem(subreq, req)) {
-			return;
-		}
-		if (!tevent_req_set_endtime(
-			    subreq, state->ev,
-			    timeval_current_ofs_usec(state->wait_usec))) {
-			return;
-		}
-		state->connect_subreq = subreq;
-		tevent_req_set_callback(subreq, open_socket_out_connected, req);
-		return;
-	}
-
-#ifdef EISCONN
-	if (sys_errno == EISCONN) {
-		tevent_req_done(req);
-		return;
-	}
-#endif
-
-	/* real error */
 	tevent_req_nterror(req, map_nt_error_from_unix(sys_errno));
 }
 
diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c
index ba851f3f471..25f932c60bb 100644
--- a/source3/libsmb/clidfs.c
+++ b/source3/libsmb/clidfs.c
@@ -137,6 +137,7 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx,
 					const struct user_auth_info *auth_info,
 					bool force_encrypt,
 					int max_protocol,
+					const struct sockaddr_storage *dest_ss,
 					int port,
 					int name_type,
 					struct cli_state **pcli)
@@ -191,7 +192,7 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx,
 	}
 
 	status = cli_connect_nb(
-		server, NULL, port, name_type, NULL,
+		server, dest_ss, port, name_type, NULL,
 		signing_state,
 		flags, &c);
 
@@ -274,7 +275,7 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx,
 		return do_connect(ctx, newserver,
 				newshare, auth_info,
 				force_encrypt, max_protocol,
-				port, name_type, pcli);
+				NULL, port, name_type, pcli);
 	}
 
 	/* must be a normal share */
@@ -329,6 +330,7 @@ static NTSTATUS cli_cm_connect(TALLOC_CTX *ctx,
 			       const struct user_auth_info *auth_info,
 			       bool force_encrypt,
 			       int max_protocol,
+			       const struct sockaddr_storage *dest_ss,
 			       int port,
 			       int name_type,
 			       struct cli_state **pcli)
@@ -339,7 +341,7 @@ static NTSTATUS cli_cm_connect(TALLOC_CTX *ctx,
 	status = do_connect(ctx, server, share,
 				auth_info,
 				force_encrypt, max_protocol,
-				port, name_type, &cli);
+				dest_ss, port, name_type, &cli);
 
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
@@ -424,6 +426,7 @@ NTSTATUS cli_cm_open(TALLOC_CTX *ctx,
 				const struct user_auth_info *auth_info,
 				bool force_encrypt,
 				int max_protocol,
+				const struct sockaddr_storage *dest_ss,
 				int port,
 				int name_type,
 				struct cli_state **pcli)
@@ -453,6 +456,7 @@ NTSTATUS cli_cm_open(TALLOC_CTX *ctx,
 				auth_info,
 				force_encrypt,
 				max_protocol,
+				dest_ss,
 				port,
 				name_type,
 				&c);
@@ -1001,6 +1005,7 @@ NTSTATUS cli_resolve_path(TALLOC_CTX *ctx,
 			     dfs_auth_info,
 			     cli_state_is_encryption_on(rootcli),
 			     smbXcli_conn_protocol(rootcli->conn),
+			     NULL, /* dest_ss not needed, we reuse the transport */
 			     0,
 			     0x20,
 			     &cli_ipc);
@@ -1058,7 +1063,8 @@ NTSTATUS cli_resolve_path(TALLOC_CTX *ctx,
 				dfs_auth_info,
 				cli_state_is_encryption_on(rootcli),
 				smbXcli_conn_protocol(rootcli->conn),
-				0,
+				NULL, /* dest_ss */
+				0, /* port */
 				0x20,
 				targetcli);
 		if (!NT_STATUS_IS_OK(status)) {
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 6c946ff17d6..d68b86df1c7 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -28,21 +28,6 @@
 #include "../librpc/ndr/libndr.h"
 #include "../include/client.h"
 
-/*******************************************************************
- Setup the word count and byte count for a client smb message.
-********************************************************************/
-
-int cli_set_message(char *buf,int num_words,int num_bytes,bool zero)
-{
-	if (zero && (num_words || num_bytes)) {
-		memset(buf + smb_size,'\0',num_words*2 + num_bytes);
-	}
-	SCVAL(buf,smb_wct,num_words);
-	SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
-	smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
-	return (smb_size + num_words*2 + num_bytes);
-}
-
 /****************************************************************************
  Change the timeout (in milliseconds).
 ****************************************************************************/
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
index e27b60b0398..454ea61a895 100644
--- a/source3/libsmb/namequery.c
+++ b/source3/libsmb/namequery.c
@@ -1871,7 +1871,7 @@ struct tevent_req *name_resolve_bcast_send(TALLOC_CTX *mem_ctx,
 	}
 
 	subreq = name_queries_send(state, ev, name, name_type, true, true,
-				   bcast_addrs, num_bcast_addrs, 0, 1000);
+				   bcast_addrs, num_bcast_addrs, 0, 250);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
diff --git a/source3/libsmb/nmblib.c b/source3/libsmb/nmblib.c
index c05fac2bba9..a5e691a1c86 100644
--- a/source3/libsmb/nmblib.c
+++ b/source3/libsmb/nmblib.c
@@ -1448,3 +1448,18 @@ int name_len(unsigned char *s1, size_t buf_len)
 
 	return(len);
 }
+
+/*******************************************************************
+ Setup the word count and byte count for a client smb message.
+********************************************************************/
+
+int cli_set_message(char *buf,int num_words,int num_bytes,bool zero)
+{
+	if (zero && (num_words || num_bytes)) {
+		memset(buf + smb_size,'\0',num_words*2 + num_bytes);
+	}
+	SCVAL(buf,smb_wct,num_words);
+	SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
+	smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
+	return (smb_size + num_words*2 + num_bytes);
+}
diff --git a/source3/libsmb/nmblib.h b/source3/libsmb/nmblib.h
index a0624ed085c..52600a41e57 100644
--- a/source3/libsmb/nmblib.h
+++ b/source3/libsmb/nmblib.h
@@ -54,5 +54,6 @@ void sort_query_replies(char *data, int n, struct in_addr ip);
 char *name_mangle(TALLOC_CTX *mem_ctx, const char *In, char name_type);
 int name_extract(unsigned char *buf,size_t buf_len, unsigned int ofs, fstring name);
 int name_len(unsigned char *s1, size_t buf_len);
+int cli_set_message(char *buf,int num_words,int num_bytes,bool zero);
 
 #endif /* _LIBSMB_NMBLIB_H_ */
diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h
index 12241fda798..e44dad13200 100644
--- a/source3/libsmb/proto.h
+++ b/source3/libsmb/proto.h
@@ -150,6 +150,7 @@ NTSTATUS cli_cm_open(TALLOC_CTX *ctx,
 				const struct user_auth_info *auth_info,
 				bool force_encrypt,
 				int max_protocol,
+				const struct sockaddr_storage *dest_ss,
 				int port,
 				int name_type,
 				struct cli_state **pcli);
@@ -186,7 +187,6 @@ bool cli_check_msdfs_proxy(TALLOC_CTX *ctx,
 
 /* The following definitions come from libsmb/clientgen.c  */
 
-int cli_set_message(char *buf,int num_words,int num_bytes,bool zero);
 unsigned int cli_set_timeout(struct cli_state *cli, unsigned int timeout);
 bool cli_set_backup_intent(struct cli_state *cli, bool flag);
 extern struct GUID cli_state_client_guid;
diff --git a/source3/smbd/smb2_tcon.c b/source3/smbd/smb2_tcon.c
index bf709d8686e..76112d04889 100644
--- a/source3/smbd/smb2_tcon.c
+++ b/source3/smbd/smb2_tcon.c
@@ -33,6 +33,7 @@
 static struct tevent_req *smbd_smb2_tree_connect_send(TALLOC_CTX *mem_ctx,
 					struct tevent_context *ev,
 					struct smbd_smb2_request *smb2req,
+					uint16_t in_flags,
 					const char *in_path);
 static NTSTATUS smbd_smb2_tree_connect_recv(struct tevent_req *req,
 					    uint8_t *out_share_type,
@@ -46,7 +47,9 @@ static void smbd_smb2_request_tcon_done(struct tevent_req *subreq);
 
 NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
 {
+	struct smbXsrv_connection *xconn = req->xconn;
 	const uint8_t *inbody;
+	uint16_t in_flags;
 	uint16_t in_path_offset;
 	uint16_t in_path_length;
 	DATA_BLOB in_path_buffer;
@@ -62,6 +65,11 @@ NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
 	}
 	inbody = SMBD_SMB2_IN_BODY_PTR(req);
 
+	if (xconn->protocol >= PROTOCOL_SMB3_11) {
+		in_flags = SVAL(inbody, 0x02);
+	} else {
+		in_flags = 0;
+	}
 	in_path_offset = SVAL(inbody, 0x04);
 	in_path_length = SVAL(inbody, 0x06);
 
@@ -96,6 +104,7 @@ NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req)
 	subreq = smbd_smb2_tree_connect_send(req,
 					     req->sconn->ev_ctx,
 					     req,
+					     in_flags,
 					     in_path_string);
 	if (subreq == NULL) {
 		return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
@@ -425,6 +434,7 @@ struct smbd_smb2_tree_connect_state {
 static struct tevent_req *smbd_smb2_tree_connect_send(TALLOC_CTX *mem_ctx,
 					struct tevent_context *ev,
 					struct smbd_smb2_request *smb2req,
+					uint16_t in_flags,
 					const char *in_path)
 {
 	struct tevent_req *req;
diff --git a/source3/wscript_build b/source3/wscript_build
index 5dd0af73c8b..465c1e5875d 100644
--- a/source3/wscript_build


-- 
Samba Shared Repository



More information about the samba-cvs mailing list