r24477: Add a rename test to prove that NT_STATUS_OBJECT_NAME_COLLISION
authorJeremy Allison <jra@samba.org>
Thu, 16 Aug 2007 00:54:16 +0000 (00:54 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 20:01:55 +0000 (15:01 -0500)
is mapped to ERRDOS, ERRrename on a rename error, but mapped
to ERRDOS, ERRfilexists on an open error.
Jeremy.

source/torture/raw/samba3misc.c

index b8a00ab4edae75154153281285d685216955a5ad..ded230a4239dd3afc08c46f9ba74584786f07f0c 100644 (file)
@@ -327,8 +327,10 @@ BOOL torture_samba3_badpath(struct torture_context *torture)
        struct smbcli_state *cli_nt;
        struct smbcli_state *cli_dos;
        const char *fname = "test.txt";
+       const char *fname1 = "test1.txt";
        const char *dirname = "testdir";
        char *fpath;
+       char *fpath1;
        int fnum;
        NTSTATUS status;
        BOOL ret = True;
@@ -406,6 +408,17 @@ BOOL torture_samba3_badpath(struct torture_context *torture)
        }
        smbcli_close(cli_nt->tree, fnum);
 
+       if (!(fpath1 = talloc_asprintf(mem_ctx, "%s\\%s", dirname, fname1))) {
+               goto fail;
+       }
+       fnum = smbcli_open(cli_nt->tree, fpath1, O_RDWR | O_CREAT, DENY_NONE);
+       if (fnum == -1) {
+               d_printf("Could not create file %s: %s\n", fpath1,
+                        smbcli_errstr(cli_nt->tree));
+               goto fail;
+       }
+       smbcli_close(cli_nt->tree, fnum);
+
        /*
         * Do a whole bunch of error code checks on chkpath
         */
@@ -533,6 +546,18 @@ BOOL torture_samba3_badpath(struct torture_context *torture)
        status = raw_smbcli_ntcreate(cli_dos->tree, fpath, NULL);
        CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRfilexists));
 
+       /* Try the rename test. */
+       {
+               union smb_rename io;
+               io.rename.in.pattern1 = fpath1;
+               io.rename.in.pattern2 = fpath;
+
+               status = smb_raw_rename(cli_nt->tree, &io);
+               CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);
+               status = smb_raw_rename(cli_dos->tree, &io);
+               CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRrename));
+       }
+
        goto done;
 
  fail: