We must always do SMB3+POSIX operations on fsp's opened with a posix create context.
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
struct tevent_req *subreq,
uint32_t defer_time);
-struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req);
+struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req,
+ struct files_struct *fsp);
size_t smbd_smb2_unread_bytes(struct smbd_smb2_request *req);
void remove_smb2_chained_fsp(files_struct *fsp);
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp),
oplocklevel));
- smbreq = smbd_smb2_fake_smb_request(smb2req);
+ smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}
DEBUG(10,("smbd_smb2_close: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
- smbreq = smbd_smb2_fake_smb_request(req);
+ smbreq = smbd_smb2_fake_smb_request(req, fsp);
if (smbreq == NULL) {
return NT_STATUS_NO_MEMORY;
}
.in_create_disposition = in_create_disposition,
};
- smb1req = smbd_smb2_fake_smb_request(smb2req);
+ smb1req = smbd_smb2_fake_smb_request(smb2req, NULL);
if (tevent_req_nomem(smb1req, req)) {
return tevent_req_post(req, state->ev);
}
DEBUG(10,("smbd_smb2_flush: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
- smbreq = smbd_smb2_fake_smb_request(smb2req);
+ smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}
DEBUG(10,("smbd_smb2_getinfo_send: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
- smbreq = smbd_smb2_fake_smb_request(smb2req);
+ smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_SMB2
-struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req)
+struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req,
+ struct files_struct *fsp)
{
struct smb_request *smbreq;
const uint8_t *inhdr = SMBD_SMB2_IN_HDR_PTR(req);
}
smbreq->mid = BVAL(inhdr, SMB2_HDR_MESSAGE_ID);
smbreq->chain_fsp = req->compat_chain_fsp;
+ if (fsp != NULL) {
+ smbreq->posix_pathnames =
+ (fsp->fsp_name->flags & SMB_FILENAME_POSIX_PATH);
+ }
smbreq->smb2req = req;
req->smb1req = smbreq;
fsp ? fsp_str_dbg(fsp) : "<no handle>",
fsp_fnum_dbg(fsp)));
- smbreq = smbd_smb2_fake_smb_request(smb2req);
+ smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}
tevent_req_set_cleanup_fn(req, smbd_smb2_lock_cleanup);
- state->smb1req = smbd_smb2_fake_smb_request(smb2req);
+ state->smb1req = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(state->smb1req, req)) {
return tevent_req_post(req, ev);
}
DEBUG(10,("smbd_smb2_notify_send: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
- smbreq = smbd_smb2_fake_smb_request(smb2req);
+ smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}
DEBUG(10,("smbd_smb2_query_directory_send: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
- state->smbreq = smbd_smb2_fake_smb_request(smb2req);
+ state->smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(state->smbreq, req)) {
return tevent_req_post(req, ev);
}
DEBUG(10,("smbd_smb2_read: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
- smbreq = smbd_smb2_fake_smb_request(smb2req);
+ smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}
DEBUG(10,("smbd_smb2_setinfo_send: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
- smbreq = smbd_smb2_fake_smb_request(smb2req);
+ smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}
DEBUG(10,("smbd_smb2_write: %s - %s\n",
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
- smbreq = smbd_smb2_fake_smb_request(smb2req);
+ smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}