STEP01x: dcerpc_server_connection_loop_handle_in_frag...
authorStefan Metzmacher <metze@samba.org>
Thu, 20 Mar 2014 09:25:04 +0000 (10:25 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Jun 2019 10:58:04 +0000 (12:58 +0200)
librpc/rpc/dcerpc_connection.c

index 978cbc1e987a6edca4751150e294d064a40a23f7..724bb8df27501450f0beb357c202165c9c5f2009 100644 (file)
@@ -3084,38 +3084,74 @@ static NTSTATUS dcerpc_server_connection_loop_handle_in_frag(struct tevent_req *
        struct dcerpc_server_connection_loop_state *state =
                tevent_req_data(req,
                struct dcerpc_server_connection_loop_state);
+       NTSTATUS error;
 
        if (!state->allow_incoming) {
                DEBUG(0, ("Unexpected packet type %u received from %s!\n",
                          (unsigned int)pkt->ptype,
                         "TODO"));
-               return NT_STATUS_RPC_PROTOCOL_ERROR;
+               error = dcerpc_submit_fault(state->conn, state->ev,
+                                           pkt->call_id,
+                                           0, /* context_id */
+                                           NT_STATUS_RPC_PROTOCOL_ERROR);
+               if (!NT_STATUS_IS_OK(error)) {
+                       return error;
+               }
+               return dcerpc_submit_shutdown(state->conn, state->ev);
        }
 
        /* Ensure we have the correct type. */
        switch (pkt->ptype) {
        case DCERPC_PKT_BIND:
                if (state->conn->features.bind_done) {
-                       return NT_STATUS_RPC_PROTOCOL_ERROR;
+                       error = dcerpc_submit_fault(state->conn, state->ev,
+                                                   pkt->call_id,
+                                                   0, /* context_id */
+                                                   NT_STATUS_RPC_PROTOCOL_ERROR);
+                       if (!NT_STATUS_IS_OK(error)) {
+                               return error;
+                       }
+                       return dcerpc_submit_shutdown(state->conn, state->ev);
                }
                state->allow_incoming = false;
                break;
 
        case DCERPC_PKT_AUTH3:
                if (!state->conn->features.bind_done) {
-                       return NT_STATUS_RPC_PROTOCOL_ERROR;
+                       error = dcerpc_submit_fault(state->conn, state->ev,
+                                                   pkt->call_id,
+                                                   0, /* context_id */
+                                                   NT_STATUS_RPC_PROTOCOL_ERROR);
+                       if (!NT_STATUS_IS_OK(error)) {
+                               return error;
+                       }
+                       return dcerpc_submit_shutdown(state->conn, state->ev);
                }
                break;
 
        case DCERPC_PKT_ALTER:
                if (!state->conn->features.bind_done) {
-                       return NT_STATUS_RPC_PROTOCOL_ERROR;
+                       error = dcerpc_submit_fault(state->conn, state->ev,
+                                                   pkt->call_id,
+                                                   0, /* context_id */
+                                                   NT_STATUS_RPC_PROTOCOL_ERROR);
+                       if (!NT_STATUS_IS_OK(error)) {
+                               return error;
+                       }
+                       return dcerpc_submit_shutdown(state->conn, state->ev);
                }
                break;
 
        case DCERPC_PKT_REQUEST:
                if (!state->conn->features.bind_done) {
-                       return NT_STATUS_RPC_PROTOCOL_ERROR;
+                       error = dcerpc_submit_fault(state->conn, state->ev,
+                                                   pkt->call_id,
+                                                   pkt->u.request.context_id,
+                                                   NT_STATUS_RPC_PROTOCOL_ERROR);
+                       if (!NT_STATUS_IS_OK(error)) {
+                               return error;
+                       }
+                       return dcerpc_submit_shutdown(state->conn, state->ev);
                }
                break;
 
@@ -3126,7 +3162,14 @@ static NTSTATUS dcerpc_server_connection_loop_handle_in_frag(struct tevent_req *
                DEBUG(0, ("Unknown packet type %u received from %s!\n",
                          (unsigned int)pkt->ptype,
                         "TODO"));
-               return NT_STATUS_RPC_PROTOCOL_ERROR;
+               error = dcerpc_submit_fault(state->conn, state->ev,
+                                           pkt->call_id,
+                                           pkt->u.request.context_id,
+                                           NT_STATUS_RPC_PROTOCOL_ERROR);
+               if (!NT_STATUS_IS_OK(error)) {
+                       return error;
+               }
+               return dcerpc_submit_shutdown(state->conn, state->ev);
        }
 
        // TODO check last_call_id range, here or in the main loop???