s3:smb2_lock: use fsp->fnum as locking context
[ddiss/samba.git] / source3 / smbd / smb2_lock.c
index 94000b2df4e20bb183e222bf7dca480ab54987ba..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;
 
@@ -454,8 +450,16 @@ static void received_unlock_msg(struct messaging_context *msg,
                                struct server_id server_id,
                                DATA_BLOB *data)
 {
+       struct smbd_server_connection *sconn;
+
        DEBUG(10,("received_unlock_msg (SMB2)\n"));
-       process_blocking_lock_queue_smb2(smbd_server_conn, timeval_current());
+
+       sconn = msg_ctx_to_sconn(msg);
+       if (sconn == NULL) {
+               DEBUG(1, ("could not find sconn\n"));
+               return;
+       }
+       process_blocking_lock_queue_smb2(sconn, timeval_current());
 }
 
 /****************************************************************
@@ -635,10 +639,10 @@ bool push_blocking_lock_request_smb2( struct byte_range_lock *br_lck,
        blr->blr_private = NULL;
 
        /* Add a pending lock record for this. */
-       status = brl_lock(smbd_messaging_context(),
+       status = brl_lock(sconn->msg_ctx,
                        br_lck,
                        smblctx,
-                       procid_self(),
+                       sconn_server_id(sconn),
                        offset,
                        count,
                        lock_type == READ_LOCK ? PENDING_READ_LOCK : PENDING_WRITE_LOCK,
@@ -663,7 +667,7 @@ bool push_blocking_lock_request_smb2( struct byte_range_lock *br_lck,
 
        /* Ensure we'll receive messages when this is unlocked. */
        if (!sconn->smb2.locks.blocking_lock_unlock_state) {
-               messaging_register(smbd_messaging_context(), NULL,
+               messaging_register(sconn->msg_ctx, NULL,
                                MSG_SMB_UNLOCK, received_unlock_msg);
                sconn->smb2.locks.blocking_lock_unlock_state = true;
         }
@@ -690,7 +694,7 @@ static void remove_pending_lock(struct smbd_smb2_lock_state *state,
        if (br_lck) {
                brl_lock_cancel(br_lck,
                                blr->smblctx,
-                               procid_self(),
+                               sconn_server_id(blr->fsp->conn->sconn),
                                blr->offset,
                                blr->count,
                                blr->lock_flav,
@@ -703,7 +707,7 @@ static void remove_pending_lock(struct smbd_smb2_lock_state *state,
        for(i = blr->lock_num - 1; i >= 0; i--) {
                struct smbd_lock_element *e = &state->locks[i];
 
-               do_unlock(smbd_messaging_context(),
+               do_unlock(blr->fsp->conn->sconn->msg_ctx,
                        blr->fsp,
                        e->smblctx,
                        e->count,
@@ -720,7 +724,7 @@ static void remove_pending_lock(struct smbd_smb2_lock_state *state,
 static void reprocess_blocked_smb2_lock(struct smbd_smb2_request *smb2req,
                                struct timeval tv_curr)
 {
-       NTSTATUS status;
+       NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
        struct blocking_lock_record *blr = NULL;
        struct smbd_smb2_lock_state *state = NULL;
        files_struct *fsp = NULL;
@@ -742,7 +746,7 @@ static void reprocess_blocked_smb2_lock(struct smbd_smb2_request *smb2req,
                struct byte_range_lock *br_lck = NULL;
                struct smbd_lock_element *e = &state->locks[blr->lock_num];
 
-               br_lck = do_lock(smbd_messaging_context(),
+               br_lck = do_lock(fsp->conn->sconn->msg_ctx,
                                fsp,
                                e->smblctx,
                                e->count,
@@ -862,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;
 
@@ -884,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) {
@@ -894,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;
@@ -910,7 +909,7 @@ void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
                /* Remove the entries from the lock db. */
                brl_lock_cancel(br_lck,
                                blr->smblctx,
-                               procid_self(),
+                               sconn_server_id(sconn),
                                blr->offset,
                                blr->count,
                                blr->lock_flav,