diff options
author | Ralph Boehme <slow@samba.org> | 2016-08-24 10:30:15 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2016-08-30 21:12:25 +0200 |
commit | 10959698e20de381beec7ab532c8bdc32fa6401c (patch) | |
tree | a393e721b24262ba4a0b669be2e1987113ece06a /source3 | |
parent | 61c3d2124fb1a180fae4c8c0b5ab5b32bd56c8ad (diff) | |
download | samba-10959698e20de381beec7ab532c8bdc32fa6401c.tar.gz |
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>
Diffstat (limited to 'source3')
-rw-r--r-- | source3/modules/vfs_acl_common.c | 79 |
1 files changed, 48 insertions, 31 deletions
diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c index 5e0b1bf5aca..ccb9b4b575e 100644 --- a/source3/modules/vfs_acl_common.c +++ b/source3/modules/vfs_acl_common.c @@ -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) { |