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

Reply via email to