#endif
/********************************************************************
- The canonical "check access" based on object handle or path function.
+ The canonical "check access" based on path.
********************************************************************/
static NTSTATUS check_access(connection_struct *conn,
- files_struct *fsp,
- const struct smb_filename *smb_fname,
- uint32_t access_mask)
+ struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname,
+ uint32_t access_mask)
{
- NTSTATUS status;
-
- if (fsp) {
- status = check_access_fsp(fsp, access_mask);
- } else {
- status = smbd_check_access_rights(conn, smb_fname,
- false, access_mask);
- }
-
- return status;
+ SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
+ return smbd_check_access_rights(conn,
+ dirfsp,
+ smb_fname,
+ false,
+ access_mask);
}
/********************************************************************
return status;
}
- status = check_access(conn, fsp, smb_fname, FILE_WRITE_EA);
+ if (fsp != NULL) {
+ status = check_access_fsp(fsp, FILE_WRITE_EA);
+ } else {
+ status = check_access(conn,
+ conn->cwd_fsp,
+ smb_fname,
+ FILE_WRITE_EA);
+ }
if (!NT_STATUS_IS_OK(status)) {
return status;
}
return NT_STATUS_INVALID_PARAMETER;
}
- status = check_access(conn, fsp, smb_fname, FILE_WRITE_ATTRIBUTES);
+ if (fsp != NULL) {
+ status = check_access_fsp(fsp, FILE_WRITE_ATTRIBUTES);
+ } else {
+ status = check_access(conn,
+ conn->cwd_fsp,
+ smb_fname,
+ FILE_WRITE_ATTRIBUTES);
+ }
if (!NT_STATUS_IS_OK(status)) {
return status;
}
DEBUG(10,("smb_set_info_standard: file %s\n",
smb_fname_str_dbg(smb_fname)));
- status = check_access(conn, fsp, smb_fname, FILE_WRITE_ATTRIBUTES);
+ if (fsp != NULL) {
+ status = check_access_fsp(fsp, FILE_WRITE_ATTRIBUTES);
+ } else {
+ status = check_access(conn,
+ conn->cwd_fsp,
+ smb_fname,
+ FILE_WRITE_ATTRIBUTES);
+ }
if (!NT_STATUS_IS_OK(status)) {
return status;
}