lib: Make sid_parse return the parsed length
[samba.git] / source3 / torture / torture.c
index 0723fcb4e2baf3cdcd9b7992ee5442893c900666..7a209859b3f86c52e2f719566b9f17fa7dd5c82d 100644 (file)
@@ -7271,6 +7271,7 @@ static bool run_posix_mkdir_test(int dummy)
        bool correct = false;
        NTSTATUS status;
        TALLOC_CTX *frame = NULL;
+       uint16_t fnum = (uint16_t)-1;
 
        frame = talloc_stackframe();
 
@@ -7297,6 +7298,102 @@ static bool run_posix_mkdir_test(int dummy)
        cli_posix_rmdir(cli, fname_Foo_Foo);
        cli_posix_rmdir(cli, fname_Foo);
 
+       /*
+        * Create a file POSIX_foo then try
+        * and use it in a directory path by
+        * doing mkdir POSIX_foo/bar.
+        * The mkdir should fail with
+        * NT_STATUS_OBJECT_PATH_NOT_FOUND
+        */
+
+       status = cli_posix_open(cli,
+                       fname_foo,
+                       O_RDWR|O_CREAT,
+                       0666,
+                       &fnum);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_posix_open of %s failed error %s\n",
+                       fname_foo,
+                       nt_errstr(status));
+               goto out;
+       }
+
+       status = cli_posix_mkdir(cli, fname_foo_foo, 0777);
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_PATH_NOT_FOUND)) {
+               printf("cli_posix_mkdir of %s should fail with "
+                       "NT_STATUS_OBJECT_PATH_NOT_FOUND got "
+                       "%s instead\n",
+                       fname_foo_foo,
+                       nt_errstr(status));
+               goto out;
+       }
+
+       status = cli_close(cli, fnum);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_close failed %s\n", nt_errstr(status));
+               goto out;
+       }
+       fnum = (uint16_t)-1;
+
+       status = cli_posix_unlink(cli, fname_foo);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_posix_unlink of %s failed error %s\n",
+                       fname_foo,
+                       nt_errstr(status));
+               goto out;
+       }
+
+       /*
+        * Now we've deleted everything, posix_mkdir, posix_rmdir,
+        * posix_open, posix_unlink, on
+        * POSIX_foo/foo should return NT_STATUS_OBJECT_PATH_NOT_FOUND
+        * not silently create POSIX_foo/foo.
+        */
+
+       status = cli_posix_mkdir(cli, fname_foo_foo, 0777);
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_PATH_NOT_FOUND)) {
+               printf("cli_posix_mkdir of %s should fail with "
+                       "NT_STATUS_OBJECT_PATH_NOT_FOUND got "
+                       "%s instead\n",
+                       fname_foo_foo,
+                       nt_errstr(status));
+               goto out;
+       }
+
+       status = cli_posix_rmdir(cli, fname_foo_foo);
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_PATH_NOT_FOUND)) {
+               printf("cli_posix_rmdir of %s should fail with "
+                       "NT_STATUS_OBJECT_PATH_NOT_FOUND got "
+                       "%s instead\n",
+                       fname_foo_foo,
+                       nt_errstr(status));
+               goto out;
+       }
+
+       status = cli_posix_open(cli,
+                       fname_foo_foo,
+                       O_RDWR|O_CREAT,
+                       0666,
+                       &fnum);
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_PATH_NOT_FOUND)) {
+               printf("cli_posix_open of %s should fail with "
+                       "NT_STATUS_OBJECT_PATH_NOT_FOUND got "
+                       "%s instead\n",
+                       fname_foo_foo,
+                       nt_errstr(status));
+               goto out;
+       }
+
+       status = cli_posix_unlink(cli, fname_foo_foo);
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_PATH_NOT_FOUND)) {
+               printf("cli_posix_unlink of %s should fail with "
+                       "NT_STATUS_OBJECT_PATH_NOT_FOUND got "
+                       "%s instead\n",
+                       fname_foo_foo,
+                       nt_errstr(status));
+               goto out;
+       }
+
        status = cli_posix_mkdir(cli, fname_foo, 0777);
        if (!NT_STATUS_IS_OK(status)) {
                printf("cli_posix_mkdir of %s failed\n", fname_foo);
@@ -7338,6 +7435,11 @@ static bool run_posix_mkdir_test(int dummy)
 
   out:
 
+       if (fnum != (uint16_t)-1) {
+               cli_close(cli, fnum);
+               fnum = (uint16_t)-1;
+       }
+
        cli_posix_rmdir(cli, fname_foo_foo);
        cli_posix_rmdir(cli, fname_foo_Foo);
        cli_posix_rmdir(cli, fname_foo);
@@ -10776,6 +10878,7 @@ static bool run_local_sid_to_string(int dummy) {
 }
 
 static bool run_local_binary_to_sid(int dummy) {
+       struct sid_parse_ret ret;
        struct dom_sid *sid = talloc(NULL, struct dom_sid);
        static const uint8_t good_binary_sid[] = {
                0x1, /* revision number */
@@ -10860,13 +10963,16 @@ static bool run_local_binary_to_sid(int dummy) {
                0x1, 0x1, 0x1, 0x1, /* auth[31] */
        };
 
-       if (!sid_parse(good_binary_sid, sizeof(good_binary_sid), sid)) {
+       ret = sid_parse(good_binary_sid, sizeof(good_binary_sid), sid);
+       if (ret.len == -1) {
                return false;
        }
-       if (sid_parse(long_binary_sid2, sizeof(long_binary_sid2), sid)) {
+       ret = sid_parse(long_binary_sid2, sizeof(long_binary_sid2), sid);
+       if (ret.len != -1) {
                return false;
        }
-       if (sid_parse(long_binary_sid, sizeof(long_binary_sid), sid)) {
+       ret = sid_parse(long_binary_sid, sizeof(long_binary_sid), sid);
+       if (ret.len != -1) {
                return false;
        }
        return true;
@@ -12432,6 +12538,10 @@ static struct {
                .name  = "LOCAL-NAMEMAP-CACHE1",
                .fn    = run_local_namemap_cache1,
        },
+       {
+               .name  = "LOCAL-IDMAP-CACHE1",
+               .fn    = run_local_idmap_cache1,
+       },
        {
                .name  = "qpathinfo-bufsize",
                .fn    = run_qpathinfo_bufsize,