r17990: added timeout checking on dcerpc connection establishment. This should
authorAndrew Tridgell <tridge@samba.org>
Fri, 1 Sep 2006 10:33:55 +0000 (10:33 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:17:02 +0000 (14:17 -0500)
fix the problem on some build farm hosts where we were waiting forever
for a connection to DRSUAPI to be made, so the next test will start.

Next is to try and work out why the connection is timing out on some
hosts. That is probably a server bug, but at least with this change we
can see it.
(This used to be commit 45fccc6d229168058a2a02fe5fe6f0bc259d6afe)

source4/librpc/rpc/dcerpc_connect.c

index 232cdd46e9c8d8a41195a8199f7d2cadab5c0716..5ef8216d0b85ae14df33324fcfe8f9e503c96c86 100644 (file)
@@ -735,6 +735,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);