smb2_create: allow cancellation even with state->open_rec == NULL
authorStefan Metzmacher <metze@samba.org>
Mon, 1 Mar 2021 13:08:24 +0000 (14:08 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 8 Feb 2023 09:29:17 +0000 (10:29 +0100)
Note that tevent_req_data() can never return NULL and
state->smb2req is never reset to NULL.

In future we'll also have async processing without going
via push_deferred_open_message_smb2().

Signed-off-by: Stefan Metzmacher <metze@samba.org>
source3/smbd/smb2_create.c

index 7b934281faace665d00c6190afaef583f65cac20..2e61e545181d1157dd6bf86c59bac6a125b81edc 100644 (file)
@@ -696,6 +696,7 @@ static NTSTATUS smbd_smb2_create_fetch_create_ctx(
        return NT_STATUS_OK;
 }
 
+static bool smbd_smb2_create_cancel(struct tevent_req *req);
 static void smbd_smb2_create_schedule_redispatch(struct tevent_req *req);
 static void smbd_smb2_create_before_exec(struct tevent_req *req);
 static void smbd_smb2_create_after_exec(struct tevent_req *req);
@@ -770,6 +771,9 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
        TALLOC_FREE(smb2req->subreq);
        smb2req->subreq = req;
 
+       /* allow this request to be canceled */
+       tevent_req_set_cancel_fn(req, smbd_smb2_create_cancel);
+
        if (lp_fake_oplocks(SNUM(smb2req->tcon->compat))) {
                state->requested_oplock_level = SMB2_OPLOCK_LEVEL_NONE;
        } else {
@@ -1964,30 +1968,22 @@ static void smbd_smb2_create_schedule_redispatch(struct tevent_req *req)
 
 static bool smbd_smb2_create_cancel(struct tevent_req *req)
 {
-       struct smbd_smb2_request *smb2req = NULL;
        struct smbd_smb2_create_state *state = tevent_req_data(req,
                                struct smbd_smb2_create_state);
-       uint64_t mid;
-
-       if (!state) {
-               return false;
-       }
 
-       if (!state->smb2req) {
-               return false;
-       }
+       if (state->open_rec != NULL) {
+               struct smbd_smb2_request *smb2req = state->smb2req;
+               uint64_t mid = get_mid_from_smb2req(smb2req);
 
-       smb2req = state->smb2req;
-       mid = get_mid_from_smb2req(smb2req);
+               if (is_deferred_open_async(state->open_rec)) {
+                       /* Can't cancel an async create. */
+                       return false;
+               }
 
-       if (is_deferred_open_async(state->open_rec)) {
-               /* Can't cancel an async create. */
-               return false;
+               remove_deferred_open_message_smb2_internal(smb2req, mid);
        }
 
-       remove_deferred_open_message_smb2_internal(smb2req, mid);
-
-       tevent_req_defer_callback(req, smb2req->sconn->ev_ctx);
+       tevent_req_defer_callback(req, state->ev);
        tevent_req_nterror(req, NT_STATUS_CANCELLED);
        return true;
 }
@@ -2028,8 +2024,5 @@ bool push_deferred_open_message_smb2(struct smbd_smb2_request *smb2req,
 
        state->open_was_deferred = true;
 
-       /* allow this request to be canceled */
-       tevent_req_set_cancel_fn(req, smbd_smb2_create_cancel);
-
        return true;
 }