(fsp_get_io_fd(fsp) != -1) && \
(((fsp)->fsp_flags.can_read)))
-#define CHECK_WRITE(fsp) \
- ((fsp)->fsp_flags.can_write && \
- (!(fsp)->fsp_flags.is_pathref) && \
- (fsp_get_io_fd(fsp) != -1))
-
#define ERROR_WAS_LOCK_DENIED(status) (NT_STATUS_EQUAL((status), NT_STATUS_LOCK_NOT_GRANTED) || \
NT_STATUS_EQUAL((status), NT_STATUS_FILE_LOCK_CONFLICT) )
files_struct *src_fsp,
files_struct *dst_fsp)
{
+ NTSTATUS status;
+
if (src_fsp->vuid != dst_fsp->vuid) {
DBG_INFO("copy chunk handles not in the same session.\n");
return NT_STATUS_ACCESS_DENIED;
*
* A non writable dst handle also doesn't make sense for other fsctls.
*/
- if (!CHECK_WRITE(dst_fsp)) {
+ status = check_any_access_fsp(dst_fsp, FILE_WRITE_DATA|FILE_APPEND_DATA);
+ if (!NT_STATUS_IS_OK(status)) {
DBG_INFO("dest handle not writable (%s).\n",
smb_fname_str_dbg(dst_fsp->fsp_name));
- return NT_STATUS_ACCESS_DENIED;
+ return status;
}
/*
* - The Open.GrantedAccess of the destination file does not include
return;
}
- if (!CHECK_WRITE(fsp)) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ status = check_any_access_fsp(fsp, FILE_WRITE_DATA|FILE_APPEND_DATA);
+ if (!NT_STATUS_IS_OK(status)) {
+ reply_nterror(req, status);
error_to_writebrawerr(req);
END_PROFILE(SMBwritebraw);
return;
return;
}
- if (!CHECK_WRITE(fsp)) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ status = check_any_access_fsp(fsp, FILE_WRITE_DATA|FILE_APPEND_DATA);
+ if (!NT_STATUS_IS_OK(status)) {
+ reply_nterror(req, status);
END_PROFILE(SMBwriteunlock);
return;
}
return;
}
- if (!CHECK_WRITE(fsp)) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ status = check_any_access_fsp(fsp, FILE_WRITE_DATA|FILE_APPEND_DATA);
+ if (!NT_STATUS_IS_OK(status)) {
+ reply_nterror(req, status);
END_PROFILE(SMBwrite);
return;
}
goto out;
}
- if (!CHECK_WRITE(fsp)) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ status = check_any_access_fsp(fsp, FILE_WRITE_DATA|FILE_APPEND_DATA);
+ if (!NT_STATUS_IS_OK(status)) {
+ reply_nterror(req, status);
goto out;
}
struct timespec mtime;
files_struct *fsp;
struct lock_struct lock;
+ NTSTATUS status;
START_PROFILE(SMBwriteclose);
END_PROFILE(SMBwriteclose);
return;
}
- if (!CHECK_WRITE(fsp)) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ status = check_any_access_fsp(fsp, FILE_WRITE_DATA|FILE_APPEND_DATA);
+ if (!NT_STATUS_IS_OK(status)) {
+ reply_nterror(req, status);
END_PROFILE(SMBwriteclose);
return;
}
int numtowrite;
const char *data;
files_struct *fsp;
+ NTSTATUS status;
START_PROFILE(SMBsplwr);
return;
}
- if (!CHECK_WRITE(fsp)) {
- reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ status = check_any_access_fsp(fsp, FILE_WRITE_DATA|FILE_APPEND_DATA);
+ if (!NT_STATUS_IS_OK(status)) {
+ reply_nterror(req, status);
END_PROFILE(SMBsplwr);
return;
}
#include "../libcli/smb/smb_common.h"
#include "../lib/util/tevent_ntstatus.h"
#include "rpc_server/srv_pipe_hnd.h"
+#include "libcli/security/security.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_SMB2
return req;
}
- if (!CHECK_WRITE(fsp)) {
- tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
+ status = check_any_access_fsp(fsp, FILE_WRITE_DATA|FILE_APPEND_DATA);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
return tevent_req_post(req, ev);
}