From ff239148ac6bcf30cf36411cc13a92110a47e5a6 Mon Sep 17 00:00:00 2001 From: Julien Kerihuel Date: Mon, 30 Mar 2015 03:53:19 +0200 Subject: [PATCH] Add a flag to dcerpc server to skip outstanding pending call upon termination of connection and call unbind operation of the interface instead. --- source4/rpc_server/dcerpc_server.c | 11 ++++++++++- source4/rpc_server/dcerpc_server.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index a8785b0..930856b 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -620,6 +620,10 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call) extra_flags |= DCERPC_PFC_FLAG_CONC_MPX; } + if (call->state_flags & DCESRV_CALL_STATE_FLAG_SKIP_PENDING_CALL) { + call->context->conn->state_flags |= DCESRV_CALL_STATE_FLAG_SKIP_PENDING_CALL; + } + /* handle any authentication that is being requested */ if (!dcesrv_auth_bind(call)) { talloc_free(call->context); @@ -839,6 +843,10 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call) } } + if (call->state_flags & DCESRV_CALL_STATE_FLAG_SKIP_PENDING_CALL) { + call->context->conn->state_flags |= DCESRV_CALL_STATE_FLAG_SKIP_PENDING_CALL; + } + /* setup a alter_resp */ dcesrv_init_hdr(&pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx)); pkt.auth_length = 0; @@ -1348,7 +1356,8 @@ static void dcesrv_terminate_connection(struct dcesrv_connection *dce_conn, cons srv_conn = talloc_get_type(dce_conn->transport.private_data, struct stream_connection); - if (dce_conn->pending_call_list == NULL) { + if ((dce_conn->pending_call_list == NULL) || + (dce_conn->state_flags & DCESRV_CALL_STATE_FLAG_SKIP_PENDING_CALL)) { char *full_reason = talloc_asprintf(dce_conn, "dcesrv: %s", reason); DLIST_REMOVE(dce_ctx->broken_connections, dce_conn); diff --git a/source4/rpc_server/dcerpc_server.h b/source4/rpc_server/dcerpc_server.h index 1bf187a..9113c51 100644 --- a/source4/rpc_server/dcerpc_server.h +++ b/source4/rpc_server/dcerpc_server.h @@ -102,6 +102,7 @@ struct dcesrv_call_state { #define DCESRV_CALL_STATE_FLAG_ASYNC (1<<0) #define DCESRV_CALL_STATE_FLAG_MAY_ASYNC (1<<1) #define DCESRV_CALL_STATE_FLAG_MULTIPLEXED (1<<3) +#define DCESRV_CALL_STATE_FLAG_SKIP_PENDING_CALL (1<<4) uint32_t state_flags; /* the time the request arrived in the server */ -- 1.9.1