]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s4: torture: Add a new test - samba3.smb2.durable-open.stat-open.
authorJeremy Allison <jra@samba.org>
Wed, 27 Apr 2022 19:50:59 +0000 (12:50 -0700)
committerRalph Boehme <slow@samba.org>
Fri, 29 Apr 2022 14:57:29 +0000 (14:57 +0000)
Passes against Windows. Shows that Windows allows a durable handle
on a leased open for READ_ATTRUBUTES only (a stat open).

Mark as knownfail for now.

NB. Not sure why we are testing smb2.durable-open against ad_dc
as that provisioning has "smb2 leases = no" which precludes
granting durable handles. Not changing for this bug but this
should be looked at in future.

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

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
selftest/knownfail
selftest/knownfail.d/durable-stat-open [new file with mode: 0644]
source4/torture/smb2/durable_open.c

index 99c8768485bf89416fcbaf56c75d2f8fad4cbe1b..173286a96a04e177987a6f34b417046a4e7c769e 100644 (file)
 ^samba3.smb2.durable-open.delete_on_close2
 ^samba3.smb2.durable-v2-open.app-instance
 ^samba3.smb2.durable-open.reopen1a-lease\(ad_dc\)$
+^samba3.smb2.durable-open.stat-open\(ad_dc\)$
 ^samba3.smb2.durable-v2-open.reopen1a-lease\(ad_dc\)$
 ^samba4.smb2.ioctl.req_resume_key\(ad_dc_ntvfs\) # not supported by s4 ntvfs server
 ^samba4.smb2.ioctl.req_two_resume_keys\(ad_dc_ntvfs\) # not supported by s4 ntvfs server
diff --git a/selftest/knownfail.d/durable-stat-open b/selftest/knownfail.d/durable-stat-open
new file mode 100644 (file)
index 0000000..38eab23
--- /dev/null
@@ -0,0 +1 @@
+^samba3.smb2.durable-open.stat-open\(nt4_dc\)
index 3d78a35d92c7ad306580d908279b3b699226add1..9cd4d88af39fc9f312a4b226c1725c832a661e90 100644 (file)
@@ -2751,6 +2751,67 @@ done:
        return ret;
 }
 
+/**
+ * durable stat open with lease.
+ */
+static bool test_durable_open_stat_open(struct torture_context *tctx,
+                                       struct smb2_tree *tree)
+{
+       TALLOC_CTX *mem_ctx = talloc_new(tctx);
+       struct smb2_create io;
+       struct smb2_handle _h;
+       struct smb2_handle *h = NULL;
+       struct smb2_lease ls;
+       NTSTATUS status;
+       char fname[256];
+       bool ret = true;
+       uint64_t lease;
+
+       snprintf(fname, 256, "durable_open_stat_open_%s.dat",
+                generate_random_str(mem_ctx, 8));
+
+       /* Ensure file doesn't exist. */
+       smb2_util_unlink(tree, fname);
+
+       /* Create a normal file. */
+       smb2_oplock_create(&io, fname, SMB2_OPLOCK_LEVEL_NONE);
+       status = smb2_create(tree, mem_ctx, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       _h = io.out.file.handle;
+       h = &_h;
+       CHECK_CREATED(&io, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+       /* Close. */
+       smb2_util_close(tree, *h);
+       h = NULL;
+
+       /* Now try a leased, durable handle stat open. */
+       lease = random();
+       /* Create with lease */
+       smb2_lease_create(&io,
+                         &ls,
+                         false /* dir */,
+                         fname,
+                         lease,
+                         smb2_util_lease_state("RH"));
+       io.in.durable_open = true;
+       io.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
+       io.in.create_disposition = NTCREATEX_DISP_OPEN;
+
+       status = smb2_create(tree, mem_ctx, &io);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       CHECK_CREATED(&io, EXISTED, FILE_ATTRIBUTE_ARCHIVE);
+       CHECK_VAL(io.out.durable_open, true);
+       _h = io.out.file.handle;
+       h = &_h;
+
+done:
+       if (h != NULL) {
+               smb2_util_close(tree, *h);
+       }
+       smb2_util_unlink(tree, fname);
+       talloc_free(mem_ctx);
+       return ret;
+}
 
 struct torture_suite *torture_smb2_durable_open_init(TALLOC_CTX *ctx)
 {
@@ -2786,6 +2847,8 @@ struct torture_suite *torture_smb2_durable_open_init(TALLOC_CTX *ctx)
                                     test_durable_open_alloc_size);
        torture_suite_add_1smb2_test(suite, "read-only",
                                     test_durable_open_read_only);
+       torture_suite_add_1smb2_test(suite, "stat-open",
+                                    test_durable_open_stat_open);
 
        suite->description = talloc_strdup(suite, "SMB2-DURABLE-OPEN tests");