]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
vfs: Fix vfs_streams_depot's fstatat
authorVolker Lendecke <vl@samba.org>
Tue, 25 Feb 2025 11:09:58 +0000 (12:09 +0100)
committerJule Anger <janger@samba.org>
Thu, 21 Aug 2025 14:11:46 +0000 (14:11 +0000)
a24c7d566f2 does not cover subdirectories

Bug: https://bugzilla.samba.org/show_bug.cgi?id=15816
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
Autobuild-User(master): Volker Lendecke <vl@samba.org>
Autobuild-Date(master): Wed Feb 26 09:00:34 UTC 2025 on atb-devel-224

(cherry picked from commit 125862c617efae6926c91acae44206f29e61b148)

source3/modules/vfs_streams_depot.c

index dd4f8f524f81a30b06c0823fd50208001f50e62e..951f1af17a9f044337c90fc3503bb42b8e5f715e 100644 (file)
@@ -678,6 +678,7 @@ static int streams_depot_fstatat(struct vfs_handle_struct *handle,
 {
        struct smb_filename *smb_fname_stream = NULL;
        struct smb_filename *base_fname = NULL;
+       struct smb_filename *full_basename = NULL;
        NTSTATUS status;
        int ret = -1;
 
@@ -696,6 +697,14 @@ static int streams_depot_fstatat(struct vfs_handle_struct *handle,
                goto done;
        }
 
+       full_basename = full_path_from_dirfsp_atname(base_fname,
+                                                    dirfsp,
+                                                    smb_fname);
+       if (full_basename == NULL) {
+               errno = ENOMEM;
+               goto done;
+       }
+
        ret = SMB_VFS_NEXT_FSTATAT(
                handle, dirfsp, base_fname, &base_fname->st, flags);
        if (ret == -1) {
@@ -703,8 +712,11 @@ static int streams_depot_fstatat(struct vfs_handle_struct *handle,
        }
 
        /* lstat the actual stream now. */
-       status = stream_smb_fname(
-               handle, &base_fname->st, smb_fname, &smb_fname_stream, false);
+       status = stream_smb_fname(handle,
+                                 &base_fname->st,
+                                 full_basename,
+                                 &smb_fname_stream,
+                                 false);
        if (!NT_STATUS_IS_OK(status)) {
                ret = -1;
                errno = map_errno_from_nt_status(status);