s3-torture: run_oplock2(): replace cli_read_old() with cli_read()
[metze/samba/wip.git] / source3 / torture / torture.c
index b17171138fbc91cf1ee7dc7f8d0108c8009f07fe..36d263d05e6fc51307be69dedd8d5b032f65331e 100644 (file)
@@ -429,20 +429,20 @@ bool torture_init_connection(struct cli_state **pcli)
 
 bool torture_cli_session_setup2(struct cli_state *cli, uint16 *new_vuid)
 {
-       uint16 old_vuid = cli->vuid;
+       uint16_t old_vuid = cli_state_get_uid(cli);
        fstring old_user_name;
        size_t passlen = strlen(password);
        NTSTATUS status;
        bool ret;
 
        fstrcpy(old_user_name, cli->user_name);
-       cli->vuid = 0;
+       cli_state_set_uid(cli, 0);
        ret = NT_STATUS_IS_OK(cli_session_setup(cli, username,
                                                password, passlen,
                                                password, passlen,
                                                workgroup));
-       *new_vuid = cli->vuid;
-       cli->vuid = old_vuid;
+       *new_vuid = cli_state_get_uid(cli);
+       cli_state_set_uid(cli, old_vuid);
        status = cli_set_username(cli, old_user_name);
        if (!NT_STATUS_IS_OK(status)) {
                return false;
@@ -808,7 +808,7 @@ static bool rw_torture2(struct cli_state *c1, struct cli_state *c2)
        char buf[131072];
        char buf_rd[131072];
        bool correct = True;
-       ssize_t bytes_read;
+       size_t bytes_read;
        NTSTATUS status;
 
        status = cli_unlink(c1, lockfname, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);
@@ -849,9 +849,15 @@ static bool rw_torture2(struct cli_state *c1, struct cli_state *c2)
                        break;
                }
 
-               if ((bytes_read = cli_read_old(c2, fnum2, buf_rd, 0, buf_size)) != buf_size) {
-                       printf("read failed (%s)\n", cli_errstr(c2));
-                       printf("read %d, expected %ld\n", (int)bytes_read, 
+               status = cli_read(c2, fnum2, buf_rd, 0, buf_size, &bytes_read);
+               if(!NT_STATUS_IS_OK(status)) {
+                       printf("read failed (%s)\n", nt_errstr(status));
+                       correct = false;
+                       break;
+               } else if (bytes_read != buf_size) {
+                       printf("read failed\n");
+                       printf("read %ld, expected %ld\n",
+                              (unsigned long)bytes_read,
                               (unsigned long)buf_size); 
                        correct = False;
                        break;
@@ -1361,7 +1367,7 @@ static bool run_tcon_test(int dummy)
        }
 
        cnum1 = cli_state_get_tid(cli);
-       vuid1 = cli->vuid;
+       vuid1 = cli_state_get_uid(cli);
 
        status = cli_writeall(cli, fnum1, 0, (uint8_t *)buf, 130, 4, NULL);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1380,7 +1386,7 @@ static bool run_tcon_test(int dummy)
 
        cnum2 = cli_state_get_tid(cli);
        cnum3 = MAX(cnum1, cnum2) + 1; /* any invalid number */
-       vuid2 = cli->vuid + 1;
+       vuid2 = cli_state_get_uid(cli) + 1;
 
        /* try a write with the wrong tid */
        cli_state_set_tid(cli, cnum2);
@@ -1408,7 +1414,7 @@ static bool run_tcon_test(int dummy)
        }
 
        /* try a write with an invalid vuid */
-       cli->vuid = vuid2;
+       cli_state_set_uid(cli, vuid2);
        cli_state_set_tid(cli, cnum1);
 
        status = cli_writeall(cli, fnum1, 0, (uint8_t *)buf, 130, 4, NULL);
@@ -1421,7 +1427,7 @@ static bool run_tcon_test(int dummy)
        }
 
        cli_state_set_tid(cli, cnum1);
-       cli->vuid = vuid1;
+       cli_state_set_uid(cli, vuid1);
 
        status = cli_close(cli, fnum1);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1899,6 +1905,28 @@ static bool run_locktest3(int dummy)
        return correct;
 }
 
+static bool test_cli_read(struct cli_state *cli, uint16_t fnum,
+                           char *buf, off_t offset, size_t size,
+                           size_t *nread, size_t expect)
+{
+       NTSTATUS status;
+       size_t l_nread;
+
+       status = cli_read(cli, fnum, buf, offset, size, &l_nread);
+
+       if(!NT_STATUS_IS_OK(status)) {
+               return false;
+       } else if (l_nread != expect) {
+               return false;
+       }
+
+       if (nread) {
+               *nread = l_nread;
+       }
+
+       return true;
+}
+
 #define EXPECTED(ret, v) if ((ret) != (v)) { \
         printf("** "); correct = False; \
         }
@@ -2009,7 +2037,7 @@ static bool run_locktest4(int dummy)
 
 
        ret = NT_STATUS_IS_OK(cli_lock32(cli1, fnum1, 120, 4, 0, WRITE_LOCK)) &&
-             (cli_read_old(cli2, fnum2, buf, 120, 4) == 4);
+             test_cli_read(cli2, fnum2, buf, 120, 4, NULL, 4);
        EXPECTED(ret, False);
        printf("this server %s strict write locking\n", ret?"doesn't do":"does");
 
@@ -2035,7 +2063,7 @@ static bool run_locktest4(int dummy)
        ret = NT_STATUS_IS_OK(cli_lock32(cli1, fnum1, 150, 4, 0, WRITE_LOCK)) &&
              NT_STATUS_IS_OK(cli_lock32(cli1, fnum1, 150, 4, 0, READ_LOCK)) &&
              NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 150, 4)) &&
-             (cli_read_old(cli2, fnum2, buf, 150, 4) == 4) &&
+             test_cli_read(cli2, fnum2, buf, 150, 4, NULL, 4) &&
              !(NT_STATUS_IS_OK(cli_writeall(cli2, fnum2, 0, (uint8_t *)buf,
                                             150, 4, NULL))) &&
              NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 150, 4));
@@ -2046,7 +2074,7 @@ static bool run_locktest4(int dummy)
              NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 160, 4)) &&
              NT_STATUS_IS_OK(cli_writeall(cli2, fnum2, 0, (uint8_t *)buf,
                                           160, 4, NULL)) &&
-             (cli_read_old(cli2, fnum2, buf, 160, 4) == 4);            
+             test_cli_read(cli2, fnum2, buf, 160, 4, NULL, 4);
        EXPECTED(ret, True);
        printf("the same process %s remove a read lock using write locking\n", ret?"can":"cannot");
 
@@ -2054,7 +2082,7 @@ static bool run_locktest4(int dummy)
              NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 170, 4)) &&
              NT_STATUS_IS_OK(cli_writeall(cli2, fnum2, 0, (uint8_t *)buf,
                                           170, 4, NULL)) &&
-             (cli_read_old(cli2, fnum2, buf, 170, 4) == 4);            
+             test_cli_read(cli2, fnum2, buf, 170, 4, NULL, 4);
        EXPECTED(ret, True);
        printf("the same process %s remove a write lock using read locking\n", ret?"can":"cannot");
 
@@ -2063,7 +2091,7 @@ static bool run_locktest4(int dummy)
              NT_STATUS_IS_OK(cli_unlock(cli1, fnum1, 190, 4)) &&
              !NT_STATUS_IS_OK(cli_writeall(cli2, fnum2, 0, (uint8_t *)buf,
                                            190, 4, NULL)) &&
-             (cli_read_old(cli2, fnum2, buf, 190, 4) == 4);            
+             test_cli_read(cli2, fnum2, buf, 190, 4, NULL, 4);
        EXPECTED(ret, True);
        printf("the same process %s remove the first lock first\n", ret?"does":"doesn't");
 
@@ -2273,6 +2301,7 @@ static bool run_locktest7(int dummy)
        uint16_t fnum1;
        char buf[200];
        bool correct = False;
+       size_t nread;
        NTSTATUS status;
 
        if (!torture_open_connection(&cli1, 0)) {
@@ -2300,14 +2329,21 @@ static bool run_locktest7(int dummy)
 
        status = cli_lock32(cli1, fnum1, 130, 4, 0, READ_LOCK);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("Unable to apply read lock on range 130:4, error was %s\n", nt_errstr(status));
+               printf("Unable to apply read lock on range 130:4, "
+                      "error was %s\n", nt_errstr(status));
                goto fail;
        } else {
                printf("pid1 successfully locked range 130:4 for READ\n");
        }
 
-       if (cli_read_old(cli1, fnum1, buf, 130, 4) != 4) {
-               printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
+       status = cli_read(cli1, fnum1, buf, 130, 4, &nread);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("pid1 unable to read the range 130:4, error was %s\n",
+                     nt_errstr(status));
+               goto fail;
+       } else if (nread != 4) {
+               printf("pid1 unable to read the range 130:4, "
+                      "recv %ld req %d\n", (unsigned long)nread, 4);
                goto fail;
        } else {
                printf("pid1 successfully read the range 130:4\n");
@@ -2328,8 +2364,15 @@ static bool run_locktest7(int dummy)
 
        cli_setpid(cli1, 2);
 
-       if (cli_read_old(cli1, fnum1, buf, 130, 4) != 4) {
-               printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
+       status = cli_read(cli1, fnum1, buf, 130, 4, &nread);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("pid2 unable to read the range 130:4, error was %s\n",
+                     nt_errstr(status));
+               goto fail;
+       } else if (nread != 4) {
+               printf("pid2 unable to read the range 130:4, "
+                      "recv %ld req %d\n", (unsigned long)nread, 4);
+               goto fail;
        } else {
                printf("pid2 successfully read the range 130:4\n");
        }
@@ -2358,8 +2401,14 @@ static bool run_locktest7(int dummy)
                printf("pid1 successfully locked range 130:4 for WRITE\n");
        }
 
-       if (cli_read_old(cli1, fnum1, buf, 130, 4) != 4) {
-               printf("pid1 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
+       status = cli_read(cli1, fnum1, buf, 130, 4, &nread);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("pid1 unable to read the range 130:4, error was %s\n",
+                     nt_errstr(status));
+               goto fail;
+       } else if (nread != 4) {
+               printf("pid1 unable to read the range 130:4, "
+                      "recv %ld req %d\n", (unsigned long)nread, 4);
                goto fail;
        } else {
                printf("pid1 successfully read the range 130:4\n");
@@ -2376,14 +2425,17 @@ static bool run_locktest7(int dummy)
 
        cli_setpid(cli1, 2);
 
-       if (cli_read_old(cli1, fnum1, buf, 130, 4) != 4) {
-               printf("pid2 unable to read the range 130:4, error was %s\n", cli_errstr(cli1));
-               if (NT_STATUS_V(cli_nt_error(cli1)) != NT_STATUS_V(NT_STATUS_FILE_LOCK_CONFLICT)) {
+       status = cli_read(cli1, fnum1, buf, 130, 4, &nread);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("pid2 unable to read the range 130:4, error was "
+                      "%s\n", nt_errstr(status));
+               if (!NT_STATUS_EQUAL(status, NT_STATUS_FILE_LOCK_CONFLICT)) {
                        printf("Incorrect error (should be NT_STATUS_FILE_LOCK_CONFLICT)\n");
                        goto fail;
                }
        } else {
-               printf("pid2 successfully read the range 130:4 (should be denied)\n");
+               printf("pid2 successfully read the range 130:4 (should be denied) recv %ld\n",
+                      (unsigned long)nread);
                goto fail;
        }
 
@@ -2495,7 +2547,7 @@ fail:
  */
 
 static bool got_alarm;
-static int alarm_fd;
+static struct cli_state *alarm_cli;
 
 static void alarm_handler(int dummy)
 {
@@ -2504,7 +2556,7 @@ static void alarm_handler(int dummy)
 
 static void alarm_handler_parent(int dummy)
 {
-       close(alarm_fd);
+       cli_state_disconnect(alarm_cli);
 }
 
 static void do_local_lock(int read_fd, int write_fd)
@@ -2655,7 +2707,7 @@ static bool run_locktest9(int dummy)
        }
 
        /* Wait 20 seconds for the lock. */
-       alarm_fd = cli1->fd;
+       alarm_cli = cli1;
        CatchSignal(SIGALRM, alarm_handler_parent);
        alarm(20);
 
@@ -2728,14 +2780,13 @@ static bool run_fdpasstest(int dummy)
                return False;
        }
 
-       cli2->vuid = cli1->vuid;
+       cli_state_set_uid(cli2, cli_state_get_uid(cli1));
        cli_state_set_tid(cli2, cli_state_get_tid(cli1));
        cli_setpid(cli2, cli_getpid(cli1));
 
-       if (cli_read_old(cli2, fnum1, buf, 0, 13) == 13) {
-               printf("read succeeded! nasty security hole [%s]\n",
-                      buf);
-               return False;
+       if (test_cli_read(cli2, fnum1, buf, 0, 13, NULL, 13)) {
+               printf("read succeeded! nasty security hole [%s]\n", buf);
+               return false;
        }
 
        cli_close(cli1, fnum1);
@@ -2794,13 +2845,13 @@ static bool run_fdsesstest(int dummy)
                return False;
        }
 
-       saved_vuid = cli->vuid;
-       cli->vuid = new_vuid;
+       saved_vuid = cli_state_get_uid(cli);
+       cli_state_set_uid(cli, new_vuid);
 
-       if (cli_read_old(cli, fnum1, buf, 0, 13) == 13) {
-               printf("read succeeded with different vuid! nasty security hole [%s]\n",
-                      buf);
-               ret = False;
+       if (test_cli_read(cli, fnum1, buf, 0, 13, NULL, 13)) {
+               printf("read succeeded with different vuid! "
+                      "nasty security hole [%s]\n", buf);
+               ret = false;
        }
        /* Try to open a file with different vuid, samba cnum. */
        if (NT_STATUS_IS_OK(cli_open(cli, fname1, O_RDWR|O_CREAT|O_EXCL, DENY_NONE, &fnum2))) {
@@ -2813,15 +2864,14 @@ static bool run_fdsesstest(int dummy)
                ret = False;
        }
 
-       cli->vuid = saved_vuid;
+       cli_state_set_uid(cli, saved_vuid);
 
        /* Try with same vuid, different cnum. */
        cli_state_set_tid(cli, new_cnum);
 
-       if (cli_read_old(cli, fnum1, buf, 0, 13) == 13) {
-               printf("read succeeded with different cnum![%s]\n",
-                      buf);
-               ret = False;
+       if (test_cli_read(cli, fnum1, buf, 0, 13, NULL, 13)) {
+               printf("read succeeded with different cnum![%s]\n", buf);
+               ret = false;
        }
 
        cli_state_set_tid(cli, saved_cnum);
@@ -3475,6 +3525,7 @@ static bool run_oplock2(int dummy)
        char buf[4];
        bool correct = True;
        volatile bool *shared_correct;
+       size_t nread;
        NTSTATUS status;
 
        shared_correct = (volatile bool *)shm_setup(sizeof(bool));
@@ -3543,10 +3594,14 @@ static bool run_oplock2(int dummy)
 
        /* Ensure cli1 processes the break. Empty file should always return 0
         * bytes.  */
-
-       if (cli_read_old(cli1, fnum1, buf, 0, 4) != 0) {
-               printf("read on fnum1 failed (%s)\n", cli_errstr(cli1));
-               correct = False;
+       status = cli_read(cli1, fnum1, buf, 0, 4, &nread);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("read on fnum1 failed (%s)\n", nt_errstr(status));
+               correct = false;
+       } else if (nread != 0) {
+               printf("read on empty fnum1 failed. recv %ld expected %d\n",
+                     (unsigned long)nread, 0);
+               correct = false;
        }
 
        /* Should now be at level II. */
@@ -3571,7 +3626,7 @@ static bool run_oplock2(int dummy)
 
        sleep(2);
 
-       cli_read_old(cli1, fnum1, buf, 0, 4);
+       cli_read(cli1, fnum1, buf, 0, 4, NULL);
 
        status = cli_close(cli1, fnum1);
        if (!NT_STATUS_IS_OK(status)) {
@@ -5270,6 +5325,7 @@ static bool run_simple_posix_open_test(int dummy)
        SMB_STRUCT_STAT sbuf;
        bool correct = false;
        NTSTATUS status;
+       size_t nread;
 
        printf("Starting simple POSIX open test\n");
 
@@ -5489,8 +5545,14 @@ static bool run_simple_posix_open_test(int dummy)
                goto out;
        }
 
-       if (cli_read_old(cli1, fnum1, buf, 0, 10) != 10) {
-               printf("POSIX read of %s failed (%s)\n", hname, cli_errstr(cli1));
+       status = cli_read(cli1, fnum1, buf, 0, 10, &nread);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("POSIX read of %s failed (%s)\n", hname,
+                      nt_errstr(status));
+               goto out;
+       } else if (nread != 10) {
+               printf("POSIX read of %s failed. Received %ld, expected %d\n",
+                      hname, (unsigned long)nread, 10);
                goto out;
        }
 
@@ -6345,7 +6407,7 @@ static bool run_sesssetup_bench(int dummy)
                        return false;
                }
 
-               d_printf("\r%d   ", (int)c->vuid);
+               d_printf("\r%d   ", (int)cli_state_get_uid(c));
 
                status = cli_ulogoff(c);
                if (!NT_STATUS_IS_OK(status)) {
@@ -6353,7 +6415,6 @@ static bool run_sesssetup_bench(int dummy)
                                 __location__, nt_errstr(status));
                        return false;
                }
-               c->vuid = 0;
        }
 
        return true;
@@ -7086,7 +7147,7 @@ static bool run_uid_regression_test(int dummy)
        cli_sockopt(cli, sockops);
 
        /* Ok - now save then logoff our current user. */
-       old_vuid = cli->vuid;
+       old_vuid = cli_state_get_uid(cli);
 
        status = cli_ulogoff(cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -7096,7 +7157,7 @@ static bool run_uid_regression_test(int dummy)
                goto out;
        }
 
-       cli->vuid = old_vuid;
+       cli_state_set_uid(cli, old_vuid);
 
        /* Try an operation. */
        status = cli_mkdir(cli, "\\uid_reg_test");
@@ -7117,7 +7178,7 @@ static bool run_uid_regression_test(int dummy)
        old_cnum = cli_state_get_tid(cli);
 
        /* Now try a SMBtdis with the invald vuid set to zero. */
-       cli->vuid = 0;
+       cli_state_set_uid(cli, 0);
 
        /* This should succeed. */
        status = cli_tdis(cli);
@@ -7130,7 +7191,7 @@ static bool run_uid_regression_test(int dummy)
                goto out;
        }
 
-       cli->vuid = old_vuid;
+       cli_state_set_uid(cli, old_vuid);
        cli_state_set_tid(cli, old_cnum);
 
        /* This should fail. */