avoid SMB_ASSERT(!req->request_counters_updated); on re-dispatched requests
authorStefan Metzmacher <metze@samba.org>
Fri, 13 Jul 2018 14:01:26 +0000 (16:01 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 15 Oct 2019 07:36:38 +0000 (09:36 +0200)
source3/smbd/globals.h
source3/smbd/smb2_create.c
source3/smbd/smb2_server.c

index 1e4cfc1e4667768c5b63d2f3e027129ddcb3cd8b..171bed2ed31aed977dad0bddfb2fd633e39e3960 100644 (file)
@@ -723,6 +723,7 @@ struct smbd_smb2_request {
         * had been updated in dispatch, so that they need to be
         * adapted again in reply.
         */
+       bool re_dispatching;
        bool request_counters_updated;
        uint64_t channel_generation;
 
index 6cf3499c411c8dad84afc4aaf996ddcb5a95fe42..3b1fb25f9b60444e77b0356afab4e88d9f6a541b 100644 (file)
@@ -1745,6 +1745,7 @@ static void smbd_smb2_create_request_dispatch_immediate(struct tevent_context *c
                "re-dispatching mid %llu\n",
                (unsigned long long)mid ));
 
+       smb2req->re_dispatching = true;
        status = smbd_smb2_request_dispatch(smb2req);
        if (!NT_STATUS_IS_OK(status)) {
                smbd_server_connection_terminate(smb2req->xconn,
index 5a98a2e82d4d4e21b9f07ed4d28f966dffe15621..6871d98e4384ba13eafa60c6dcc1cbabe93c25c5 100644 (file)
@@ -2210,6 +2210,10 @@ static NTSTATUS smbd_smb2_request_dispatch_update_counts(
        bool update_open = false;
        NTSTATUS status = NT_STATUS_OK;
 
+       if (!smb2req->re_dispatching) {
+               return NT_STATUS_OK;
+       }
+
        SMB_ASSERT(!req->request_counters_updated);
 
        if (xconn->protocol < PROTOCOL_SMB2_22) {
@@ -2345,7 +2349,9 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 
        DO_PROFILE_INC(request);
 
-       SMB_ASSERT(!req->request_counters_updated);
+       if (!smb2req->re_dispatching) {
+               SMB_ASSERT(!req->request_counters_updated);
+       }
 
        /* TODO: verify more things */
 
@@ -2851,6 +2857,7 @@ static NTSTATUS smbd_smb2_request_reply(struct smbd_smb2_request *req)
 
        /* MS-SMB2: 3.3.4.1 Sending Any Outgoing Message */
        smbd_smb2_request_reply_update_counts(req);
+       req->re_dispatching = false;
 
        if (req->do_encryption &&
            (firsttf->iov_len == 0) &&