From dfa0b1adb872f9c34b6fb1f4f84a06f5dd6802bc Mon Sep 17 00:00:00 2001 From: Noel Power Date: Fri, 7 Jun 2024 19:35:47 +0100 Subject: [PATCH] s3/smbd: fix nested chdir into msdfs links on (widelinks = yes) share This patch also removes known fail for existing test BUG: https://bugzilla.samba.org/show_bug.cgi?id=15435 Signed-off-by: Noel Power Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Tue Jun 11 19:31:40 UTC 2024 on atb-devel-224 (cherry picked from commit 788ef8f07c75d5e6eca5b8f18d93d96f31574267) [noel.power@suse.com backported to Samba 4.19 changed test of errno after return from widelink_openat to ENOENT because ELOOP isn't set for msdfs links in 4.19, ENOENT is set instead. Also minor change to use 4.19 create_open_symlink_err fn instead of read_symlink_reparse] --- selftest/knownfail.d/dfs_widelink | 2 -- source3/smbd/files.c | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) delete mode 100644 selftest/knownfail.d/dfs_widelink diff --git a/selftest/knownfail.d/dfs_widelink b/selftest/knownfail.d/dfs_widelink deleted file mode 100644 index 1427a8ba5d7..00000000000 --- a/selftest/knownfail.d/dfs_widelink +++ /dev/null @@ -1,2 +0,0 @@ -^samba.tests.blackbox.misc_dfs_widelink.samba.tests.blackbox.misc_dfs_widelink.DfsWidelinkBlockboxTestBase.test_nested_chdir\(fileserver\) -^samba.tests.blackbox.misc_dfs_widelink.samba.tests.blackbox.misc_dfs_widelink.DfsWidelinkBlockboxTestBase.test_enumerate_dfs_link diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 02cfc424822..a658a3c0345 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -1168,6 +1168,24 @@ next: } if (fd == -1) { + /* + * vfs_widelink widelink_openat will update stat for fsp + * and return ENOENT for non-existing link, we can report + * the link here and let calling code decide what to do. + */ + if ((errno == ENOENT) && S_ISLNK(fsp->fsp_name->st.st_ex_mode)) { + status = create_open_symlink_err(mem_ctx, + dirfsp, + &rel_fname, + &symlink_err); + if (NT_STATUS_IS_OK(status)) { + status = NT_STATUS_STOPPED_ON_SYMLINK; + } else { + DBG_ERR("read_symlink_reparse failed: %s\n", + nt_errstr(status)); + } + goto fail; + } status = map_nt_error_from_unix(errno); DBG_DEBUG("SMB_VFS_OPENAT() failed: %s\n", strerror(errno)); -- 2.47.2