root/source4/torture/smb2/connect.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. torture_smb2_close
  2. torture_smb2_write
  3. torture_smb2_createfile
  4. torture_smb2_connect

   1 /* 
   2    Unix SMB/CIFS implementation.
   3 
   4    test suite for SMB2 connection operations
   5 
   6    Copyright (C) Andrew Tridgell 2005
   7    
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "librpc/gen_ndr/security.h"
  24 #include "libcli/smb2/smb2.h"
  25 #include "libcli/smb2/smb2_calls.h"
  26 #include "torture/torture.h"
  27 #include "torture/smb2/proto.h"
  28 
  29 /*
  30   send a close
  31 */
  32 static NTSTATUS torture_smb2_close(struct smb2_tree *tree, struct smb2_handle handle)
     /* [<][>][^][v][top][bottom][index][help] */
  33 {
  34         struct smb2_close io;
  35         NTSTATUS status;
  36         TALLOC_CTX *tmp_ctx = talloc_new(tree);
  37 
  38         ZERO_STRUCT(io);
  39         io.in.file.handle       = handle;
  40         io.in.flags             = SMB2_CLOSE_FLAGS_FULL_INFORMATION;
  41         status = smb2_close(tree, &io);
  42         if (!NT_STATUS_IS_OK(status)) {
  43                 printf("close failed - %s\n", nt_errstr(status));
  44                 return status;
  45         }
  46 
  47         if (DEBUGLVL(1)) {
  48                 printf("Close gave:\n");
  49                 printf("create_time     = %s\n", nt_time_string(tmp_ctx, io.out.create_time));
  50                 printf("access_time     = %s\n", nt_time_string(tmp_ctx, io.out.access_time));
  51                 printf("write_time      = %s\n", nt_time_string(tmp_ctx, io.out.write_time));
  52                 printf("change_time     = %s\n", nt_time_string(tmp_ctx, io.out.change_time));
  53                 printf("alloc_size      = %lld\n", (long long)io.out.alloc_size);
  54                 printf("size            = %lld\n", (long long)io.out.size);
  55                 printf("file_attr       = 0x%x\n", io.out.file_attr);
  56         }
  57 
  58         talloc_free(tmp_ctx);
  59         
  60         return status;
  61 }
  62 
  63 
  64 /*
  65   test writing
  66 */
  67 static NTSTATUS torture_smb2_write(struct torture_context *tctx, struct smb2_tree *tree, struct smb2_handle handle)
     /* [<][>][^][v][top][bottom][index][help] */
  68 {
  69         struct smb2_write w;
  70         struct smb2_read r;
  71         struct smb2_flush f;
  72         NTSTATUS status;
  73         DATA_BLOB data;
  74         int i;
  75         
  76         if (torture_setting_bool(tctx, "dangerous", false)) {
  77                 data = data_blob_talloc(tree, NULL, 160000);
  78         } else if (torture_setting_bool(tctx, "samba4", false)) {
  79                 data = data_blob_talloc(tree, NULL, UINT16_MAX);
  80         } else {
  81                 data = data_blob_talloc(tree, NULL, 120000);
  82         }
  83         for (i=0;i<data.length;i++) {
  84                 data.data[i] = i;
  85         }
  86 
  87         ZERO_STRUCT(w);
  88         w.in.file.handle = handle;
  89         w.in.offset      = 0;
  90         w.in.data        = data;
  91 
  92         status = smb2_write(tree, &w);
  93         if (!NT_STATUS_IS_OK(status)) {
  94                 printf("write failed - %s\n", nt_errstr(status));
  95                 return status;
  96         }
  97 
  98         torture_smb2_all_info(tree, handle);
  99 
 100         status = smb2_write(tree, &w);
 101         if (!NT_STATUS_IS_OK(status)) {
 102                 printf("write failed - %s\n", nt_errstr(status));
 103                 return status;
 104         }
 105 
 106         torture_smb2_all_info(tree, handle);
 107 
 108         ZERO_STRUCT(f);
 109         f.in.file.handle = handle;
 110 
 111         status = smb2_flush(tree, &f);
 112         if (!NT_STATUS_IS_OK(status)) {
 113                 printf("flush failed - %s\n", nt_errstr(status));
 114                 return status;
 115         }
 116 
 117         ZERO_STRUCT(r);
 118         r.in.file.handle = handle;
 119         r.in.length      = data.length;
 120         r.in.offset      = 0;
 121 
 122         status = smb2_read(tree, tree, &r);
 123         if (!NT_STATUS_IS_OK(status)) {
 124                 printf("read failed - %s\n", nt_errstr(status));
 125                 return status;
 126         }
 127 
 128         if (data.length != r.out.data.length ||
 129             memcmp(data.data, r.out.data.data, data.length) != 0) {
 130                 printf("read data mismatch\n");
 131                 return NT_STATUS_NET_WRITE_FAULT;
 132         }
 133 
 134         return status;
 135 }
 136 
 137 
 138 /*
 139   send a create
 140 */
 141 static struct smb2_handle torture_smb2_createfile(struct smb2_tree *tree, 
     /* [<][>][^][v][top][bottom][index][help] */
 142                                               const char *fname)
 143 {
 144         struct smb2_create io;
 145         NTSTATUS status;
 146         TALLOC_CTX *tmp_ctx = talloc_new(tree);
 147 
 148         ZERO_STRUCT(io);
 149         io.in.oplock_level = 0;
 150         io.in.desired_access = SEC_RIGHTS_FILE_ALL;
 151         io.in.file_attributes   = FILE_ATTRIBUTE_NORMAL;
 152         io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
 153         io.in.share_access = 
 154                 NTCREATEX_SHARE_ACCESS_DELETE|
 155                 NTCREATEX_SHARE_ACCESS_READ|
 156                 NTCREATEX_SHARE_ACCESS_WRITE;
 157         io.in.create_options = NTCREATEX_OPTIONS_WRITE_THROUGH;
 158         io.in.fname = fname;
 159 
 160         status = smb2_create(tree, tmp_ctx, &io);
 161         if (!NT_STATUS_IS_OK(status)) {
 162                 printf("create1 failed - %s\n", nt_errstr(status));
 163                 return io.out.file.handle;
 164         }
 165 
 166         if (DEBUGLVL(1)) {
 167                 printf("Open gave:\n");
 168                 printf("oplock_flags    = 0x%x\n", io.out.oplock_level);
 169                 printf("create_action   = 0x%x\n", io.out.create_action);
 170                 printf("create_time     = %s\n", nt_time_string(tmp_ctx, io.out.create_time));
 171                 printf("access_time     = %s\n", nt_time_string(tmp_ctx, io.out.access_time));
 172                 printf("write_time      = %s\n", nt_time_string(tmp_ctx, io.out.write_time));
 173                 printf("change_time     = %s\n", nt_time_string(tmp_ctx, io.out.change_time));
 174                 printf("alloc_size      = %lld\n", (long long)io.out.alloc_size);
 175                 printf("size            = %lld\n", (long long)io.out.size);
 176                 printf("file_attr       = 0x%x\n", io.out.file_attr);
 177                 printf("handle          = %016llx%016llx\n", 
 178                        (long long)io.out.file.handle.data[0], 
 179                        (long long)io.out.file.handle.data[1]);
 180         }
 181 
 182         talloc_free(tmp_ctx);
 183         
 184         return io.out.file.handle;
 185 }
 186 
 187 
 188 /* 
 189    basic testing of SMB2 connection calls
 190 */
 191 bool torture_smb2_connect(struct torture_context *torture)
     /* [<][>][^][v][top][bottom][index][help] */
 192 {
 193         TALLOC_CTX *mem_ctx = talloc_new(NULL);
 194         struct smb2_tree *tree;
 195         struct smb2_request *req;
 196         struct smb2_handle h1, h2;
 197         NTSTATUS status;
 198 
 199         if (!torture_smb2_connection(torture, &tree)) {
 200                 return false;
 201         }
 202 
 203         h1 = torture_smb2_createfile(tree, "test9.dat");
 204         h2 = torture_smb2_createfile(tree, "test9.dat");
 205         status = torture_smb2_write(torture, tree, h1);
 206         if (!NT_STATUS_IS_OK(status)) {
 207                 printf("Write failed - %s\n", nt_errstr(status));
 208                 return false;
 209         }
 210         status = torture_smb2_close(tree, h1);
 211         if (!NT_STATUS_IS_OK(status)) {
 212                 printf("Close failed - %s\n", nt_errstr(status));
 213                 return false;
 214         }
 215         status = torture_smb2_close(tree, h2);
 216         if (!NT_STATUS_IS_OK(status)) {
 217                 printf("Close failed - %s\n", nt_errstr(status));
 218                 return false;
 219         }
 220 
 221         status = smb2_util_close(tree, h1);
 222         if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_CLOSED)) {
 223                 printf("close should have closed the handle - %s\n", nt_errstr(status));
 224                 return false;
 225         }
 226 
 227         status = smb2_tdis(tree);
 228         if (!NT_STATUS_IS_OK(status)) {
 229                 printf("tdis failed - %s\n", nt_errstr(status));
 230                 return false;
 231         }
 232 
 233         status = smb2_tdis(tree);
 234         if (!NT_STATUS_EQUAL(status, NT_STATUS_NETWORK_NAME_DELETED)) {
 235                 printf("tdis should have disabled session - %s\n", nt_errstr(status));
 236                 return false;
 237         }
 238 
 239         status = smb2_logoff(tree->session);
 240         if (!NT_STATUS_IS_OK(status)) {
 241                 printf("Logoff failed - %s\n", nt_errstr(status));
 242                 return false;
 243         }
 244 
 245         req = smb2_logoff_send(tree->session);
 246         if (!req) {
 247                 printf("smb2_logoff_send() failed\n");
 248                 return false;
 249         }
 250 
 251         req->session = NULL;
 252 
 253         status = smb2_logoff_recv(req);
 254         if (!NT_STATUS_EQUAL(status, NT_STATUS_USER_SESSION_DELETED)) {
 255                 printf("Logoff should have disabled session - %s\n", nt_errstr(status));
 256                 return false;
 257         }
 258 
 259         status = smb2_keepalive(tree->session->transport);
 260         if (!NT_STATUS_IS_OK(status)) {
 261                 printf("keepalive failed? - %s\n", nt_errstr(status));
 262                 return false;
 263         }
 264 
 265         talloc_free(mem_ctx);
 266 
 267         return true;
 268 }

/* [<][>][^][v][top][bottom][index][help] */