[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