s3: torture: Add a test for cli_setpathinfo_basic() to smbtorture3.
authorJeremy Allison <jra@samba.org>
Fri, 21 Jul 2017 22:11:08 +0000 (15:11 -0700)
committerKarolin Seeger <kseeger@samba.org>
Mon, 14 Aug 2017 08:50:10 +0000 (10:50 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12913

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
(cherry picked from commit bfa07323590357542eb06ad5faa2dc5a5736e3f1)

source3/torture/torture.c

index 1a1a23a75708f6437653fa00a015108ecf3bcd0c..c4ca8e861011dc6643f7c9ca0a5b98e06d568f29 100644 (file)
@@ -3158,6 +3158,29 @@ static bool run_browsetest(int dummy)
 
 }
 
+static bool check_attributes(struct cli_state *cli,
+                               const char *fname,
+                               uint16_t expected_attrs)
+{
+       uint16_t attrs = 0;
+       NTSTATUS status = cli_getatr(cli,
+                               fname,
+                               &attrs,
+                               NULL,
+                               NULL);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_getatr failed with %s\n",
+                       nt_errstr(status));
+               return false;
+       }
+       if (attrs != expected_attrs) {
+               printf("Attributes incorrect 0x%x, should be 0x%x\n",
+                       (unsigned int)attrs,
+                       (unsigned int)expected_attrs);
+               return false;
+       }
+       return true;
+}
 
 /*
   This checks how the getatr calls works
@@ -3218,6 +3241,120 @@ static bool run_attrtest(int dummy)
 
        cli_unlink(cli, fname, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);
 
+       /* Check cli_setpathinfo_basic() */
+       /* Re-create the file. */
+       status = cli_openx(cli, fname,
+                       O_RDWR | O_CREAT | O_TRUNC, DENY_NONE, &fnum);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to recreate %s (%s)\n",
+                       fname, nt_errstr(status));
+               correct = false;
+       }
+       cli_close(cli, fnum);
+
+       status = cli_setpathinfo_basic(cli,
+                                       fname,
+                                       0, /* create */
+                                       0, /* access */
+                                       0, /* write */
+                                       0, /* change */
+                                       FILE_ATTRIBUTE_SYSTEM |
+                                       FILE_ATTRIBUTE_HIDDEN |
+                                       FILE_ATTRIBUTE_READONLY);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_setpathinfo_basic failed with %s\n",
+                       nt_errstr(status));
+               correct = false;
+       }
+
+       /* Check attributes are correct. */
+       correct = check_attributes(cli,
+                       fname,
+                       FILE_ATTRIBUTE_SYSTEM |
+                       FILE_ATTRIBUTE_HIDDEN |
+                       FILE_ATTRIBUTE_READONLY);
+       if (correct == false) {
+               goto out;
+       }
+
+       /* Setting to FILE_ATTRIBUTE_NORMAL should be ignored. */
+       status = cli_setpathinfo_basic(cli,
+                                       fname,
+                                       0, /* create */
+                                       0, /* access */
+                                       0, /* write */
+                                       0, /* change */
+                                       FILE_ATTRIBUTE_NORMAL);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_setpathinfo_basic failed with %s\n",
+                       nt_errstr(status));
+               correct = false;
+       }
+
+       /* Check attributes are correct. */
+       correct = check_attributes(cli,
+                       fname,
+                       FILE_ATTRIBUTE_SYSTEM |
+                       FILE_ATTRIBUTE_HIDDEN |
+                       FILE_ATTRIBUTE_READONLY);
+       if (correct == false) {
+               goto out;
+       }
+
+       /* Setting to (uint16_t)-1 should also be ignored. */
+       status = cli_setpathinfo_basic(cli,
+                                       fname,
+                                       0, /* create */
+                                       0, /* access */
+                                       0, /* write */
+                                       0, /* change */
+                                       (uint16_t)-1);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_setpathinfo_basic failed with %s\n",
+                       nt_errstr(status));
+               correct = false;
+       }
+
+       /* Check attributes are correct. */
+       correct = check_attributes(cli,
+                       fname,
+                       FILE_ATTRIBUTE_SYSTEM |
+                       FILE_ATTRIBUTE_HIDDEN |
+                       FILE_ATTRIBUTE_READONLY);
+       if (correct == false) {
+               goto out;
+       }
+
+       /* Setting to 0 should clear them all. */
+       status = cli_setpathinfo_basic(cli,
+                                       fname,
+                                       0, /* create */
+                                       0, /* access */
+                                       0, /* write */
+                                       0, /* change */
+                                       0);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_setpathinfo_basic failed with %s\n",
+                       nt_errstr(status));
+               correct = false;
+       }
+
+       /* Check attributes are correct. */
+       correct = check_attributes(cli,
+                       fname,
+                       FILE_ATTRIBUTE_NORMAL);
+       if (correct == false) {
+               goto out;
+       }
+
+  out:
+
+       cli_unlink(cli,
+               fname,
+               FILE_ATTRIBUTE_SYSTEM |
+               FILE_ATTRIBUTE_HIDDEN|
+               FILE_ATTRIBUTE_READONLY);
+
        if (!torture_close_connection(cli)) {
                correct = False;
        }