s4:winbind: let wb_sam_logon_send/recv() use the netlogon_queue (bug #9097)
authorStefan Metzmacher <metze@samba.org>
Fri, 24 Aug 2012 11:40:13 +0000 (13:40 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 24 Aug 2012 23:39:42 +0000 (01:39 +0200)
metze

source4/winbind/wb_sam_logon.c

index 39c2254ff8ec80e82d80181dba39c85386fc2d6c..32fddd2e0a64aae111e084ea7d0ebc0e1a681697 100644 (file)
@@ -37,6 +37,8 @@ struct wb_sam_logon_state {
 
        struct winbind_SamLogon *req;
 
+       struct wbsrv_domain *domain;
+       struct tevent_queue_entry *queue_entry;
         struct netlogon_creds_CredentialState *creds_state;
         struct netr_Authenticator auth1, auth2;
 
@@ -45,6 +47,7 @@ struct wb_sam_logon_state {
 };
 
 static void wb_sam_logon_recv_domain(struct composite_context *ctx);
+static void wb_sam_logon_queue_trigger(struct tevent_req *req, void *priv);
 static void wb_sam_logon_recv_samlogon(struct tevent_req *subreq);
 
 /*
@@ -89,15 +92,34 @@ static void wb_sam_logon_recv_domain(struct composite_context *csubreq)
        struct wb_sam_logon_state *state =
                tevent_req_data(req,
                struct wb_sam_logon_state);
-       struct wbsrv_domain *domain;
-       struct tevent_req *subreq;
        NTSTATUS status;
+       struct tevent_queue_entry *e;
 
-       status = wb_sid2domain_recv(csubreq, &domain);
+       status = wb_sid2domain_recv(csubreq, &state->domain);
        if (tevent_req_nterror(req, status)) {
                return;
        }
 
+       /*
+        * Because of the netlogon_creds behavior we have to
+        * queue the netr_LogonSamLogon() calls
+        */
+       e = tevent_queue_add_entry(state->domain->netlogon_queue,
+                                  state->ev,
+                                  req,
+                                  wb_sam_logon_queue_trigger,
+                                  NULL);
+       state->queue_entry = e;
+}
+
+static void wb_sam_logon_queue_trigger(struct tevent_req *req, void *priv)
+{
+       struct wb_sam_logon_state *state =
+               tevent_req_data(req,
+               struct wb_sam_logon_state);
+       struct wbsrv_domain *domain = state->domain;
+       struct tevent_req *subreq;
+
        state->creds_state = cli_credentials_get_netlogon_creds(domain->libnet_ctx->cred);
        netlogon_creds_client_authenticator(state->creds_state, &state->auth1);
 
@@ -190,6 +212,11 @@ static void wb_sam_logon_recv_samlogon(struct tevent_req *subreq)
                                        state->r.in.validation_level,
                                        state->r.out.validation);
 
+       /*
+        * we do not need the netlogon_creds lock anymore
+        */
+       TALLOC_FREE(state->queue_entry);
+
        tevent_req_done(req);
 }