expanded the SMB2-CREATE and RAW-OPEN tests to explore more of how the
authorAndrew Tridgell <tridge@samba.org>
Thu, 14 Aug 2008 07:26:30 +0000 (17:26 +1000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 14 Aug 2008 07:26:30 +0000 (17:26 +1000)
create options fields are supposed to work

source/torture/raw/open.c
source/torture/smb2/create.c

index b6979fa0d9868d6320abbe6c34ab00b11902e5a5..39ff443ccdd93217ed36559409fac26633988104 100644 (file)
@@ -844,6 +844,7 @@ static bool test_nttrans_create(struct smbcli_state *cli, struct torture_context
        int fnum = -1;
        bool ret = true;
        int i;
+       uint32_t ok_mask, not_supported_mask, invalid_parameter_mask;
        struct {
                uint32_t open_disp;
                bool with_file;
@@ -982,6 +983,10 @@ static bool test_nttrans_create(struct smbcli_state *cli, struct torture_context
                }
                io.ntcreatex.in.create_options = create_option;
                status = smb_raw_open(cli->tree, tctx, &io);
+               if (!NT_STATUS_IS_OK(status)) {
+                       printf("ntcreatex create option 0x%08x gave %s - should give NT_STATUS_OK\n",
+                              create_option, nt_errstr(status));
+               }
                CHECK_STATUS(status, NT_STATUS_OK);
                fnum = io.ntcreatex.out.file.fnum;
 
@@ -999,6 +1004,36 @@ static bool test_nttrans_create(struct smbcli_state *cli, struct torture_context
                smbcli_close(cli->tree, fnum);
        }
 
+       ok_mask = not_supported_mask = invalid_parameter_mask = 0;
+
+       io.ntcreatex.in.file_attr = 0;
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+       io.ntcreatex.in.access_mask     = SEC_FLAG_MAXIMUM_ALLOWED;
+
+       /* Check for options that should return NOT_SUPPORTED, OK or INVALID_PARAMETER */
+       for (i=0; i < 32; i++) {
+               uint32_t create_option = 1<<i;
+               if (create_option & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) {
+                       continue;
+               }
+               io.ntcreatex.in.create_options = create_option;
+               status = smb_raw_open(cli->tree, tctx, &io);
+               if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
+                       not_supported_mask |= create_option;
+               } else if (NT_STATUS_EQUAL(status, NT_STATUS_OK)) {
+                       ok_mask |= create_option;
+                       smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);
+               } else if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {
+                       invalid_parameter_mask |= create_option;
+               } else {
+                       printf("create option 0x%08x returned %s\n", create_option, nt_errstr(status));
+               }
+       }
+
+       CHECK_VAL(ok_mask,                0x00efcfce);
+       CHECK_VAL(not_supported_mask,     0x00002000);
+       CHECK_VAL(invalid_parameter_mask, 0xff100030);
+
        smbcli_unlink(cli->tree, fname);
 
 
index c23ff8b8ce96c103f7c712fc3bfc8c936682785c..744c5d2b6c63ff5539fdebfb453c6b9355620729 100644 (file)
@@ -53,6 +53,7 @@ static bool test_create_gentest(struct torture_context *torture, struct smb2_tre
        NTSTATUS status;
        TALLOC_CTX *tmp_ctx = talloc_new(tree);
        uint32_t access_mask, file_attributes, file_attributes_set, denied_mask;
+       uint32_t ok_mask, not_supported_mask, invalid_parameter_mask;
        union smb_fileinfo q;
 
        ZERO_STRUCT(io);
@@ -76,14 +77,6 @@ static bool test_create_gentest(struct torture_context *torture, struct smb2_tre
        status = smb2_create(tree, tmp_ctx, &io);
        CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
 
-       io.in.create_options = 0x00100000;
-       status = smb2_create(tree, tmp_ctx, &io);
-       CHECK_STATUS(status, NT_STATUS_NOT_SUPPORTED);
-
-       io.in.create_options = 0xF0100000;
-       status = smb2_create(tree, tmp_ctx, &io);
-       CHECK_STATUS(status, NT_STATUS_NOT_SUPPORTED);
-
        io.in.create_options = 0;
 
        io.in.file_attributes = FILE_ATTRIBUTE_DEVICE;
@@ -108,6 +101,37 @@ static bool test_create_gentest(struct torture_context *torture, struct smb2_tre
        status = smb2_create(tree, tmp_ctx, &io);
        CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
 
+       io.in.file_attributes = 0;
+       io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
+       io.in.desired_access     = SEC_FLAG_MAXIMUM_ALLOWED;
+       ok_mask = not_supported_mask = invalid_parameter_mask = 0;
+       {
+               int i;
+               for (i=0;i<32;i++) {
+                       io.in.create_options = 1<<i;
+                       if (io.in.create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) {
+                               continue;
+                       }
+                       status = smb2_create(tree, tmp_ctx, &io);
+                       if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
+                               not_supported_mask |= 1<<i;
+                       } else if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {
+                               invalid_parameter_mask |= 1<<i;
+                       } else if (NT_STATUS_EQUAL(status, NT_STATUS_OK)) {
+                               ok_mask |= 1<<i;
+                               status = smb2_util_close(tree, io.out.file.handle);
+                               CHECK_STATUS(status, NT_STATUS_OK);
+                       } else {
+                               printf("create option 0x%08x returned %s\n", 1<<i, nt_errstr(status));
+                       }
+               }
+       }
+       io.in.create_options = 0;
+
+       CHECK_EQUAL(ok_mask,                0x00efcf7e);
+       CHECK_EQUAL(not_supported_mask,     0x00102080);
+       CHECK_EQUAL(invalid_parameter_mask, 0xff000000);
+
        io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
        io.in.file_attributes = 0;
        access_mask = 0;