]> 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)
committerVolker Lendecke <vl@samba.org>
Wed, 26 Feb 2025 09:00:34 +0000 (09:00 +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

source3/modules/vfs_streams_depot.c

index 322e04268b87209d852de25d9016dd7731807d7f..4da66d6cce49afac9904313e9c7daa7a8d0cd203 100644 (file)
@@ -680,6 +680,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;
 
@@ -698,6 +699,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) {
@@ -705,8 +714,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);