Author: metze
Date: 2007-05-14 17:08:18 +0000 (Mon, 14 May 2007)
New Revision: 22858

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=22858

Log:
- let SMB2-LOCK-VALID-REQUEST pass against longhorn beta3
- add modify the SMB2-LOCK-BLOCK-WRITE test to also test reading
  and name in SMB2-LOCK-RW-EXCLUSIV
- add SMB2-LOCK-NONE and SMB2-LOCK-SHARED

metze
Modified:
   branches/SAMBA_4_0/source/libcli/raw/interfaces.h
   branches/SAMBA_4_0/source/torture/smb2/lock.c


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/raw/interfaces.h
===================================================================
--- branches/SAMBA_4_0/source/libcli/raw/interfaces.h   2007-05-14 16:04:24 UTC 
(rev 22857)
+++ branches/SAMBA_4_0/source/libcli/raw/interfaces.h   2007-05-14 17:08:18 UTC 
(rev 22858)
@@ -1889,11 +1889,12 @@
                        uint64_t offset;
                        uint64_t count;
                        uint32_t unknown5;
-#define SMB2_LOCK_FLAG_NONE    0x00000000
-#define SMB2_LOCK_FLAG_EXCLUSIV        0x00000002
-#define SMB2_LOCK_FLAG_UNLOCK  0x00000004
-#define SMB2_LOCK_FLAGS_MASK   0x00000006
-                       uint32_t flags; 
+#define SMB2_LOCK_FLAG_NONE            0x00000000
+#define SMB2_LOCK_FLAG_SHARED          0x00000001
+#define SMB2_LOCK_FLAG_EXCLUSIV                0x00000002
+#define SMB2_LOCK_FLAG_UNLOCK          0x00000004
+#define SMB2_LOCK_FLAG_NO_PENDING      0x00000010
+                       uint32_t flags;
                } in;
                struct {
                        /* static body buffer 4 (0x04) bytes */

Modified: branches/SAMBA_4_0/source/torture/smb2/lock.c
===================================================================
--- branches/SAMBA_4_0/source/torture/smb2/lock.c       2007-05-14 16:04:24 UTC 
(rev 22857)
+++ branches/SAMBA_4_0/source/torture/smb2/lock.c       2007-05-14 17:08:18 UTC 
(rev 22858)
@@ -93,7 +93,7 @@
        lck.in.offset           = UINT64_MAX;
        lck.in.count            = UINT64_MAX;
        lck.in.unknown5         = 0x00000000;
-       lck.in.flags            = SMB2_LOCK_FLAG_EXCLUSIV;
+       lck.in.flags            = 
SMB2_LOCK_FLAG_EXCLUSIV|SMB2_LOCK_FLAG_NO_PENDING;
        status = smb2_lock(tree, &lck);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(lck.out.unknown1, 0);
@@ -118,7 +118,7 @@
        lck.in.offset           = UINT32_MAX;
        lck.in.count            = UINT32_MAX;
        lck.in.unknown5         = 0x87654321;
-       lck.in.flags            = SMB2_LOCK_FLAG_EXCLUSIV;
+       lck.in.flags            = 
SMB2_LOCK_FLAG_EXCLUSIV|SMB2_LOCK_FLAG_NO_PENDING;
        status = smb2_lock(tree, &lck);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(lck.out.unknown1, 0);
@@ -163,8 +163,7 @@
        lck.in.unknown5         = 0x12345678;
        lck.in.flags            = SMB2_LOCK_FLAG_UNLOCK;
        status = smb2_lock(tree, &lck);
-       CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(lck.out.unknown1, 0);
+       CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED);
 
        lck.in.unknown1         = 0x0001;
        lck.in.unknown2         = 0x12345678;
@@ -174,19 +173,9 @@
        lck.in.unknown5         = 0x00000000;
        lck.in.flags            = SMB2_LOCK_FLAG_UNLOCK;
        status = smb2_lock(tree, &lck);
-       CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(lck.out.unknown1, 0);
+       CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED);
 
        status = smb2_lock(tree, &lck);
-       CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(lck.out.unknown1, 0);
-       status = smb2_lock(tree, &lck);
-       CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(lck.out.unknown1, 0);
-       status = smb2_lock(tree, &lck);
-       CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(lck.out.unknown1, 0);
-       status = smb2_lock(tree, &lck);
        CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED);
        status = smb2_lock(tree, &lck);
        CHECK_STATUS(status, NT_STATUS_RANGE_NOT_LOCKED);
@@ -197,7 +186,18 @@
        return ret;
 }
 
-static BOOL test_block_write(struct torture_context *torture, struct smb2_tree 
*tree)
+struct test_lock_read_write_state {
+       const char *fname;
+       uint32_t lock_flags;
+       NTSTATUS write_h1_status;
+       NTSTATUS read_h1_status;
+       NTSTATUS write_h2_status;
+       NTSTATUS read_h2_status;
+};
+
+static BOOL test_lock_read_write(struct torture_context *torture,
+                                struct smb2_tree *tree,
+                                struct test_lock_read_write_state *s)
 {
        BOOL ret = True;
        NTSTATUS status;
@@ -206,11 +206,11 @@
        struct smb2_lock lck;
        struct smb2_create cr;
        struct smb2_write wr;
-       const char *fname = "lock2.txt";
+       struct smb2_read rd;
 
        ZERO_STRUCT(buf);
 
-       status = torture_smb2_testfile(tree, fname, &h1);
+       status = torture_smb2_testfile(tree, s->fname, &h1);
        CHECK_STATUS(status, NT_STATUS_OK);
 
        status = smb2_util_write(tree, h1, buf, 0, ARRAY_SIZE(buf));
@@ -222,7 +222,7 @@
        lck.in.offset           = 0;
        lck.in.count            = ARRAY_SIZE(buf)/2;
        lck.in.unknown5         = 0x00000000;
-       lck.in.flags            = SMB2_LOCK_FLAG_EXCLUSIV;
+       lck.in.flags            = s->lock_flags;
        status = smb2_lock(tree, &lck);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(lck.out.unknown1, 0);
@@ -233,7 +233,7 @@
        lck.in.offset           = ARRAY_SIZE(buf)/2;
        lck.in.count            = ARRAY_SIZE(buf)/2;
        lck.in.unknown5         = 0x00000000;
-       lck.in.flags            = SMB2_LOCK_FLAG_EXCLUSIV;
+       lck.in.flags            = s->lock_flags;
        status = smb2_lock(tree, &lck);
        CHECK_STATUS(status, NT_STATUS_OK);
        CHECK_VALUE(lck.out.unknown1, 0);
@@ -248,30 +248,45 @@
                NTCREATEX_SHARE_ACCESS_READ|
                NTCREATEX_SHARE_ACCESS_WRITE;
        cr.in.create_options = 0;
-       cr.in.fname = fname;
+       cr.in.fname = s->fname;
 
        status = smb2_create(tree, tree, &cr);
        CHECK_STATUS(status, NT_STATUS_OK);
 
        h2 = cr.out.file.handle;
 
-
        ZERO_STRUCT(wr);
        wr.in.file.handle = h1;
        wr.in.offset      = ARRAY_SIZE(buf)/2;
        wr.in.data        = data_blob_const(buf, ARRAY_SIZE(buf)/2);
 
        status = smb2_write(tree, &wr);
-       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_STATUS(status, s->write_h1_status);
 
+       ZERO_STRUCT(rd);
+       rd.in.file.handle = h1;
+       rd.in.offset      = ARRAY_SIZE(buf)/2;
+       rd.in.length      = ARRAY_SIZE(buf)/2;
+
+       status = smb2_read(tree, tree, &rd);
+       CHECK_STATUS(status, s->read_h1_status);
+
        ZERO_STRUCT(wr);
        wr.in.file.handle = h2;
        wr.in.offset      = ARRAY_SIZE(buf)/2;
        wr.in.data        = data_blob_const(buf, ARRAY_SIZE(buf)/2);
 
        status = smb2_write(tree, &wr);
-       CHECK_STATUS(status, NT_STATUS_FILE_LOCK_CONFLICT);
+       CHECK_STATUS(status, s->write_h2_status);
 
+       ZERO_STRUCT(rd);
+       rd.in.file.handle = h2;
+       rd.in.offset      = ARRAY_SIZE(buf)/2;
+       rd.in.length      = ARRAY_SIZE(buf)/2;
+
+       status = smb2_read(tree, tree, &rd);
+       CHECK_STATUS(status, s->read_h2_status);
+
        lck.in.unknown1         = 0x0001;
        lck.in.unknown2         = 0x00000000;
        lck.in.file.handle      = h1;
@@ -291,10 +306,60 @@
        status = smb2_write(tree, &wr);
        CHECK_STATUS(status, NT_STATUS_OK);
 
+       ZERO_STRUCT(rd);
+       rd.in.file.handle = h2;
+       rd.in.offset      = ARRAY_SIZE(buf)/2;
+       rd.in.length      = ARRAY_SIZE(buf)/2;
+
+       status = smb2_read(tree, tree, &rd);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
 done:
        return ret;
 }
 
+static BOOL test_lock_rw_none(struct torture_context *torture, struct 
smb2_tree *tree)
+{
+       struct test_lock_read_write_state s = {
+               .fname                  = "lock_rw_none.dat",
+               .lock_flags             = SMB2_LOCK_FLAG_NONE,
+               .write_h1_status        = NT_STATUS_FILE_LOCK_CONFLICT,
+               .read_h1_status         = NT_STATUS_OK,
+               .write_h2_status        = NT_STATUS_FILE_LOCK_CONFLICT,
+               .read_h2_status         = NT_STATUS_OK,
+       };
+
+       return test_lock_read_write(torture, tree, &s);
+}
+
+static BOOL test_lock_rw_shared(struct torture_context *torture, struct 
smb2_tree *tree)
+{
+       struct test_lock_read_write_state s = {
+               .fname                  = "lock_rw_shared.dat",
+               .lock_flags             = SMB2_LOCK_FLAG_SHARED,
+               .write_h1_status        = NT_STATUS_FILE_LOCK_CONFLICT,
+               .read_h1_status         = NT_STATUS_OK,
+               .write_h2_status        = NT_STATUS_FILE_LOCK_CONFLICT,
+               .read_h2_status         = NT_STATUS_OK,
+       };
+
+       return test_lock_read_write(torture, tree, &s);
+}
+
+static BOOL test_lock_rw_exclusiv(struct torture_context *torture, struct 
smb2_tree *tree)
+{
+       struct test_lock_read_write_state s = {
+               .fname                  = "lock_rw_exclusiv.dat",
+               .lock_flags             = SMB2_LOCK_FLAG_EXCLUSIV,
+               .write_h1_status        = NT_STATUS_OK,
+               .read_h1_status         = NT_STATUS_OK,
+               .write_h2_status        = NT_STATUS_FILE_LOCK_CONFLICT,
+               .read_h2_status         = NT_STATUS_FILE_LOCK_CONFLICT,
+       };
+
+       return test_lock_read_write(torture, tree, &s);
+}
+
 /* basic testing of SMB2 locking
 */
 struct torture_suite *torture_smb2_lock_init(void)
@@ -302,7 +367,9 @@
        struct torture_suite *suite = 
torture_suite_create(talloc_autofree_context(), "LOCK");
 
        torture_suite_add_1smb2_test(suite, "VALID-REQUEST", 
test_valid_request);
-       torture_suite_add_1smb2_test(suite, "BLOCK-WRITE", test_block_write);
+       torture_suite_add_1smb2_test(suite, "RW-NONE", test_lock_rw_none);
+       torture_suite_add_1smb2_test(suite, "RW-SHARED", test_lock_rw_shared);
+       torture_suite_add_1smb2_test(suite, "RW-EXCLUSIV", 
test_lock_rw_exclusiv);
 
        suite->description = talloc_strdup(suite, "SMB2-LOCK tests");
 

Reply via email to