vfs_gpfs: Use O_PATH for opening dirfd for stat with CAP_DAC_OVERRIDE
authorChristof Schmitt <cs@samba.org>
Thu, 26 Oct 2023 21:37:15 +0000 (14:37 -0700)
committerJule Anger <janger@samba.org>
Sat, 25 Nov 2023 18:27:15 +0000 (18:27 +0000)
Use O_PATH when available; this avoids the need for READ/LIST access on
that directory. Keep using O_RDONLY if the system does not have O_PATH.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15507

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
(cherry picked from commit b317622a8fed0ee195ffe40129eb5bcad28dd985)

source3/modules/vfs_gpfs.c

index 3398879c900c290a317d9476f195c732915db8f9..b179eba8880f82fd616e025672b4a1cf0d81a7ed 100644 (file)
@@ -1603,6 +1603,11 @@ static int stat_with_capability(struct vfs_handle_struct *handle,
        struct smb_filename *dir_name = NULL;
        struct smb_filename *rel_name = NULL;
        int ret = -1;
+#ifdef O_PATH
+       int open_flags = O_PATH;
+#else
+       int open_flags = O_RDONLY;
+#endif
 
        status = SMB_VFS_PARENT_PATHNAME(handle->conn,
                                         talloc_tos(),
@@ -1614,7 +1619,7 @@ static int stat_with_capability(struct vfs_handle_struct *handle,
                return -1;
        }
 
-       fd = open(dir_name->base_name, O_RDONLY, 0);
+       fd = open(dir_name->base_name, open_flags, 0);
        if (fd == -1) {
                TALLOC_FREE(dir_name);
                return -1;