]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
CI/smb3unix: add test_delete_on_close
authorRalph Boehme <slow@samba.org>
Thu, 9 Nov 2023 18:53:46 +0000 (19:53 +0100)
committerJeremy Allison <jra@samba.org>
Mon, 13 Nov 2023 18:35:32 +0000 (18:35 +0000)
BUG:https://bugzilla.samba.org/show_bug.cgi?id=15517

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
python/samba/tests/smb3unix.py
selftest/knownfail.d/samba.tests.smb3unix.samba.tests.smb3unix.Smb3UnixTests [new file with mode: 0644]

index 33a3d546f75cad7f107dddd5c827ee0bd1c8f829..5a88640e1cd75e7141ad84f0e35f30fe2be9356f 100644 (file)
@@ -35,6 +35,35 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
 
         self.samsid = os.environ["SAMSID"]
 
+    def connections(self, share1=None, posix1=False, share2=None, posix2=True):
+        if not share1:
+            share1 = samba.tests.env_get_var_value(
+                "SHARE1", allow_missing=True)
+            if not share1:
+                share1 = "tmp"
+
+        if not share2:
+            share2 = samba.tests.env_get_var_value(
+                "SHARE2", allow_missing=True)
+            if not share2:
+                share2 = "tmp"
+
+        conn1 = libsmb.Conn(
+            self.server_ip,
+            share1,
+            self.lp,
+            self.creds,
+            posix=posix1)
+
+        conn2 = libsmb.Conn(
+            self.server_ip,
+            share2,
+            self.lp,
+            self.creds,
+            posix=posix2)
+
+        return (conn1, conn2)
+
     def test_negotiate_context_posix(self):
         c = libsmb.Conn(
             self.server_ip,
@@ -351,3 +380,39 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
         finally:
             self.delete_test_file(c, '\\test_create_context_basic1_file')
             self.delete_test_file(c, '\\test_create_context_basic1_dir')
+
+    def test_delete_on_close(self):
+        """
+        Test two opens with delete-on-close:
+        1. Windows open
+        2. POSIX open
+        Closing handle 1 should unlink the file, a subsequent directory
+        listing shouldn't list the deleted file.
+        """
+        (winconn,posixconn) = self.connections()
+
+        self.clean_file(winconn, 'test_delete_on_close')
+
+        fdw = winconn.create(
+            'test_delete_on_close',
+            DesiredAccess=security.SEC_FILE_WRITE_ATTRIBUTE | security.SEC_STD_DELETE,
+            ShareAccess=0x07,
+            CreateDisposition=libsmb.FILE_CREATE)
+        self.addCleanup(self.clean_file, winconn, 'test_delete_on_close')
+
+        fdp,_,_ = posixconn.create_ex(
+            'test_delete_on_close',
+            DesiredAccess=security.SEC_FILE_WRITE_ATTRIBUTE | security.SEC_STD_DELETE,
+            ShareAccess=0x07,
+            CreateDisposition=libsmb.FILE_OPEN,
+            CreateContexts=[posix_context(0o600)])
+
+        winconn.delete_on_close(fdw, 1)
+        posixconn.delete_on_close(fdp, 1)
+
+        winconn.close(fdw)
+
+        # The file should now already be deleted
+        l = winconn.list('', mask='test_delete_on_close')
+        found_files = {get_string(f['name']): f for f in l}
+        self.assertFalse('test_delete_on_close' in found_files)
diff --git a/selftest/knownfail.d/samba.tests.smb3unix.samba.tests.smb3unix.Smb3UnixTests b/selftest/knownfail.d/samba.tests.smb3unix.samba.tests.smb3unix.Smb3UnixTests
new file mode 100644 (file)
index 0000000..e893a35
--- /dev/null
@@ -0,0 +1 @@
+^samba.tests.smb3unix.samba.tests.smb3unix.Smb3UnixTests.test_delete_on_close\(fileserver_smb1\)