mirror of
https://github.com/samba-team/samba.git
synced 2025-03-11 16:58:40 +03:00
s3: smbd: Allow fchmod from the NFS-style mode ACL in set_nt_acl() for a SMB2 POSIX handle.
To set a mode, send a one-element ACL. Pair-Programmed-With: Ralph Boehme <slow@samba.org> Signed-off-by: Jeremy Allison <jra@samba.org> Signed-off-by: Ralph Boehme <slow@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Mon Nov 27 19:31:01 UTC 2023 on atb-devel-224
This commit is contained in:
parent
631e6aa0d0
commit
8f42b8431e
@ -167,6 +167,50 @@ NTSTATUS set_sd(files_struct *fsp, struct security_descriptor *psd,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool check_smb2_posix_chmod_ace(const struct files_struct *fsp,
|
||||||
|
uint32_t security_info_sent,
|
||||||
|
struct security_descriptor *psd,
|
||||||
|
mode_t *pmode)
|
||||||
|
{
|
||||||
|
int cmp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This must be an ACL with one ACE containing an
|
||||||
|
* MS NFS style mode entry coming in on a POSIX
|
||||||
|
* handle over SMB2+.
|
||||||
|
*/
|
||||||
|
if (!fsp->conn->sconn->using_smb2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(fsp->posix_flags & FSP_POSIX_FLAGS_OPEN)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(security_info_sent & SECINFO_DACL)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (psd->dacl == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (psd->dacl->num_aces != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmp = dom_sid_compare_domain(&global_sid_Unix_NFS_Mode,
|
||||||
|
&psd->dacl->aces[0].trustee);
|
||||||
|
if (cmp != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pmode = (mode_t)psd->dacl->aces[0].trustee.sub_auths[2];
|
||||||
|
*pmode &= (S_IRWXU | S_IRWXG | S_IRWXO);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Internal fn to set security descriptors from a data blob.
|
Internal fn to set security descriptors from a data blob.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -176,6 +220,9 @@ NTSTATUS set_sd_blob(files_struct *fsp, uint8_t *data, uint32_t sd_len,
|
|||||||
{
|
{
|
||||||
struct security_descriptor *psd = NULL;
|
struct security_descriptor *psd = NULL;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
bool do_chmod = false;
|
||||||
|
mode_t smb2_posix_mode = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (sd_len == 0) {
|
if (sd_len == 0) {
|
||||||
return NT_STATUS_INVALID_PARAMETER;
|
return NT_STATUS_INVALID_PARAMETER;
|
||||||
@ -187,7 +234,27 @@ NTSTATUS set_sd_blob(files_struct *fsp, uint8_t *data, uint32_t sd_len,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
return set_sd(fsp, psd, security_info_sent);
|
do_chmod = check_smb2_posix_chmod_ace(fsp,
|
||||||
|
security_info_sent,
|
||||||
|
psd,
|
||||||
|
&smb2_posix_mode);
|
||||||
|
if (!do_chmod) {
|
||||||
|
return set_sd(fsp, psd, security_info_sent);
|
||||||
|
}
|
||||||
|
|
||||||
|
TALLOC_FREE(psd);
|
||||||
|
|
||||||
|
ret = SMB_VFS_FCHMOD(fsp, smb2_posix_mode);
|
||||||
|
if (ret != 0) {
|
||||||
|
status = map_nt_error_from_unix(errno);
|
||||||
|
DBG_ERR("smb2_posix_chmod [%s] [%04o] failed: %s\n",
|
||||||
|
fsp_str_dbg(fsp),
|
||||||
|
(unsigned)smb2_posix_mode,
|
||||||
|
nt_errstr(status));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
Loading…
x
Reference in New Issue
Block a user