s3:smb2_server: use smbd_smb2_request_verify_sizes() in smb2_lock.c
[metze/samba/wip.git] / source3 / smbd / smb2_lock.c
index 5cd8c5d5dbd8c09c6f6b0d0f54feffdd1b5ba0a0..ed1d688cfc59d8a00dd4906471174e3642502bb0 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);
@@ -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(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());
 }
 
 /****************************************************************
@@ -558,7 +562,7 @@ static bool recalc_smb2_brl_timeout(struct smbd_server_connection *sconn)
        }
 
        sconn->smb2.locks.brl_timeout = event_add_timed(
-                               smbd_event_context(),
+                               server_event_context(),
                                NULL,
                                next_timeout,
                                brl_timeout_fn,
@@ -618,9 +622,7 @@ bool push_blocking_lock_request_smb2( struct byte_range_lock *br_lck,
                blr->expire_time.tv_sec = 0;
                blr->expire_time.tv_usec = 0; /* Never expire. */
        } else {
-               blr->expire_time = timeval_current_ofs(
-                       lock_timeout/1000,
-                       (lock_timeout % 1000) * 1000);
+               blr->expire_time = timeval_current_ofs_msec(lock_timeout);
        }
 
        blr->lock_num = lock_num;
@@ -635,10 +637,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 +665,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 +692,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 +705,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 +722,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 +744,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,
@@ -819,9 +821,9 @@ static void reprocess_blocked_smb2_lock(struct smbd_smb2_request *smb2req,
  the request queue.
 *****************************************************************/
 
-void process_blocking_lock_queue_smb2(struct timeval tv_curr)
+void process_blocking_lock_queue_smb2(
+       struct smbd_server_connection *sconn, struct timeval tv_curr)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
        struct smbd_smb2_request *smb2req, *nextreq;
 
        for (smb2req = sconn->smb2.requests; smb2req; smb2req = nextreq) {
@@ -855,7 +857,7 @@ void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
                        struct byte_range_lock *br_lck,
                        enum file_close_type close_type)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
+       struct smbd_server_connection *sconn = fsp->conn->sconn;
        struct smbd_smb2_request *smb2req, *nextreq;
 
        for (smb2req = sconn->smb2.requests; smb2req; smb2req = nextreq) {
@@ -910,7 +912,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,