smbd: Test reparse tag in smb3_posix_cc_info
authorVolker Lendecke <vl@samba.org>
Mon, 13 May 2024 13:44:14 +0000 (15:44 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 14 May 2024 22:29:36 +0000 (22:29 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
python/samba/tests/smb3unix.py
selftest/knownfail.d/smb3unix [new file with mode: 0644]

index 1962852349c42a339bd6d0e4b730c92a1375ed6a..66aa98b5aa91d933cf2b6df490f5bac21ba25258 100644 (file)
@@ -23,6 +23,7 @@ from samba.common import get_string
 from samba.dcerpc import smb3posix
 from samba.ndr import ndr_unpack
 from samba.dcerpc.security import dom_sid
+from samba import reparse_symlink
 import os
 import subprocess
 
@@ -391,6 +392,46 @@ class Smb3UnixTests(samba.tests.libsmb.LibsmbTests):
             self.delete_test_file(c, '\\test_create_context_basic1_file')
             self.delete_test_file(c, '\\test_create_context_basic1_dir')
 
+    def test_create_context_reparse(self):
+        """
+        Check reparse tag in posix create context response
+        """
+        try:
+            c = libsmb.Conn(
+                self.server_ip,
+                "smb3_posix_share",
+                self.lp,
+                self.creds,
+                posix=True)
+            self.assertTrue(c.have_posix())
+
+            tag = 0x80000025
+
+            f,_,cc_out = c.create_ex('\\reparse',
+                                     DesiredAccess=security.SEC_STD_ALL,
+                                     CreateDisposition=libsmb.FILE_CREATE,
+                                     CreateContexts=[posix_context(0o600)])
+
+            cc = ndr_unpack(smb3posix.smb3_posix_cc_info, cc_out[0][1])
+            self.assertEqual(cc.reparse_tag, libsmb.IO_REPARSE_TAG_RESERVED_ZERO)
+
+            b = reparse_symlink.put(tag, 0, b'asdf')
+            c.fsctl(f, libsmb.FSCTL_SET_REPARSE_POINT, b, 0)
+
+            c.close(f)
+
+            f,_,cc_out = c.create_ex('\\reparse',
+                                     DesiredAccess=security.SEC_STD_ALL,
+                                     CreateDisposition=libsmb.FILE_OPEN,
+                                     CreateContexts=[posix_context(0o600)])
+            c.close(f)
+
+            cc = ndr_unpack(smb3posix.smb3_posix_cc_info, cc_out[0][1])
+            self.assertEqual(cc.reparse_tag, tag)
+
+        finally:
+            self.delete_test_file(c, '\\reparse')
+
     def test_delete_on_close(self):
         """
         Test two opens with delete-on-close:
diff --git a/selftest/knownfail.d/smb3unix b/selftest/knownfail.d/smb3unix
new file mode 100644 (file)
index 0000000..e93d191
--- /dev/null
@@ -0,0 +1 @@
+samba.tests.smb3unix.samba.tests.smb3unix.Smb3UnixTests.test_create_context_reparse