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;
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???