From 3909ad4690b75ebcfa8c9060435961d7a71e28a6 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 8 Jun 2012 10:36:24 +0200 Subject: s3:smb2_break: make use of file_fsp_smb2() metze --- source3/smbd/smb2_break.c | 45 +++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/source3/smbd/smb2_break.c b/source3/smbd/smb2_break.c index 310b24bb39..75505e5ab8 100644 --- a/source3/smbd/smb2_break.c +++ b/source3/smbd/smb2_break.c @@ -28,8 +28,8 @@ static struct tevent_req *smbd_smb2_oplock_break_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct smbd_smb2_request *smb2req, - uint8_t in_oplock_level, - uint64_t in_file_id_volatile); + struct files_struct *in_fsp, + uint8_t in_oplock_level); static NTSTATUS smbd_smb2_oplock_break_recv(struct tevent_req *req, uint8_t *out_oplock_level); @@ -42,6 +42,7 @@ NTSTATUS smbd_smb2_request_process_break(struct smbd_smb2_request *req) uint8_t in_oplock_level; uint64_t in_file_id_persistent; uint64_t in_file_id_volatile; + struct files_struct *in_fsp; struct tevent_req *subreq; status = smbd_smb2_request_verify_sizes(req, 0x18); @@ -62,17 +63,13 @@ NTSTATUS smbd_smb2_request_process_break(struct smbd_smb2_request *req) in_file_id_persistent = BVAL(inbody, 0x08); in_file_id_volatile = BVAL(inbody, 0x10); - if (req->compat_chain_fsp) { - /* skip check */ - } else if (in_file_id_persistent != in_file_id_volatile) { + in_fsp = file_fsp_smb2(req, in_file_id_persistent, in_file_id_volatile); + if (in_fsp == NULL) { return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED); } - subreq = smbd_smb2_oplock_break_send(req, - req->sconn->ev_ctx, - req, - in_oplock_level, - in_file_id_volatile); + subreq = smbd_smb2_oplock_break_send(req, req->sconn->ev_ctx, + req, in_fsp, in_oplock_level); if (subreq == NULL) { return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY); } @@ -148,14 +145,12 @@ struct smbd_smb2_oplock_break_state { static struct tevent_req *smbd_smb2_oplock_break_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct smbd_smb2_request *smb2req, - uint8_t in_oplock_level, - uint64_t in_file_id_volatile) + struct files_struct *fsp, + uint8_t in_oplock_level) { struct tevent_req *req; struct smbd_smb2_oplock_break_state *state; struct smb_request *smbreq; - connection_struct *conn = smb2req->tcon->compat_conn; - files_struct *fsp = NULL; int oplocklevel = map_smb2_oplock_levels_to_samba(in_oplock_level); bool break_to_none = (oplocklevel == NO_OPLOCK); bool result; @@ -168,30 +163,16 @@ static struct tevent_req *smbd_smb2_oplock_break_send(TALLOC_CTX *mem_ctx, state->smb2req = smb2req; state->out_oplock_level = SMB2_OPLOCK_LEVEL_NONE; - DEBUG(10,("smbd_smb2_oplock_break_send: file_id[0x%016llX] " - "samba level %d\n", - (unsigned long long)in_file_id_volatile, - oplocklevel)); + DEBUG(10,("smbd_smb2_oplock_break_send: %s - fnum[%d] " + "samba level %d\n", + fsp_str_dbg(fsp), fsp->fnum, + oplocklevel)); smbreq = smbd_smb2_fake_smb_request(smb2req); if (tevent_req_nomem(smbreq, req)) { return tevent_req_post(req, ev); } - fsp = file_fsp(smbreq, (uint16_t)in_file_id_volatile); - if (fsp == NULL) { - tevent_req_nterror(req, NT_STATUS_FILE_CLOSED); - return tevent_req_post(req, ev); - } - if (conn != fsp->conn) { - tevent_req_nterror(req, NT_STATUS_FILE_CLOSED); - return tevent_req_post(req, ev); - } - if (smb2req->session->vuid != fsp->vuid) { - tevent_req_nterror(req, NT_STATUS_FILE_CLOSED); - return tevent_req_post(req, ev); - } - DEBUG(5,("smbd_smb2_oplock_break_send: got SMB2 oplock break (%u) from client " "for file %s fnum = %d\n", (unsigned int)in_oplock_level, -- cgit