s3:smb2_lock: use fsp->fnum as locking context
[ddiss/samba.git] / source3 / smbd / smb2_lock.c
index 80ce2bc8c12689b021b0f6c3eb34d2746468ad88..be403eefe8e50b8dc7dc93a9ea46e7bbbf173db1 100644 (file)
 */
 
 #include "includes.h"
+#include "smbd/smbd.h"
 #include "smbd/globals.h"
 #include "../libcli/smb/smb_common.h"
-#include "librpc/gen_ndr/messaging.h"
+#include "../lib/util/tevent_ntstatus.h"
+#include "messages.h"
 
 struct smbd_smb2_lock_element {
        uint64_t offset;
@@ -56,8 +58,6 @@ NTSTATUS smbd_smb2_request_process_lock(struct smbd_smb2_request *req)
        const uint8_t *inhdr;
        const uint8_t *inbody;
        const int i = req->current_idx;
-       size_t expected_body_size = 0x30;
-       size_t body_size;
        uint32_t in_smbpid;
        uint16_t in_lock_count;
        uint64_t in_file_id_persistent;
@@ -66,19 +66,15 @@ NTSTATUS smbd_smb2_request_process_lock(struct smbd_smb2_request *req)
        struct tevent_req *subreq;
        const uint8_t *lock_buffer;
        uint16_t l;
+       NTSTATUS status;
 
-       inhdr = (const uint8_t *)req->in.vector[i+0].iov_base;
-       if (req->in.vector[i+1].iov_len != (expected_body_size & 0xFFFFFFFE)) {
-               return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
+       status = smbd_smb2_request_verify_sizes(req, 0x30);
+       if (!NT_STATUS_IS_OK(status)) {
+               return smbd_smb2_request_error(req, status);
        }
-
+       inhdr = (const uint8_t *)req->in.vector[i+0].iov_base;
        inbody = (const uint8_t *)req->in.vector[i+1].iov_base;
 
-       body_size = SVAL(inbody, 0x00);
-       if (body_size != expected_body_size) {
-               return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
-       }
-
        in_smbpid                       = IVAL(inhdr, SMB2_HDR_PID);
 
        in_lock_count                   = CVAL(inbody, 0x02);
@@ -339,7 +335,7 @@ static struct tevent_req *smbd_smb2_lock_send(TALLOC_CTX *mem_ctx,
                        return tevent_req_post(req, ev);
                }
 
-               locks[i].smblctx = in_file_id_volatile;
+               locks[i].smblctx = fsp->fnum;
                locks[i].offset = in_locks[i].offset;
                locks[i].count  = in_locks[i].length;
 
@@ -870,10 +866,8 @@ void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
                struct smbd_smb2_lock_state *state = NULL;
                files_struct *fsp_curr = NULL;
                int i = smb2req->current_idx;
-               uint64_t in_file_id_volatile;
                struct blocking_lock_record *blr = NULL;
                const uint8_t *inhdr;
-               const uint8_t *inbody;
 
                nextreq = smb2req->next;
 
@@ -892,9 +886,6 @@ void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
                        continue;
                }
 
-               inbody = (const uint8_t *)smb2req->in.vector[i+1].iov_base;
-               in_file_id_volatile = BVAL(inbody, 0x10);
-
                state = tevent_req_data(smb2req->subreq,
                                struct smbd_smb2_lock_state);
                if (!state) {
@@ -902,7 +893,7 @@ void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
                        continue;
                }
 
-               fsp_curr = file_fsp(state->smb1req, (uint16_t)in_file_id_volatile);
+               fsp_curr = smb2req->compat_chain_fsp;
                if (fsp_curr == NULL) {
                        /* Strange - is this even possible ? */
                        continue;