diff options
-rw-r--r-- | source4/librpc/rpc/dcerpc_connect.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/source4/librpc/rpc/dcerpc_connect.c b/source4/librpc/rpc/dcerpc_connect.c index 232cdd46e9..5ef8216d0b 100644 --- a/source4/librpc/rpc/dcerpc_connect.c +++ b/source4/librpc/rpc/dcerpc_connect.c @@ -736,6 +736,18 @@ static void continue_pipe_auth(struct composite_context *ctx) /* + handle timeouts of a dcerpc connect +*/ +static void dcerpc_connect_timeout_handler(struct event_context *ev, struct timed_event *te, + struct timeval t, void *private) +{ + struct composite_context *c = talloc_get_type(private, struct composite_context); + DEBUG(0,("DCERPC CONNECT TIMEOUT\n")); + composite_error(c, NT_STATUS_IO_TIMEOUT); + composite_done(c); +} + +/* start a request to open a rpc connection to a rpc pipe, using specified binding structure to determine the endpoint and options */ @@ -748,8 +760,6 @@ struct composite_context* dcerpc_pipe_connect_b_send(TALLOC_CTX *parent_ctx, struct composite_context *c; struct pipe_connect_state *s; struct event_context *new_ev = NULL; - struct composite_context *binding_req; - if (ev == NULL) { new_ev = event_context_init(parent_ctx); @@ -777,12 +787,17 @@ struct composite_context* dcerpc_pipe_connect_b_send(TALLOC_CTX *parent_ctx, s->binding = binding; s->table = table; s->credentials = credentials; + + event_add_timed(c->event_ctx, c, + timeval_current_ofs(DCERPC_REQUEST_TIMEOUT, 0), + dcerpc_connect_timeout_handler, c); switch (s->binding->transport) { case NCACN_NP: case NCACN_IP_TCP: case NCALRPC: if (!s->binding->endpoint) { + struct composite_context *binding_req; binding_req = dcerpc_epm_map_binding_send(c, s->binding, s->table, s->pipe->conn->event_ctx); composite_continue(c, binding_req, continue_map_binding, c); |