]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: gluster. Ensure read_dfs_pathat() returns stat info.
authorJeremy Allison <jra@samba.org>
Sat, 30 May 2020 00:49:17 +0000 (17:49 -0700)
committerRalph Boehme <slow@samba.org>
Wed, 3 Jun 2020 04:54:39 +0000 (04:54 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14391

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/modules/vfs_glusterfs.c

index 658e4635eef3a40e9daaf0b3f982e32957b2701c..ff5382af9fb0bcc765b4c46bf5a4bfed15304cf5 100644 (file)
@@ -1955,9 +1955,16 @@ static NTSTATUS vfs_gluster_read_dfs_pathat(struct vfs_handle_struct *handle,
 #else
        char link_target_buf[7];
 #endif
+       struct stat st;
+       int ret;
 
        SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
 
+       if (is_named_stream(smb_fname)) {
+               status = NT_STATUS_OBJECT_NAME_NOT_FOUND;
+               goto err;
+       }
+
        if (ppreflist == NULL && preferral_count == NULL) {
                /*
                 * We're only checking if this is a DFS
@@ -1973,6 +1980,12 @@ static NTSTATUS vfs_gluster_read_dfs_pathat(struct vfs_handle_struct *handle,
                }
        }
 
+       ret = glfs_lstat(handle->data, smb_fname->base_name, &st);
+       if (ret < 0) {
+               status = map_nt_error_from_unix(errno);
+               goto err;
+       }
+
        referral_len = glfs_readlink(handle->data,
                                smb_fname->base_name,
                                link_target,
@@ -2003,6 +2016,7 @@ static NTSTATUS vfs_gluster_read_dfs_pathat(struct vfs_handle_struct *handle,
 
        if (ppreflist == NULL && preferral_count == NULL) {
                /* Early return for checking if this is a DFS link. */
+               smb_stat_ex_from_stat(&smb_fname->st, &st);
                return NT_STATUS_OK;
        }
 
@@ -2013,6 +2027,7 @@ static NTSTATUS vfs_gluster_read_dfs_pathat(struct vfs_handle_struct *handle,
                        preferral_count);
 
        if (ok) {
+               smb_stat_ex_from_stat(&smb_fname->st, &st);
                status = NT_STATUS_OK;
        } else {
                status = NT_STATUS_NO_MEMORY;