1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-07 17:18:11 +03:00

vfs_gpfs: Move stat_with_capability to nfs4_acls.c and rename function

All stat CAP_DAC_OVERRIDE code is moving to nfs4_acls.c to allow reuse
by other filesystem modules. Also rename the function to the slightly
more precise name stat_with_cap_dac_overide.

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

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Björn Jacke <bjacke@samba.org>
(cherry picked from commit 6b1e066c4f)
This commit is contained in:
Christof Schmitt 2023-11-09 12:20:38 -07:00 committed by Jule Anger
parent 53e4d90dbd
commit 776091ad50
3 changed files with 49 additions and 46 deletions

View File

@ -135,6 +135,49 @@ int fstatat_with_cap_dac_override(int fd,
return ret;
}
int stat_with_cap_dac_override(struct vfs_handle_struct *handle,
struct smb_filename *smb_fname, int flag)
{
bool fake_dctime = lp_fake_directory_create_times(SNUM(handle->conn));
int fd = -1;
NTSTATUS status;
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(),
smb_fname,
&dir_name,
&rel_name);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
}
fd = open(dir_name->base_name, open_flags, 0);
if (fd == -1) {
TALLOC_FREE(dir_name);
return -1;
}
ret = fstatat_with_cap_dac_override(fd,
rel_name->base_name,
&smb_fname->st,
flag,
fake_dctime);
TALLOC_FREE(dir_name);
close(fd);
return ret;
}
int fstat_with_cap_dac_override(int fd, SMB_STRUCT_STAT *sbuf,
bool fake_dir_create_times)
{

View File

@ -124,6 +124,9 @@ int fstatat_with_cap_dac_override(int fd,
int flags,
bool fake_dir_create_times);
int stat_with_cap_dac_override(struct vfs_handle_struct *handle,
struct smb_filename *smb_fname, int flag);
int fstat_with_cap_dac_override(int fd, SMB_STRUCT_STAT *sbuf,
bool fake_dir_create_times);

View File

@ -1594,49 +1594,6 @@ static NTSTATUS vfs_gpfs_fset_dos_attributes(struct vfs_handle_struct *handle,
return NT_STATUS_OK;
}
static int stat_with_capability(struct vfs_handle_struct *handle,
struct smb_filename *smb_fname, int flag)
{
bool fake_dctime = lp_fake_directory_create_times(SNUM(handle->conn));
int fd = -1;
NTSTATUS status;
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(),
smb_fname,
&dir_name,
&rel_name);
if (!NT_STATUS_IS_OK(status)) {
errno = map_errno_from_nt_status(status);
return -1;
}
fd = open(dir_name->base_name, open_flags, 0);
if (fd == -1) {
TALLOC_FREE(dir_name);
return -1;
}
ret = fstatat_with_cap_dac_override(fd,
rel_name->base_name,
&smb_fname->st,
flag,
fake_dctime);
TALLOC_FREE(dir_name);
close(fd);
return ret;
}
static int vfs_gpfs_stat(struct vfs_handle_struct *handle,
struct smb_filename *smb_fname)
{
@ -1646,7 +1603,7 @@ static int vfs_gpfs_stat(struct vfs_handle_struct *handle,
if (ret == -1 && errno == EACCES) {
DEBUG(10, ("Trying stat with capability for %s\n",
smb_fname->base_name));
ret = stat_with_capability(handle, smb_fname, 0);
ret = stat_with_cap_dac_override(handle, smb_fname, 0);
}
return ret;
}
@ -1681,8 +1638,8 @@ static int vfs_gpfs_lstat(struct vfs_handle_struct *handle,
if (ret == -1 && errno == EACCES) {
DEBUG(10, ("Trying lstat with capability for %s\n",
smb_fname->base_name));
ret = stat_with_capability(handle, smb_fname,
AT_SYMLINK_NOFOLLOW);
ret = stat_with_cap_dac_override(handle, smb_fname,
AT_SYMLINK_NOFOLLOW);
}
return ret;
}