[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Thu Jul 24 13:33:04 MDT 2014


The branch, master has been updated
       via  3f6926d s3:smbd: remove unused client_get_tcp_info()
       via  7ca5e83 s3:smbd: avoid using client_get_tcp_info()
       via  017db6d torture: Add FSCTL_QUERY_NETWORK_INTERFACE_INFO torture test case to source4/torture/smb2/ioctl.c
       via  09fb44d librpc: Add NETWORK_INTERFACE_INFO IDL data structure
       via  dbc1ad2 torture4: Use sizeof(char-array) instead of constant
       via  1250d62 s4:torture/smb2: add smb2.session.bind1
       via  720189f s4:libcli/smb2: add smb2_session_channel()
       via  78e46d7 s4:libcli/smb2: remove unused 'primary' argument of smb2_session_init()
      from  cd95937 s3: remove stat_ex.vfs_private completely

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


- Log -----------------------------------------------------------------
commit 3f6926d94e536d05f4efe8cb44d0da71f6f74807
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 23 12:40:31 2014 +0200

    s3:smbd: remove unused client_get_tcp_info()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Thu Jul 24 21:32:17 CEST 2014 on sn-devel-104

commit 7ca5e83cad61a246aee6e415d604a97aa8729739
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 23 12:37:14 2014 +0200

    s3:smbd: avoid using client_get_tcp_info()
    
    We already have the required information as stack variable
    in the current function. There's no need to call get[peer|sock]name()
    twice.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 017db6d0f893a4169627c4e182ab84f4a6adb533
Author: Anubhav Rakshit <anubhav.rakshit at gmail.com>
Date:   Wed Jun 18 22:04:14 2014 +0530

    torture: Add FSCTL_QUERY_NETWORK_INTERFACE_INFO torture test case to source4/torture/smb2/ioctl.c
    
    Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
    Signed-off-by: Anubhav Rakshit <anubhav.rakshit at gmail.com>
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 09fb44d1224bedee1f7a92d2bca1518ad62b3ba4
Author: Anubhav Rakshit <anubhav.rakshit at gmail.com>
Date:   Mon Jun 16 15:30:18 2014 +0530

    librpc: Add NETWORK_INTERFACE_INFO IDL data structure
    
    This is in preparation for adding NETWORK_INTERFACE_INFO Ioctl smbtorture test
    case. This data structure is described in MS-SMB2 Sec. 2.2.32.5
    
    Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
    Signed-off-by: Anubhav Rakshit <anubhav.rakshit at gmail.com>
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit dbc1ad2965b7535bb5b41a994d7188dc23d18770
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jul 23 11:37:28 2014 +0000

    torture4: Use sizeof(char-array) instead of constant
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 1250d62f696b7209d605f51e7b047ea1e2ea7dc6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jun 24 06:40:29 2014 +0200

    s4:torture/smb2: add smb2.session.bind1
    
    This is a very simple multi-channel test
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 720189f246c33c763882731e626c5b0fe558d0f9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jun 24 00:22:30 2014 +0200

    s4:libcli/smb2: add smb2_session_channel()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 78e46d7349b5839993c001a5afc2060a48244d15
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 10 08:21:22 2014 +0200

    s4:libcli/smb2: remove unused 'primary' argument of smb2_session_init()
    
    This also gets rid of a talloc_reference() usage.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

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

Summary of changes:
 librpc/idl/ioctl.idl           |   45 ++++++++++++
 librpc/ndr/ndr_ioctl.c         |   40 ++++++++++
 librpc/wscript_build           |    2 +-
 source3/smbd/process.c         |   57 +++++----------
 source4/libcli/smb2/connect.c  |    2 +-
 source4/libcli/smb2/session.c  |   91 +++++++++++++++++++----
 source4/libcli/smb2/smb2.h     |    1 +
 source4/torture/smb2/ioctl.c   |   47 ++++++++++++
 source4/torture/smb2/session.c |  154 +++++++++++++++++++++++++++++++++++++---
 source4/torture/smb2/util.c    |    2 +-
 10 files changed, 371 insertions(+), 70 deletions(-)
 create mode 100644 librpc/ndr/ndr_ioctl.c


Changeset truncated at 500 lines:

diff --git a/librpc/idl/ioctl.idl b/librpc/idl/ioctl.idl
index b4485e0..a0a9950 100644
--- a/librpc/idl/ioctl.idl
+++ b/librpc/idl/ioctl.idl
@@ -99,3 +99,48 @@ interface compression
 		uint16 format;
 	} compression_state;
 }
+
+interface netinterface
+{
+	typedef [bitmap32bit] bitmap {
+		FSCTL_NET_IFACE_RSS_CAPABLE = 0x00000001,
+		FSCTL_NET_IFACE_RDMA_CAPABLE = 0x00000002
+	} fsctl_net_iface_capability;
+
+	typedef [enum16bit] enum {
+		FSCTL_NET_IFACE_AF_INET = 0x0002,
+		FSCTL_NET_IFACE_AF_INET6 = 0x0017
+	} fsctl_sockaddr_af;
+
+	typedef [flag(NDR_NOALIGN)] struct {
+		[value(0)] uint16 port;
+		[flag(NDR_BIG_ENDIAN)] ipv4address ipv4;
+		[value(0)] hyper reserved;
+	} fsctl_sockaddr_in;
+
+	typedef [flag(NDR_NOALIGN)] struct {
+		[value(0)] uint16 port;
+		[value(0)] uint32 flowinfo;
+		[flag(NDR_BIG_ENDIAN)] ipv6address ipv6;
+		[value(0)] uint32 scopeid;
+	} fsctl_sockaddr_in6;
+
+	typedef [nodiscriminant,flag(NDR_NOALIGN)] union {
+		[case (FSCTL_NET_IFACE_AF_INET)] fsctl_sockaddr_in saddr_in;
+		[case (FSCTL_NET_IFACE_AF_INET6)] fsctl_sockaddr_in6 saddr_in6;
+	} fsctl_sockaddr_union;
+
+	typedef [flag(NDR_NOALIGN)] struct {
+		fsctl_sockaddr_af family;
+		[subcontext(0),subcontext_size(126),switch_is(family)] fsctl_sockaddr_union saddr;
+	} fsctl_sockaddr_storage;
+
+	typedef [public,relative_base,noprint] struct {
+		[relative] fsctl_net_iface_info *next;
+		uint32 ifindex;
+		fsctl_net_iface_capability capability;
+		[value(0)] uint32 reserved;
+		hyper linkspeed;
+		fsctl_sockaddr_storage sockaddr;
+	} fsctl_net_iface_info;
+}
diff --git a/librpc/ndr/ndr_ioctl.c b/librpc/ndr/ndr_ioctl.c
new file mode 100644
index 0000000..7e76abc
--- /dev/null
+++ b/librpc/ndr/ndr_ioctl.c
@@ -0,0 +1,40 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Manually parsed structures for IOCTL/FSCTL
+
+   Copyright (C) Stefan Metzmacher 2014
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "librpc/gen_ndr/ndr_ioctl.h"
+
+_PUBLIC_ void ndr_print_fsctl_net_iface_info(struct ndr_print *ndr, const char *name, const struct fsctl_net_iface_info *r)
+{
+	ndr_print_struct(ndr, name, "fsctl_net_iface_info");
+	if (r == NULL) { ndr_print_null(ndr); return; }
+	ndr->depth++;
+	ndr_print_ptr(ndr, "next", r->next);
+	ndr_print_uint32(ndr, "ifindex", r->ifindex);
+	ndr_print_fsctl_net_iface_capability(ndr, "capability", r->capability);
+	ndr_print_uint32(ndr, "reserved", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?0:r->reserved);
+	ndr_print_hyper(ndr, "linkspeed", r->linkspeed);
+	ndr_print_fsctl_sockaddr_storage(ndr, "sockaddr", &r->sockaddr);
+	ndr->depth--;
+	if (r->next) {
+		ndr_print_fsctl_net_iface_info(ndr, "next", r->next);
+	}
+}
diff --git a/librpc/wscript_build b/librpc/wscript_build
index b21619e..0a60b62 100644
--- a/librpc/wscript_build
+++ b/librpc/wscript_build
@@ -616,7 +616,7 @@ bld.SAMBA_SUBSYSTEM('RPC_NDR_DNSSERVER',
     )
 
 bld.SAMBA_SUBSYSTEM('NDR_IOCTL',
-    source='gen_ndr/ndr_ioctl.c',
+    source='gen_ndr/ndr_ioctl.c ndr/ndr_ioctl.c',
     public_deps='ndr'
     )
 
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index dd931e0..127bbb3 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -2670,21 +2670,6 @@ static NTSTATUS smbd_register_ips(struct smbd_server_connection *sconn,
 	return ctdbd_register_ips(cconn, srv, clnt, release_ip, state);
 }
 
-static int client_get_tcp_info(int sock, struct sockaddr_storage *server,
-			       struct sockaddr_storage *client)
-{
-	socklen_t length;
-	length = sizeof(*server);
-	if (getsockname(sock, (struct sockaddr *)server, &length) != 0) {
-		return -1;
-	}
-	length = sizeof(*client);
-	if (getpeername(sock, (struct sockaddr *)client, &length) != 0) {
-		return -1;
-	}
-	return 0;
-}
-
 static void msg_kill_client_ip(struct messaging_context *msg_ctx,
 				  void *private_data, uint32_t msg_type,
 				  struct server_id server_id, DATA_BLOB *data)
@@ -3512,8 +3497,12 @@ void smbd_process(struct tevent_context *ev_ctx,
 	TALLOC_CTX *frame = talloc_stackframe();
 	struct smbXsrv_connection *conn;
 	struct smbd_server_connection *sconn;
-	struct sockaddr_storage ss;
-	struct sockaddr *sa = NULL;
+	struct sockaddr_storage ss_srv;
+	void *sp_srv = (void *)&ss_srv;
+	struct sockaddr *sa_srv = (struct sockaddr *)sp_srv;
+	struct sockaddr_storage ss_clnt;
+	void *sp_clnt = (void *)&ss_clnt;
+	struct sockaddr *sa_clnt = (struct sockaddr *)sp_clnt;
 	socklen_t sa_socklen;
 	struct tsocket_address *local_address = NULL;
 	struct tsocket_address *remote_address = NULL;
@@ -3580,16 +3569,15 @@ void smbd_process(struct tevent_context *ev_ctx,
 	set_socket_options(sconn->sock, "SO_KEEPALIVE");
 	set_socket_options(sconn->sock, lp_socket_options());
 
-	sa = (struct sockaddr *)(void *)&ss;
-	sa_socklen = sizeof(ss);
-	ret = getpeername(sconn->sock, sa, &sa_socklen);
+	sa_socklen = sizeof(ss_clnt);
+	ret = getpeername(sock_fd, sa_clnt, &sa_socklen);
 	if (ret != 0) {
 		int level = (errno == ENOTCONN)?2:0;
 		DEBUG(level,("getpeername() failed - %s\n", strerror(errno)));
 		exit_server_cleanly("getpeername() failed.\n");
 	}
 	ret = tsocket_address_bsd_from_sockaddr(sconn,
-						sa, sa_socklen,
+						sa_clnt, sa_socklen,
 						&remote_address);
 	if (ret != 0) {
 		DEBUG(0,("%s: tsocket_address_bsd_from_sockaddr remote failed - %s\n",
@@ -3597,16 +3585,15 @@ void smbd_process(struct tevent_context *ev_ctx,
 		exit_server_cleanly("tsocket_address_bsd_from_sockaddr remote failed.\n");
 	}
 
-	sa = (struct sockaddr *)(void *)&ss;
-	sa_socklen = sizeof(ss);
-	ret = getsockname(sconn->sock, sa, &sa_socklen);
+	sa_socklen = sizeof(ss_srv);
+	ret = getsockname(sock_fd, sa_srv, &sa_socklen);
 	if (ret != 0) {
 		int level = (errno == ENOTCONN)?2:0;
 		DEBUG(level,("getsockname() failed - %s\n", strerror(errno)));
 		exit_server_cleanly("getsockname() failed.\n");
 	}
 	ret = tsocket_address_bsd_from_sockaddr(sconn,
-						sa, sa_socklen,
+						sa_srv, sa_socklen,
 						&local_address);
 	if (ret != 0) {
 		DEBUG(0,("%s: tsocket_address_bsd_from_sockaddr remote failed - %s\n",
@@ -3792,22 +3779,12 @@ void smbd_process(struct tevent_context *ev_ctx,
 		 * tickle acks, triggering a reconnection by the
 		 * client.
 		 */
+		NTSTATUS status;
 
-		struct sockaddr_storage srv, clnt;
-
-		if (client_get_tcp_info(sconn->sock, &srv, &clnt) == 0) {
-			NTSTATUS status;
-			status = smbd_register_ips(sconn, &srv, &clnt);
-			if (!NT_STATUS_IS_OK(status)) {
-				DEBUG(0, ("ctdbd_register_ips failed: %s\n",
-					  nt_errstr(status)));
-			}
-		} else {
-			int level = (errno == ENOTCONN)?2:0;
-			DEBUG(level,("Unable to get tcp info for "
-				     "smbd_register_ips: %s\n",
-				     strerror(errno)));
-			exit_server_cleanly("client_get_tcp_info() failed.\n");
+		status = smbd_register_ips(sconn, &ss_srv, &ss_clnt);
+		if (!NT_STATUS_IS_OK(status)) {
+			DEBUG(0, ("ctdbd_register_ips failed: %s\n",
+				  nt_errstr(status)));
 		}
 	}
 
diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c
index 18977d8..7a69b3e 100644
--- a/source4/libcli/smb2/connect.c
+++ b/source4/libcli/smb2/connect.c
@@ -172,7 +172,7 @@ static void smb2_connect_negprot_done(struct tevent_req *subreq)
 	/* This is a hack... */
 	smb2cli_conn_set_max_credits(transport->conn, 30);
 
-	state->session = smb2_session_init(transport, state->gensec_settings, state, true);
+	state->session = smb2_session_init(transport, state->gensec_settings, state);
 	if (tevent_req_nomem(state->session, req)) {
 		return;
 	}
diff --git a/source4/libcli/smb2/session.c b/source4/libcli/smb2/session.c
index dfc607e..9ab96a3 100644
--- a/source4/libcli/smb2/session.c
+++ b/source4/libcli/smb2/session.c
@@ -36,7 +36,7 @@
  */
 struct smb2_session *smb2_session_init(struct smb2_transport *transport,
 				       struct gensec_settings *settings,
-				       TALLOC_CTX *parent_ctx, bool primary)
+				       TALLOC_CTX *parent_ctx)
 {
 	struct smb2_session *session;
 	NTSTATUS status;
@@ -45,11 +45,7 @@ struct smb2_session *smb2_session_init(struct smb2_transport *transport,
 	if (!session) {
 		return NULL;
 	}
-	if (primary) {
-		session->transport = talloc_steal(session, transport);
-	} else {
-		session->transport = talloc_reference(session, transport);
-	}
+	session->transport = talloc_steal(session, transport);
 
 	session->smbXcli = smbXcli_session_create(session, transport->conn);
 	if (session->smbXcli == NULL) {
@@ -70,11 +66,54 @@ struct smb2_session *smb2_session_init(struct smb2_transport *transport,
 	return session;
 }
 
+/*
+ * Note: that the caller needs to keep 'transport' around as
+ *       long as the returned session is active!
+ */
+struct smb2_session *smb2_session_channel(struct smb2_transport *transport,
+					  struct gensec_settings *settings,
+					  TALLOC_CTX *parent_ctx,
+					  struct smb2_session *base_session)
+{
+	struct smb2_session *session;
+	NTSTATUS status;
+
+	session = talloc_zero(parent_ctx, struct smb2_session);
+	if (!session) {
+		return NULL;
+	}
+	session->transport = transport;
+
+	status = smb2cli_session_create_channel(session,
+						base_session->smbXcli,
+						transport->conn,
+						&session->smbXcli);
+	if (!NT_STATUS_IS_OK(status)) {
+		talloc_free(session);
+		return NULL;
+	}
+
+	session->needs_bind = true;
+
+	/* prepare a gensec context for later use */
+	status = gensec_client_start(session, &session->gensec,
+				     settings);
+	if (!NT_STATUS_IS_OK(status)) {
+		talloc_free(session);
+		return NULL;
+	}
+
+	gensec_want_feature(session->gensec, GENSEC_FEATURE_SESSION_KEY);
+
+	return session;
+}
+
 struct smb2_session_setup_spnego_state {
 	struct tevent_context *ev;
 	struct smb2_session *session;
 	struct cli_credentials *credentials;
 	uint64_t previous_session_id;
+	bool session_bind;
 	bool reauth;
 	NTSTATUS gensec_status;
 	DATA_BLOB in_secblob;
@@ -102,6 +141,7 @@ struct tevent_req *smb2_session_setup_spnego_send(
 	const DATA_BLOB *server_gss_blob;
 	DATA_BLOB negprot_secblob = data_blob_null;
 	uint32_t timeout_msec;
+	uint8_t in_flags = 0;
 
 	timeout_msec = session->transport->options.request_timeout * 1000;
 
@@ -116,10 +156,11 @@ struct tevent_req *smb2_session_setup_spnego_send(
 	state->previous_session_id = previous_session_id;
 
 	current_session_id = smb2cli_session_current_id(state->session->smbXcli);
-	if (current_session_id != 0) {
+	if (state->session->needs_bind) {
+		state->session_bind = true;
+	} else if (current_session_id != 0) {
 		state->reauth = true;
 	}
-
 	server_gss_blob = smbXcli_conn_server_gss_blob(session->transport->conn);
 	if (server_gss_blob) {
 		negprot_secblob = *server_gss_blob;
@@ -162,11 +203,15 @@ struct tevent_req *smb2_session_setup_spnego_send(
 	}
 	state->gensec_status = status;
 
+	if (state->session_bind) {
+		in_flags |= SMB2_SESSION_FLAG_BINDING;
+	}
+
 	subreq = smb2cli_session_setup_send(state, state->ev,
 					    session->transport->conn,
 					    timeout_msec,
 					    session->smbXcli,
-					    0, /* in_flags */
+					    in_flags,
 					    0, /* in_capabilities */
 					    0, /* in_channel */
 					    state->previous_session_id,
@@ -195,6 +240,7 @@ static void smb2_session_setup_spnego_done(struct tevent_req *subreq)
 	NTSTATUS status;
 	struct iovec *recv_iov;
 	uint32_t timeout_msec;
+	uint8_t in_flags = 0;
 
 	timeout_msec = session->transport->options.request_timeout * 1000;
 
@@ -250,22 +296,35 @@ static void smb2_session_setup_spnego_done(struct tevent_req *subreq)
 			return;
 		}
 
-		status = smb2cli_session_set_session_key(session->smbXcli,
-							 session_key,
-							 recv_iov);
-		if (tevent_req_nterror(req, status)) {
-			return;
+		if (state->session_bind) {
+			status = smb2cli_session_set_channel_key(session->smbXcli,
+								 session_key,
+								 recv_iov);
+			if (tevent_req_nterror(req, status)) {
+				return;
+			}
+			session->needs_bind = false;
+		} else {
+			status = smb2cli_session_set_session_key(session->smbXcli,
+								 session_key,
+								 recv_iov);
+			if (tevent_req_nterror(req, status)) {
+				return;
+			}
 		}
-
 		tevent_req_done(req);
 		return;
 	}
 
+	if (state->session_bind) {
+		in_flags |= SMB2_SESSION_FLAG_BINDING;
+	}
+
 	subreq = smb2cli_session_setup_send(state, state->ev,
 					    session->transport->conn,
 					    timeout_msec,
 					    session->smbXcli,
-					    0, /* in_flags */
+					    in_flags,
 					    0, /* in_capabilities */
 					    0, /* in_channel */
 					    state->previous_session_id,
diff --git a/source4/libcli/smb2/smb2.h b/source4/libcli/smb2/smb2.h
index 101ef73..73e117a 100644
--- a/source4/libcli/smb2/smb2.h
+++ b/source4/libcli/smb2/smb2.h
@@ -116,6 +116,7 @@ struct smb2_session {
 	struct smb2_transport *transport;
 	struct gensec_security *gensec;
 	struct smbXcli_session *smbXcli;
+	bool needs_bind;
 };
 
 
diff --git a/source4/torture/smb2/ioctl.c b/source4/torture/smb2/ioctl.c
index 3ccd1d0..053a7c8 100644
--- a/source4/torture/smb2/ioctl.c
+++ b/source4/torture/smb2/ioctl.c
@@ -25,6 +25,7 @@
 #include "libcli/smb2/smb2_calls.h"
 #include "torture/torture.h"
 #include "torture/smb2/proto.h"
+#include "../libcli/smb/smbXcli_base.h"
 #include "librpc/gen_ndr/ndr_ioctl.h"
 
 #define FNAME	"testfsctl.dat"
@@ -2413,6 +2414,49 @@ static bool test_ioctl_compress_perms(struct torture_context *torture,
 }
 
 /*
+   basic testing of the SMB2 FSCTL_QUERY_NETWORK_INTERFACE_INFO ioctl
+*/
+static bool test_ioctl_network_interface_info(struct torture_context *torture,
+				      struct smb2_tree *tree)
+{
+	union smb_ioctl ioctl;
+	struct smb2_handle fh;
+	NTSTATUS status;
+	TALLOC_CTX *tmp_ctx = talloc_new(tree);
+	struct fsctl_net_iface_info net_iface;
+	enum ndr_err_code ndr_ret;
+	uint32_t caps;
+
+	caps = smb2cli_conn_server_capabilities(tree->session->transport->conn);
+	if (!(caps & SMB2_CAP_MULTI_CHANNEL)) {
+		torture_skip(torture, "server doesn't support SMB2_CAP_MULTI_CHANNEL\n");
+	}
+
+	ZERO_STRUCT(ioctl);
+	ioctl.smb2.level = RAW_IOCTL_SMB2;
+	fh.data[0] = UINT64_MAX;
+	fh.data[1] = UINT64_MAX;
+	ioctl.smb2.in.file.handle = fh;
+	ioctl.smb2.in.function = FSCTL_QUERY_NETWORK_INTERFACE_INFO;
+	ioctl.smb2.in.max_response_size = 0x10000; /* Windows client sets this to 64KiB */
+	ioctl.smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
+
+	status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2);
+	torture_assert_ntstatus_ok(torture, status, "FSCTL_QUERY_NETWORK_INTERFACE_INFO");
+
+	ndr_ret = ndr_pull_struct_blob(&ioctl.smb2.out.out, tmp_ctx, &net_iface,
+			(ndr_pull_flags_fn_t)ndr_pull_fsctl_net_iface_info);
+	torture_assert_ndr_success(torture, ndr_ret,
+				   "ndr_pull_fsctl_net_iface_info");
+
+	ndr_print_debug((ndr_print_fn_t)ndr_print_fsctl_net_iface_info
+			, "Network Interface Info", &net_iface);
+
+	talloc_free(tmp_ctx);
+	return true;
+}
+
+/*
    basic testing of SMB2 ioctls
 */
 struct torture_suite *torture_smb2_ioctl_init(void)
@@ -2477,6 +2521,9 @@ struct torture_suite *torture_smb2_ioctl_init(void)
 				     test_ioctl_compress_set_file_attr);
 	torture_suite_add_1smb2_test(suite, "compress_perms",
 				     test_ioctl_compress_perms);
+	torture_suite_add_1smb2_test(suite, "network_interface_info",
+				     test_ioctl_network_interface_info);
+
 
 	suite->description = talloc_strdup(suite, "SMB2-IOCTL tests");
 
diff --git a/source4/torture/smb2/session.c b/source4/torture/smb2/session.c
index 2b90c3f..ee51d55 100644
--- a/source4/torture/smb2/session.c
+++ b/source4/torture/smb2/session.c
@@ -75,7 +75,7 @@ bool test_session_reconnect1(struct torture_context *tctx, struct smb2_tree *tre
 	union smb_fileinfo qfinfo;
 
 	/* Add some random component to the file name. */
-	snprintf(fname, 256, "session_reconnect_%s.dat",
+	snprintf(fname, sizeof(fname), "session_reconnect_%s.dat",
 		 generate_random_str(tctx, 8));


-- 
Samba Shared Repository


More information about the samba-cvs mailing list