From: Volker Lendecke Date: Wed, 17 May 2023 08:54:49 +0000 (+0200) Subject: tests: Check symlinks are readable as reparse points X-Git-Tag: tdb-1.4.13~475 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=95e1998a4a853287563b6eb84a3ca4a18d9fe271;p=thirdparty%2Fsamba.git tests: Check symlinks are readable as reparse points Signed-off-by: Volker Lendecke Reviewed-by: Ralph Boehme Autobuild-User(master): Ralph Böhme Autobuild-Date(master): Fri Nov 22 11:05:33 UTC 2024 on atb-devel-224 --- diff --git a/python/samba/tests/smb2symlink.py b/python/samba/tests/smb2symlink.py index 74aaf9e1658..f9cd4a23cd6 100644 --- a/python/samba/tests/smb2symlink.py +++ b/python/samba/tests/smb2symlink.py @@ -55,13 +55,19 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): self.creds) return (smb1, smb2) - def create_symlink(self, conn, target, symlink): - self.clean_file(conn, symlink) - if (conn.protocol() < libsmb.PROTOCOL_SMB2_02 and conn.have_posix()): - conn.smb1_symlink(target, symlink) + def create_symlink(self, conn1, conn2, target, symlink, + expect_tgt=None): + + if expect_tgt is None: + expect_tgt = target + + self.clean_file(conn1, symlink) + if (conn1.protocol() < libsmb.PROTOCOL_SMB2_02 and + conn1.have_posix()): + conn1.smb1_symlink(target, symlink) else: flags = 0 if target[0]=='/' else 1 - syml = conn.create( + syml = conn1.create( symlink, DesiredAccess=sec.SEC_FILE_READ_ATTRIBUTE| sec.SEC_FILE_WRITE_ATTRIBUTE| @@ -70,8 +76,19 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): CreateDisposition=libsmb.FILE_OPEN_IF, CreateOptions=libsmb.FILE_OPEN_REPARSE_POINT) b = reparse_symlink.symlink_put(target, target, 0, 1) - conn.fsctl(syml, libsmb.FSCTL_SET_REPARSE_POINT, b, 0) - conn.close(syml) + conn1.fsctl(syml, libsmb.FSCTL_SET_REPARSE_POINT, b, 0) + conn1.close(syml) + + fd = conn2.create(symlink, + DesiredAccess=sec.SEC_FILE_WRITE_ATTRIBUTE, + CreateOptions=libsmb.FILE_OPEN_REPARSE_POINT, + CreateDisposition=libsmb.FILE_OPEN) + blob = conn2.fsctl(fd, libsmb.FSCTL_GET_REPARSE_POINT, b'', 1024) + conn2.close(fd) + + (tag,(subst,_,_,_)) = reparse_symlink.get(blob) + self.assertEqual(tag, "IO_REPARSE_TAG_SYMLINK") + self.assertEqual(expect_tgt, subst) def assert_symlink_exception(self, e, expect): self.assertEqual(e.args[0], ntstatus.NT_STATUS_STOPPED_ON_SYMLINK) @@ -91,7 +108,7 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): target="foo" suffix="bar" - self.create_symlink(smb1, target, symlink) + self.create_symlink(smb1, smb2, target, symlink); with self.assertRaises(NTSTATUSError) as e: fd = smb2.create_ex(f'{symlink}\\{suffix}') @@ -111,7 +128,7 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): symlink="syml" target="foo" - self.create_symlink(smb1, target, symlink) + self.create_symlink(smb1, smb2, target, symlink); with self.assertRaises(NTSTATUSError) as e: fd = smb2.create_ex(f'{symlink}') @@ -135,7 +152,7 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): for target in ["/etc", "//foo/bar", "/"]: - self.create_symlink(smb1, target, symlink) + self.create_symlink(smb1, smb2, target, symlink) with self.assertRaises(NTSTATUSError) as e: fd = smb2.create_ex(f'{symlink}') @@ -159,7 +176,7 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): rel_dest="dst" target=f'{shareroot}/{rel_dest}' - self.create_symlink(smb1, target, symlink) + self.create_symlink(smb1, smb2, target, symlink, rel_dest) with self.assertRaises(NTSTATUSError) as e: fd = smb2.create_ex(f'{symlink}') @@ -199,7 +216,7 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): smb1.mkdir("sub") self.addCleanup(self.clean_file, smb1, "sub") - self.create_symlink(smb1, f'{localpath}/sub1', "sub/lnk") + self.create_symlink(smb1, smb2, f'{localpath}/sub1', "sub/lnk") self.addCleanup(self.clean_file, smb1, "sub/lnk") smb1.mkdir("sub1")