struct tevent_queue *out_queue;
struct dcerpc_call *list;
struct dcerpc_call *active;
+ struct dcerpc_call *new_call;
} calls;
struct {
return;
}
+ if (conn->calls.active != NULL) {
+ if (pkt->call_id != conn->calls.active->call_id) {
+ TALLOC_FREE(subreq);
+ // disconnect and notify pending calls NT_STATUS_RPC_PROTOCOL_ERROR;
+ return;
+ }
+ call = conn->calls.active;
+ } else {
+ call = conn->calls.list;
+ }
+
for (call = conn->calls.list; call; call = call->next) {
if (call->call_id == pkt->call_id) {
break;
}
}
+ if (call == NULL) {
+ call = conn->calls.new_call;
+ }
+
if (call == NULL) {
TALLOC_FREE(subreq);
// disconnect and notify pending calls NT_STATUS_RPC_PROTOCOL_ERROR;
return;
}
+ if (conn->calls.new_call == NULL) {
+ conn->loop.ev = NULL;
+ return;
+ }
+
error = dcerpc_connection_loop_restart(conn, conn->loop.ev);
if (!NT_STATUS_IS_OK(error)) {
// disconnect and notify pending calls
DLIST_ADD_END(state->conn->calls.list, state->call, NULL);
tevent_req_set_cleanup_fn(req, dcerpc_do_bind_cleanup);
+ tevent_req_defer_callback(req, ev);
if (state->sec != NULL && state->sec->gensec != NULL) {
subreq = gensec_update_send(state, ev,
NTSTATUS status;
size_t i;
- DLIST_REMOVE(state->conn->calls.list, state->call);
-
/* Ensure we have the correct type. */
switch (pkt->ptype) {
case DCERPC_PKT_BIND_ACK:
DLIST_ADD_END(state->conn->calls.list, state->call, NULL);
tevent_req_set_cleanup_fn(req, dcerpc_do_request_cleanup);
+ tevent_req_defer_callback(req, ev);
ok = tevent_queue_add(state->conn->calls.out_queue,
state->ev,