The branch, master has been updated via 009b52650d0 vfs: update status of SMB_VFS_SYMLINKAT() via f09ea26e658 s3: smbd: Change smb_set_file_unix_link() to use a real directory fsp for SMB_VFS_SYMLINKAT(). via 35f2c7641e6 s3: VFS: glusterfs: Fix vfs_gluster_symlinkat() to cope with a real dirfsp. via c8e8ea23097 s3: VFS: ceph: Fix cephwrap_symlinkat() to cope with real directory fsps. from b96c2cf0199 vfs: directory enumeration is now handle based
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 009b52650d0f7e0bb2d840eb004c335f88b30cf8 Author: Jeremy Allison <j...@samba.org> Date: Fri Jan 15 14:50:23 2021 -0800 vfs: update status of SMB_VFS_SYMLINKAT() Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Sun Jan 17 05:48:14 UTC 2021 on sn-devel-184 commit f09ea26e6580b2c339c4de9374e024182fa9ca82 Author: Jeremy Allison <j...@samba.org> Date: Fri Jan 15 14:29:08 2021 -0800 s3: smbd: Change smb_set_file_unix_link() to use a real directory fsp for SMB_VFS_SYMLINKAT(). New VFS change. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 35f2c7641e6235fdad492f47b0685e89016a9cb1 Author: Jeremy Allison <j...@samba.org> Date: Fri Jan 15 14:35:58 2021 -0800 s3: VFS: glusterfs: Fix vfs_gluster_symlinkat() to cope with a real dirfsp. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit c8e8ea23097df7b1c1c596f8dd99ab2a59afe3a4 Author: Jeremy Allison <j...@samba.org> Date: Fri Jan 15 14:33:17 2021 -0800 s3: VFS: ceph: Fix cephwrap_symlinkat() to cope with real directory fsps. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/modules/The_New_VFS.org | 2 +- source3/modules/The_New_VFS.txt | 2 +- source3/modules/vfs_ceph.c | 16 ++++++++++++---- source3/modules/vfs_glusterfs.c | 16 ++++++++++++++-- source3/smbd/trans2.c | 31 +++++++++++++++++++++++++++++-- 5 files changed, 57 insertions(+), 10 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/modules/The_New_VFS.org b/source3/modules/The_New_VFS.org index d034acaa661..f5dcec8db62 100644 --- a/source3/modules/The_New_VFS.org +++ b/source3/modules/The_New_VFS.org @@ -292,7 +292,7 @@ whenever VFS access is done in a piecemeal fashion. | SMB_VFS_STATVFS() | [[Disk][Disk]] | - | | SMB_VFS_STREAMINFO() | [[Path][Path]] | Todo | | SMB_VFS_STRICT_LOCK_CHECK() | [[fsp][fsp]] | - | -| SMB_VFS_SYMLINKAT() | [[NsC][NsC]] | Todo | +| SMB_VFS_SYMLINKAT() | [[NsC][NsC]] | - | | SMB_VFS_SYS_ACL_BLOB_GET_FD() | [[xpathref][xpathref]] | - | | SMB_VFS_SYS_ACL_BLOB_GET_FILE() | [[Path][Path]] | Todo | | SMB_VFS_SYS_ACL_DELETE_DEF_FILE() | [[Path][Path]] | Todo | diff --git a/source3/modules/The_New_VFS.txt b/source3/modules/The_New_VFS.txt index 6d94cfdc6a2..a42985b5eaf 100644 --- a/source3/modules/The_New_VFS.txt +++ b/source3/modules/The_New_VFS.txt @@ -360,7 +360,7 @@ Table of Contents SMB_VFS_STATVFS() [Disk] - SMB_VFS_STREAMINFO() [Path] Todo SMB_VFS_STRICT_LOCK_CHECK() [fsp] - - SMB_VFS_SYMLINKAT() [NsC] Todo + SMB_VFS_SYMLINKAT() [NsC] - SMB_VFS_SYS_ACL_BLOB_GET_FD() [xpathref] - SMB_VFS_SYS_ACL_BLOB_GET_FILE() [Path] Todo SMB_VFS_SYS_ACL_DELETE_DEF_FILE() [Path] Todo diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c index b2d9ead1db5..cacc725310a 100644 --- a/source3/modules/vfs_ceph.c +++ b/source3/modules/vfs_ceph.c @@ -1052,16 +1052,24 @@ static int cephwrap_symlinkat(struct vfs_handle_struct *handle, struct files_struct *dirfsp, const struct smb_filename *new_smb_fname) { + struct smb_filename *full_fname = NULL; int result = -1; + + full_fname = full_path_from_dirfsp_atname(talloc_tos(), + dirfsp, + new_smb_fname); + if (full_fname == NULL) { + return -1; + } + DBG_DEBUG("[CEPH] symlink(%p, %s, %s)\n", handle, link_target->base_name, - new_smb_fname->base_name); - - SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp); + full_fname->base_name); result = ceph_symlink(handle->data, link_target->base_name, - new_smb_fname->base_name); + full_fname->base_name); + TALLOC_FREE(full_fname); DBG_DEBUG("[CEPH] symlink(...) = %d\n", result); WRAP_RETURN(result); } diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c index 59b76546112..9cc27b5c352 100644 --- a/source3/modules/vfs_glusterfs.c +++ b/source3/modules/vfs_glusterfs.c @@ -1844,13 +1844,25 @@ static int vfs_gluster_symlinkat(struct vfs_handle_struct *handle, struct files_struct *dirfsp, const struct smb_filename *new_smb_fname) { + struct smb_filename *full_fname = NULL; int ret; START_PROFILE(syscall_symlinkat); - SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp); + + full_fname = full_path_from_dirfsp_atname(talloc_tos(), + dirfsp, + new_smb_fname); + if (full_fname == NULL) { + END_PROFILE(syscall_symlinkat); + return -1; + } + ret = glfs_symlink(handle->data, link_target->base_name, - new_smb_fname->base_name); + full_fname->base_name); + + TALLOC_FREE(full_fname); + END_PROFILE(syscall_symlinkat); return ret; diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 3c1df4ca3ac..f3a0d7da75f 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -7009,6 +7009,9 @@ static NTSTATUS smb_set_file_unix_link(connection_struct *conn, TALLOC_CTX *ctx = talloc_tos(); NTSTATUS status; int ret; + struct smb_filename *parent_fname = NULL; + struct smb_filename *base_name = NULL; + bool ok; /* Set a symbolic link. */ /* Don't allow this if follow links is false. */ @@ -7041,14 +7044,38 @@ static NTSTATUS smb_set_file_unix_link(connection_struct *conn, DEBUG(10,("smb_set_file_unix_link: SMB_SET_FILE_UNIX_LINK doing symlink %s -> %s\n", new_smb_fname->base_name, link_target )); + ok = parent_smb_fname(ctx, + new_smb_fname, + &parent_fname, + &base_name); + if (!ok) { + return NT_STATUS_NO_MEMORY; + } + + ret = vfs_stat(conn, parent_fname); + if (ret == -1) { + TALLOC_FREE(parent_fname); + return map_nt_error_from_unix(errno); + } + status = openat_pathref_fsp(conn->cwd_fsp, parent_fname); + if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) { + status = NT_STATUS_OBJECT_NAME_NOT_FOUND; + } + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(parent_fname); + return status; + } + ret = SMB_VFS_SYMLINKAT(conn, &target_fname, - conn->cwd_fsp, - new_smb_fname); + parent_fname->fsp, + base_name); if (ret != 0) { + TALLOC_FREE(parent_fname); return map_nt_error_from_unix(errno); } + TALLOC_FREE(parent_fname); return NT_STATUS_OK; } -- Samba Shared Repository