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 <[email protected]>
Date:   Fri May 23 12:40:31 2014 +0200

    s3:smbd: remove unused client_get_tcp_info()
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    
    Autobuild-User(master): Stefan Metzmacher <[email protected]>
    Autobuild-Date(master): Thu Jul 24 21:32:17 CEST 2014 on sn-devel-104

commit 7ca5e83cad61a246aee6e415d604a97aa8729739
Author: Stefan Metzmacher <[email protected]>
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 <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>

commit 017db6d0f893a4169627c4e182ab84f4a6adb533
Author: Anubhav Rakshit <[email protected]>
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 <[email protected]>
    Signed-off-by: Anubhav Rakshit <[email protected]>
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>

commit 09fb44d1224bedee1f7a92d2bca1518ad62b3ba4
Author: Anubhav Rakshit <[email protected]>
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 <[email protected]>
    Signed-off-by: Anubhav Rakshit <[email protected]>
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>

commit dbc1ad2965b7535bb5b41a994d7188dc23d18770
Author: Volker Lendecke <[email protected]>
Date:   Wed Jul 23 11:37:28 2014 +0000

    torture4: Use sizeof(char-array) instead of constant
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 1250d62f696b7209d605f51e7b047ea1e2ea7dc6
Author: Stefan Metzmacher <[email protected]>
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 <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>

commit 720189f246c33c763882731e626c5b0fe558d0f9
Author: Stefan Metzmacher <[email protected]>
Date:   Tue Jun 24 00:22:30 2014 +0200

    s4:libcli/smb2: add smb2_session_channel()
    
    Signed-off-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>

commit 78e46d7349b5839993c001a5afc2060a48244d15
Author: Stefan Metzmacher <[email protected]>
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 <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>

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

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

Reply via email to