mirror of
https://github.com/samba-team/samba.git
synced 2025-02-26 21:57:41 +03:00
vfs_acl_common: move stat stuff to a helper function
Will be reused in the next commit when moving the make_default_filesystem_acl() stuff to a different place. Bug: https://bugzilla.samba.org/show_bug.cgi?id=12177 Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
parent
61c3d2124f
commit
10959698e2
@ -697,6 +697,48 @@ fail:
|
||||
return status;
|
||||
}
|
||||
|
||||
static NTSTATUS stat_fsp_or_smb_fname(vfs_handle_struct *handle,
|
||||
files_struct *fsp,
|
||||
const struct smb_filename *smb_fname,
|
||||
SMB_STRUCT_STAT *sbuf,
|
||||
SMB_STRUCT_STAT **psbuf)
|
||||
{
|
||||
NTSTATUS status;
|
||||
int ret;
|
||||
|
||||
if (fsp) {
|
||||
status = vfs_stat_fsp(fsp);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
}
|
||||
*psbuf = &fsp->fsp_name->st;
|
||||
} else {
|
||||
/*
|
||||
* https://bugzilla.samba.org/show_bug.cgi?id=11249
|
||||
*
|
||||
* We are currently guaranteed that 'name' here is a
|
||||
* smb_fname->base_name, which *cannot* contain a stream name
|
||||
* (':'). vfs_stat_smb_fname() splits a name into a base name +
|
||||
* stream name, which when we get here we know we've already
|
||||
* done. So we have to call the stat or lstat VFS calls
|
||||
* directly here. Else, a base_name that contains a ':' (from a
|
||||
* demangled name) will get split again.
|
||||
*
|
||||
* FIXME.
|
||||
* This uglyness will go away once smb_fname is fully plumbed
|
||||
* through the VFS.
|
||||
*/
|
||||
ret = vfs_stat_smb_basename(handle->conn,
|
||||
smb_fname,
|
||||
sbuf);
|
||||
if (ret == -1) {
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
}
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
Pull a DATA_BLOB from an xattr given a pathname.
|
||||
If the hash doesn't match, or doesn't exist - return the underlying
|
||||
@ -784,38 +826,13 @@ static NTSTATUS get_nt_acl_internal(vfs_handle_struct *handle,
|
||||
* filesystem. If it's a directory, and has no
|
||||
* inheritable ACE entries we have to fake them.
|
||||
*/
|
||||
if (fsp) {
|
||||
status = vfs_stat_fsp(fsp);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto fail;
|
||||
}
|
||||
psbuf = &fsp->fsp_name->st;
|
||||
} else {
|
||||
/*
|
||||
* https://bugzilla.samba.org/show_bug.cgi?id=11249
|
||||
*
|
||||
* We are currently guaranteed that 'name' here is
|
||||
* a smb_fname->base_name, which *cannot* contain
|
||||
* a stream name (':'). vfs_stat_smb_fname() splits
|
||||
* a name into a base name + stream name, which
|
||||
* when we get here we know we've already done.
|
||||
* So we have to call the stat or lstat VFS
|
||||
* calls directly here. Else, a base_name that
|
||||
* contains a ':' (from a demangled name) will
|
||||
* get split again.
|
||||
*
|
||||
* FIXME.
|
||||
* This uglyness will go away once smb_fname
|
||||
* is fully plumbed through the VFS.
|
||||
*/
|
||||
int ret = vfs_stat_smb_basename(handle->conn,
|
||||
smb_fname,
|
||||
&sbuf);
|
||||
if (ret == -1) {
|
||||
status = map_nt_error_from_unix(errno);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
status = stat_fsp_or_smb_fname(handle, fsp, smb_fname,
|
||||
&sbuf, &psbuf);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
is_directory = S_ISDIR(psbuf->st_ex_mode);
|
||||
|
||||
if (config->ignore_system_acls) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user