status = smbd_calculate_access_mask_fsp(fsp->conn->cwd_fsp,
fsp,
false,
+ false,
access_mask,
&access_mask);
if (!NT_STATUS_IS_OK(status)) {
struct files_struct *dirfsp,
struct files_struct *fsp,
bool use_privs,
+ bool ignore_readonly,
uint32_t *p_access_mask)
{
struct security_descriptor *sd = NULL;
*p_access_mask &= ~(FILE_GENERIC_WRITE | DELETE_ACCESS);
}
+ if (ignore_readonly) {
+ /*
+ * We end up here when the maximum access mask for the "MxAC"
+ * create context response is needed. That ignores the read-only
+ * attribute, cf smbtorture tests
+ * "smb2.maximum_allowed.read_only_file" and
+ * "smb2.maximum_allowed.read_only_dir".
+ */
+ goto done;
+ }
+
dosattrs = fdos_mode(fsp);
if (dosattrs & FILE_ATTRIBUTE_READONLY) {
*p_access_mask &= ~(FILE_GENERIC_WRITE | DELETE_ACCESS);
}
+done:
return NT_STATUS_OK;
}
NTSTATUS smbd_calculate_access_mask_fsp(struct files_struct *dirfsp,
struct files_struct *fsp,
bool use_privs,
+ bool ignore_readonly,
uint32_t access_mask,
uint32_t *access_mask_out)
{
dirfsp,
fsp,
use_privs,
+ ignore_readonly,
&access_mask);
if (!NT_STATUS_IS_OK(status)) {
}
status = smbd_calculate_access_mask_fsp(
- dirfsp, smb_fname->fsp, false, access_mask, &access_mask);
+ dirfsp, smb_fname->fsp, false, false, access_mask, &access_mask);
if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("smbd_calculate_access_mask_fsp "
"on file %s returned %s\n",
}
status = smbd_calculate_access_mask_fsp(
- dirfsp, smb_dname->fsp, false, access_mask, &access_mask);
+ dirfsp, smb_dname->fsp, false, false, access_mask, &access_mask);
if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("smbd_calculate_access_mask_fsp "
"on file %s returned %s\n",