r741: Test from Volker in RAW-OPEN for truncating a file containing locks.
authorJeremy Allison <jra@samba.org>
Fri, 14 May 2004 22:07:43 +0000 (22:07 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:53:46 +0000 (12:53 -0500)
Also added the same ad-hoc test is LOCK7.
Jeremy.

source/torture/raw/open.c
source/torture/torture.c

index 7c575fbe9a9674675966e40d5b73dacb94f4b0d8..f559632f23e27831114081ecb6542967bd71d3ba 100644 (file)
@@ -740,6 +740,79 @@ done:
        return ret;
 }
 
+/*
+  test RAW_OPEN_NTCREATEX with an already opened and byte range locked file
+
+  I've got an application that does a similar sequence of ntcreate&x,
+  locking&x and another ntcreate&x with
+  open_disposition==NTCREATEX_DISP_OVERWRITE_IF. Windows 2003 allows the
+  second open.
+*/
+static BOOL test_ntcreatex_brlocked(struct cli_state *cli, TALLOC_CTX *mem_ctx)
+{
+       union smb_open io, io1;
+       union smb_lock io2;
+       struct smb_lock_entry lock[1];
+       const char *fname = BASEDIR "\\torture_ntcreatex.txt";
+       NTSTATUS status;
+       BOOL ret = True;
+
+       /* reasonable default parameters */
+       io.generic.level = RAW_OPEN_NTCREATEX;
+       io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
+       io.ntcreatex.in.root_fid = 0;
+       io.ntcreatex.in.access_mask = 0x2019f;
+       io.ntcreatex.in.alloc_size = 0;
+       io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+       io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ |
+               NTCREATEX_SHARE_ACCESS_WRITE;
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
+       io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE;
+       io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION;
+       io.ntcreatex.in.security_flags = NTCREATEX_SECURITY_DYNAMIC |
+               NTCREATEX_SECURITY_ALL;
+       io.ntcreatex.in.fname = fname;
+
+       status = smb_raw_open(cli->tree, mem_ctx, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       io2.lockx.level = RAW_LOCK_LOCKX;
+       io2.lockx.in.fnum = io.ntcreatex.out.fnum;
+       io2.lockx.in.mode = LOCKING_ANDX_LARGE_FILES;
+       io2.lockx.in.timeout = 0;
+       io2.lockx.in.ulock_cnt = 0;
+       io2.lockx.in.lock_cnt = 1;
+       lock[0].pid = cli->session->pid;
+       lock[0].offset = 0;
+       lock[0].count = 0x1;
+       io2.lockx.in.locks = &lock[0];
+       status = smb_raw_lock(cli->tree, &io2);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       io1.generic.level = RAW_OPEN_NTCREATEX;
+       io1.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
+       io1.ntcreatex.in.root_fid = 0;
+       io1.ntcreatex.in.access_mask = 0x20196;
+       io1.ntcreatex.in.alloc_size = 0;
+       io1.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+       io1.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ |
+               NTCREATEX_SHARE_ACCESS_WRITE;
+       io1.ntcreatex.in.open_disposition = NTCREATEX_DISP_OVERWRITE_IF;
+       io1.ntcreatex.in.create_options = 0;
+       io1.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION;
+       io1.ntcreatex.in.security_flags = NTCREATEX_SECURITY_DYNAMIC |
+               NTCREATEX_SECURITY_ALL;
+       io1.ntcreatex.in.fname = fname;
+
+       status = smb_raw_open(cli->tree, mem_ctx, &io1);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+ done:
+       cli_close(cli->tree, io.ntcreatex.out.fnum);
+       cli_close(cli->tree, io1.ntcreatex.out.fnum);
+       cli_unlink(cli->tree, fname);
+       return ret;
+}
 
 /*
   test RAW_OPEN_MKNEW
@@ -917,6 +990,10 @@ BOOL torture_raw_open(int dummy)
                return False;
        }
 
+       if (!test_ntcreatex_brlocked(cli, mem_ctx)) {
+               return False;
+       }
+
        if (!test_open(cli, mem_ctx)) {
                ret = False;
        }
index 09ab503274295a85cde09eb0566d05022c5861c2..78674990e87682e64847f402886ae4c5b4eab33f 100644 (file)
@@ -1489,6 +1489,8 @@ static BOOL run_locktest7(int dummy)
        struct cli_state *cli1;
        const char *fname = "\\lockt7.lck";
        int fnum1;
+       int fnum2;
+       size_t size;
        char buf[200];
        BOOL correct = False;
 
@@ -1603,11 +1605,38 @@ static BOOL run_locktest7(int dummy)
                goto fail;
        }
 
-       cli_unlock(cli1->tree, fnum1, 130, 0);
+       printf("Testing truncate of locked file.\n");
+
+       fnum2 = cli_open(cli1->tree, fname, O_RDWR|O_TRUNC, DENY_NONE);
+
+       if (fnum2 == -1) {
+               printf("Unable to truncate locked file.\n");
+               correct = False;
+               goto fail;
+       } else {
+               printf("Truncated locked file.\n");
+       }
+
+       if (NT_STATUS_IS_ERR(cli_getatr(cli1->tree, fname, NULL, &size, NULL))) {
+               printf("getatr failed (%s)\n", cli_errstr(cli1->tree));
+               correct = False;
+               goto fail;
+       }
+
+       if (size != 0) {
+               printf("Unable to truncate locked file. Size was %u\n", size);
+               correct = False;
+               goto fail;
+       }
+
+       cli1->session->pid = 1;
+
+       cli_unlock(cli1->tree, fnum1, 130, 4);
        correct = True;
 
 fail:
        cli_close(cli1->tree, fnum1);
+       cli_close(cli1->tree, fnum2);
        cli_unlink(cli1->tree, fname);
        torture_close_connection(cli1);
 
@@ -3225,7 +3254,9 @@ error_test60:
        }
 
        printf("non-io open test #7 passed.\n");
+
 error_test70:
+
        cli_unlink(cli1->tree, fname);
 
        if (!torture_close_connection(cli1)) {