- cope with servers that don't properly implement SMBexit
authorAndrew Tridgell <tridge@samba.org>
Wed, 13 Aug 2003 02:04:44 +0000 (02:04 +0000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 13 Aug 2003 02:04:44 +0000 (02:04 +0000)
- add the pidhigh test to the locking test

- expand the rename and unlink testing

- test a wider range of offsets in RAW-READ
(This used to be commit ef819249ec9849b4609f82a5c882e40c96a51fa2)

source4/torture/raw/lock.c
source4/torture/raw/read.c
source4/torture/raw/setfileinfo.c
source4/torture/raw/unlink.c
source4/torture/raw/write.c

index b0b0b56451e79a993d4a67fecff1c38ba836888a..56dc1ec163f28aa42e3be9c27e01e2d61c59a3f2 100644 (file)
@@ -133,6 +133,7 @@ static BOOL test_lock(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_STATUS(status, NT_STATUS_OK);
 
 done:
+       cli_close(cli, fnum);
        smb_raw_exit(cli->session);
        cli_deltree(cli, BASEDIR);
        return ret;
@@ -181,6 +182,90 @@ static BOOL test_lockx(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_STATUS(status, NT_STATUS_OK);
 
 done:
+       cli_close(cli, fnum);
+       smb_raw_exit(cli->session);
+       cli_deltree(cli, BASEDIR);
+       return ret;
+}
+
+
+/*
+  test high pid
+*/
+static BOOL test_pidhigh(struct cli_state *cli, TALLOC_CTX *mem_ctx)
+{
+       union smb_lock io;
+       struct smb_lock_entry lock[1];
+       NTSTATUS status;
+       BOOL ret = True;
+       int fnum;
+       const char *fname = BASEDIR "\\test.txt";
+       char c = 1;
+
+       if (cli_deltree(cli, BASEDIR) == -1 ||
+           !cli_mkdir(cli, BASEDIR)) {
+               printf("Unable to setup %s - %s\n", BASEDIR, cli_errstr(cli));
+               return False;
+       }
+
+       printf("Testing high pid\n");
+       io.generic.level = RAW_LOCK_LOCKX;
+
+       cli->session->pid = 1;
+       
+       fnum = cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE);
+       if (fnum == -1) {
+               printf("Failed to create %s - %s\n", fname, cli_errstr(cli));
+               ret = False;
+               goto done;
+       }
+
+       if (cli_write(cli, fnum, 0, &c, 0, 1) != 1) {
+               printf("Failed to write 1 byte - %s\n", cli_errstr(cli));
+               ret = False;
+               goto done;
+       }
+
+       io.lockx.level = RAW_LOCK_LOCKX;
+       io.lockx.in.fnum = fnum;
+       io.lockx.in.mode = LOCKING_ANDX_LARGE_FILES;
+       io.lockx.in.timeout = 0;
+       io.lockx.in.ulock_cnt = 0;
+       io.lockx.in.lock_cnt = 1;
+       lock[0].pid = cli->session->pid;
+       lock[0].offset = 0;
+       lock[0].count = 0xFFFFFFFF;
+       io.lockx.in.locks = &lock[0];
+       status = smb_raw_lock(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       if (cli_read(cli, fnum, &c, 0, 1) != 1) {
+               printf("Failed to read 1 byte - %s\n", cli_errstr(cli));
+               ret = False;
+               goto done;
+       }
+
+       cli->session->pid |= 0x10000;
+
+       cli->session->pid = 2;
+
+       if (cli_read(cli, fnum, &c, 0, 1) == 1) {
+               printf("pid is incorrect handled for read with lock!\n");
+               ret = False;
+               goto done;
+       }
+
+       cli->session->pid = 0x10001;
+
+       if (cli_read(cli, fnum, &c, 0, 1) != 1) {
+               printf("High pid is used on this server!\n");
+               ret = False;
+       } else {
+               printf("High pid is not used on this server (correct)\n");
+       }
+
+done:
+       cli_close(cli, fnum);
        smb_raw_exit(cli->session);
        cli_deltree(cli, BASEDIR);
        return ret;
@@ -210,6 +295,10 @@ BOOL torture_raw_lock(int dummy)
                ret = False;
        }
 
+       if (!test_pidhigh(cli, mem_ctx)) {
+               ret = False;
+       }
+
        torture_close_connection(cli);
        talloc_destroy(mem_ctx);
        return ret;
index c231f52c9d06d962b772c498d6f02a692b6fc79f..50b3e0f2fbe33bfcbcee946d0df70462846d7adc 100644 (file)
@@ -192,6 +192,7 @@ static BOOL test_read(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        
 
 done:
+       cli_close(cli, fnum);
        smb_raw_exit(cli->session);
        cli_deltree(cli, BASEDIR);
        return ret;
index c169895020356f3bdfc70e97cb13f5bf395c7b73..0048f2e1b0cb35dadb713aa39b0c217d41c657aa 100644 (file)
@@ -31,7 +31,7 @@ BOOL torture_raw_sfileinfo(int dummy)
        struct cli_state *cli;
        BOOL ret = True;
        TALLOC_CTX *mem_ctx;
-       int fnum = -1;
+       int fnum_saved, fnum2, fnum = -1;
        char *fnum_fname;
        char *fnum_fname_new;
        char *path_fname;
@@ -406,7 +406,7 @@ BOOL torture_raw_sfileinfo(int dummy)
 
        CHECK_CALL_PATH(MODE_INFORMATION, NT_STATUS_OK);
        CHECK_VALUE(MODE_INFORMATION, mode_information, mode, 0);
-
+#if 1
        printf("finally the rename_information level\n");
        cli_close(cli, create_complex_file(cli, mem_ctx, fnum_fname_new));
        cli_close(cli, create_complex_file(cli, mem_ctx, path_fname_new));
@@ -424,7 +424,46 @@ BOOL torture_raw_sfileinfo(int dummy)
        CHECK_CALL_FNUM(RENAME_INFORMATION, NT_STATUS_OK);
        CHECK_STR(NAME_INFO, name_info, fname.s, fnum_fname_new);
 
+       printf("Trying rename with dest file open\n");
+       fnum2 = create_complex_file(cli, mem_ctx, fnum_fname);
+       sfinfo.rename_information.in.new_name  = fnum_fname+strlen(BASEDIR)+1;
+       sfinfo.rename_information.in.overwrite = 1;
+       CHECK_CALL_FNUM(RENAME_INFORMATION, NT_STATUS_ACCESS_DENIED);
+       CHECK_STR(NAME_INFO, name_info, fname.s, fnum_fname_new);
+
+       fnum_saved = fnum;
+       fnum = fnum2;
+       sfinfo.disposition_info.in.delete_on_close = 1;
+       CHECK_CALL_FNUM(DISPOSITION_INFO, NT_STATUS_OK);
+       fnum = fnum_saved;
+
+       printf("Trying rename with dest file open and delete_on_close\n");
+       CHECK_CALL_FNUM(RENAME_INFORMATION, NT_STATUS_ACCESS_DENIED);
+
+       cli_close(cli, fnum2);
+       CHECK_CALL_FNUM(RENAME_INFORMATION, NT_STATUS_OK);
+       CHECK_STR(NAME_INFO, name_info, fname.s, fnum_fname);
+
+       printf("Trying rename with source file open twice\n");
+       sfinfo.rename_information.in.new_name  = fnum_fname+strlen(BASEDIR)+1;
+       sfinfo.rename_information.in.overwrite = 1;
+       CHECK_CALL_FNUM(RENAME_INFORMATION, NT_STATUS_OK);
+       CHECK_STR(NAME_INFO, name_info, fname.s, fnum_fname);
+
+       fnum2 = create_complex_file(cli, mem_ctx, fnum_fname);
+       sfinfo.rename_information.in.new_name  = fnum_fname_new+strlen(BASEDIR)+1;
+       sfinfo.rename_information.in.overwrite = 0;
+       CHECK_CALL_FNUM(RENAME_INFORMATION, NT_STATUS_OK);
+       CHECK_STR(NAME_INFO, name_info, fname.s, fnum_fname_new);
+       cli_close(cli, fnum2);
+
+       sfinfo.rename_information.in.new_name  = fnum_fname+strlen(BASEDIR)+1;
+       sfinfo.rename_information.in.overwrite = 0;
+       CHECK_CALL_FNUM(RENAME_INFORMATION, NT_STATUS_OK);
+       CHECK_STR(NAME_INFO, name_info, fname.s, fnum_fname);
+
        sfinfo.rename_information.in.new_name  = path_fname_new+strlen(BASEDIR)+1;
+       sfinfo.rename_information.in.overwrite = 1;
        CHECK_CALL_PATH(RENAME_INFORMATION, NT_STATUS_OK);
        CHECK_STR(NAME_INFO, name_info, fname.s, path_fname_new);
 
@@ -435,6 +474,7 @@ BOOL torture_raw_sfileinfo(int dummy)
        sfinfo.rename_information.in.new_name  = path_fname+strlen(BASEDIR)+1;
        CHECK_CALL_PATH(RENAME_INFORMATION, NT_STATUS_OK);
        CHECK_STR(NAME_INFO, name_info, fname.s, path_fname);
+#endif
 
 #if 0
        printf("test unix_basic level\n");
index 9cae91fe418a5581b6f9b8e67eaebd2050e30e3f..889e25777c21254d3f77e97327709bc5b4745487 100644 (file)
@@ -90,6 +90,16 @@ static BOOL test_unlink(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        status = smb_raw_unlink(cli->tree, &io);
        CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
 
+       io.in.pattern = "\\..";
+       io.in.attrib = 0;
+       status = smb_raw_unlink(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
+
+       io.in.pattern = BASEDIR "\\..";
+       io.in.attrib = 0;
+       status = smb_raw_unlink(cli->tree, &io);
+       CHECK_STATUS(status, NT_STATUS_FILE_IS_A_DIRECTORY);
+
        printf("Trying wildcards\n");
        cli_close(cli, cli_open(cli, fname, O_RDWR|O_CREAT, DENY_NONE));
        io.in.pattern = BASEDIR "\\t*.t";
index 117b3225308b3511f2b498f74a721e8473538fd3..644a5579c8eb9091267e08d9d67160c3029b4eb9 100644 (file)
@@ -198,6 +198,7 @@ static BOOL test_write(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_BUFFER(buf, seed, 4000);
 
 done:
+       cli_close(cli, fnum);
        smb_raw_exit(cli->session);
        cli_deltree(cli, BASEDIR);
        return ret;
@@ -212,7 +213,7 @@ static BOOL test_writex(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        union smb_write io;
        NTSTATUS status;
        BOOL ret = True;
-       int fnum;
+       int fnum, i;
        char *buf;
        const int maxsize = 90000;
        const char *fname = BASEDIR "\\test.txt";
@@ -346,29 +347,32 @@ static BOOL test_writex(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        }
        CHECK_BUFFER(buf, seed, 4000);
 
-       printf("Trying 2^43 offset\n");
-       setup_buffer(buf, seed+1, maxsize);
-       io.writex.in.fnum = fnum;
-       io.writex.in.count = 4000;
-       io.writex.in.offset = ((SMB_BIG_UINT)1) << 43;
-       io.writex.in.data = buf;
-       status = smb_raw_write(cli->tree, &io);
-       CHECK_STATUS(status, NT_STATUS_OK);
-       CHECK_VALUE(io.writex.out.nwritten, 4000);
-       CHECK_ALL_INFO(io.writex.in.count + (SMB_BIG_UINT)io.writex.in.offset, size);
-
-       memset(buf, 0, maxsize);
-       if (cli_read(cli, fnum, buf, io.writex.in.offset, 4000) != 4000) {
-               printf("read failed at %d\n", __LINE__);
-               ret = False;
-               goto done;
+       for (i=33;i<64;i++) {
+               printf("Trying 2^%d offset\n", i);
+               setup_buffer(buf, seed+1, maxsize);
+               io.writex.in.fnum = fnum;
+               io.writex.in.count = 4000;
+               io.writex.in.offset = ((SMB_BIG_UINT)1) << i;
+               io.writex.in.data = buf;
+               status = smb_raw_write(cli->tree, &io);
+               CHECK_STATUS(status, NT_STATUS_OK);
+               CHECK_VALUE(io.writex.out.nwritten, 4000);
+               CHECK_ALL_INFO(io.writex.in.count + (SMB_BIG_UINT)io.writex.in.offset, size);
+
+               memset(buf, 0, maxsize);
+               if (cli_read(cli, fnum, buf, io.writex.in.offset, 4000) != 4000) {
+                       printf("read failed at %d\n", __LINE__);
+                       ret = False;
+                       goto done;
+               }
+               CHECK_BUFFER(buf, seed+1, 4000);
        }
-       CHECK_BUFFER(buf, seed+1, 4000);
 
 
        setup_buffer(buf, seed, maxsize);
 
 done:
+       cli_close(cli, fnum);
        smb_raw_exit(cli->session);
        cli_deltree(cli, BASEDIR);
        return ret;
@@ -507,6 +511,7 @@ static BOOL test_writeunlock(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_BUFFER(buf, seed, 4000);
 
 done:
+       cli_close(cli, fnum);
        smb_raw_exit(cli->session);
        cli_deltree(cli, BASEDIR);
        return ret;
@@ -659,6 +664,7 @@ static BOOL test_writeclose(struct cli_state *cli, TALLOC_CTX *mem_ctx)
        CHECK_BUFFER(buf, seed, 4000);
 
 done:
+       cli_close(cli, fnum);
        smb_raw_exit(cli->session);
        cli_deltree(cli, BASEDIR);
        return ret;