r10684: Add a nasty hack for the failure case of wbinfo -t. Tridge has a proper fix
authorVolker Lendecke <vlendec@samba.org>
Mon, 3 Oct 2005 14:24:53 +0000 (14:24 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:39:18 +0000 (13:39 -0500)
for it pending.

Also fix a bug with timed events: Don't call the same event recursively in the
handler's inner semi-async event loop.

Volker
(This used to be commit e38e50127a3414461578421e676a9c58c106c272)

source4/lib/events/events_standard.c
source4/winbind/wb_samba3_cmd.c

index 8fe8d009bfa2d0821a54e6dfc3dae533f72ae1bd..146dbc6b226d7f212dfc30a25f407aca02e9a76e 100644 (file)
@@ -347,9 +347,17 @@ static void std_event_loop_timer(struct event_context *ev)
 
        /* deny the handler to free the event */
        talloc_set_destructor(te, std_event_timed_deny_destructor);
+
+       /* We need to remove the timer from the list before calling the
+        * handler because in a semi-async inner event loop called from the
+        * handler we don't want to come across this event again -- vl */
+       DLIST_REMOVE(std_ev->timed_events, te);
+
        te->handler(ev, te, t, te->private_data);
 
-       talloc_set_destructor(te, std_event_timed_destructor);
+       /* The destructor isn't necessary anymore, we've already removed the
+        * event from the list. */
+
        talloc_free(te);
 }
 
index 570a16653205f7d4b9310d2c63a4ec781401b2c3..5dbb63696ad4a32268bf7550b855a0517e4c74ab 100644 (file)
@@ -257,6 +257,12 @@ static void wbsrv_samba3_check_machacc_receive_tree(struct composite_context *ac
        }
 }
 
+static void delete_pipe(struct event_context *ctx, struct timed_event *te,
+                       struct timeval tv, void *p)
+{
+       talloc_free(p);
+}
+
 static void wbsrv_samba3_check_machacc_receive_creds(struct composite_context *action)
 {
        struct wbsrv_samba3_call *s3call =
@@ -271,13 +277,22 @@ static void wbsrv_samba3_check_machacc_receive_creds(struct composite_context *a
        NTSTATUS status;
        
        status = wb_get_schannel_creds_recv(action, service);
-       service->netlogon = state->getcreds->out.netlogon;
 
        talloc_unlink(state, state->conn->out.tree); /* The pipe owns it now */
        state->conn->out.tree = NULL;
 
-       if (!NT_STATUS_IS_OK(status)) goto done;
+       if (!NT_STATUS_IS_OK(status)) {
+               /* Nasty hack awaiting a proper fix. So far we can not
+                * delete a pipe from an async rpc callback which where we are
+                * in right now, so delete the pipe in 5 seconds.... :-) */
+               event_add_timed(s3call->call->event_ctx, service,
+                               timeval_current_ofs(5, 0),
+                               delete_pipe, state->getcreds->out.netlogon);
+               service->netlogon = NULL;
+               goto done;
+       }
 
+       service->netlogon = state->getcreds->out.netlogon;
        s3call->response.result = WINBINDD_OK;
  done:
        if (!NT_STATUS_IS_OK(status)) {