s3: torture: Add additional POSIX mkdir tests.
authorJeremy Allison <jra@samba.org>
Sun, 24 Feb 2019 16:03:32 +0000 (08:03 -0800)
committerVolker Lendecke <vl@samba.org>
Mon, 25 Feb 2019 07:05:16 +0000 (08:05 +0100)
Ensure that if POSIX_foo exists as a file
we return the correct error code NT_STATUS_OBJECT_PATH_NOT_FOUND
if we try and traverse it as a directory.

Also ensure creation/deletion of POSIX_foo/foo fails
for directories and files with NT_STATUS_OBJECT_PATH_NOT_FOUND
if the directory POSIX_foo/ doesn't exist.

knownfail is back :-).

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13803

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
selftest/knownfail
source3/torture/torture.c

index abbbd889c7109f96766f67b833e164980230c531..1ac9616090f65e687b0ecdbacae8cc6e0ff658e3 100644 (file)
@@ -9,6 +9,7 @@
  ^samba3.smbtorture_s3.crypt_server\(nt4_dc\).SMB2-SESSION-REAUTH # expected to give ACCESS_DENIED SMB2.1 doesn't have encryption
 ^samba3.smbtorture_s3.crypt_server\(nt4_dc\).SMB2-SESSION-RECONNECT # expected to give CONNECTION_DISCONNECTED, we need to fix the test
 ^samba3.smbtorture_s3.plain.*SMB2-DIR-FSYNC.*\(ad_dc_ntvfs\)
+^samba3.smbtorture_s3.*.POSIX-MKDIR
 ^samba3.smb2.session enc.reconnect # expected to give CONNECTION_DISCONNECTED, we need to fix the test
 ^samba3.raw.session enc # expected to give ACCESS_DENIED as SMB1 encryption isn't used
 ^samba3.smbtorture_s3.crypt_server # expected to give ACCESS_DENIED as SMB1 encryption isn't used
index 0723fcb4e2baf3cdcd9b7992ee5442893c900666..b47f247356c7310f276390d71fbc7a91368e08fe 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);