Fix by Bo Yang <boyang@novell.com> for bug with winbindd trusted domain child
authorJeremy Allison <jra@samba.org>
Mon, 2 Jun 2008 22:26:37 +0000 (15:26 -0700)
committerKarolin Seeger <kseeger@samba.org>
Tue, 3 Jun 2008 06:29:24 +0000 (08:29 +0200)
not keeping primary domain online status up to date.
Jeremy.
(cherry picked from commit d634d78cdfbfa9e27cf9cb5ada3c5220be257a7f)

source/winbindd/winbindd_dual.c

index b8c0ab9113ff026e539a5c498dc026dbf7e73c00..29849e9e78dbb5796e422aa501c1f5963fc44dbe 100644 (file)
@@ -965,6 +965,7 @@ static bool fork_domain_child(struct winbindd_child *child)
        int fdpair[2];
        struct winbindd_cli_state state;
        struct winbindd_domain *domain;
+       struct winbindd_domain *primary_domain = NULL;
 
        if (child->domain) {
                DEBUG(10, ("fork_domain_child called for domain '%s'\n",
@@ -1060,10 +1061,13 @@ static bool fork_domain_child(struct winbindd_child *child)
        }
 
        /* Ensure we have no pending check_online events other
-          than one for this domain. */
+          than one for this domain or the primary domain. */
 
        for (domain = domain_list(); domain; domain = domain->next) {
-               if (domain != child->domain) {
+               if (domain->primary) {
+                       primary_domain = domain;
+               }
+               if ((domain != child->domain) && !domain->primary) {
                        TALLOC_FREE(domain->check_online_event);
                }
        }
@@ -1080,6 +1084,18 @@ static bool fork_domain_child(struct winbindd_child *child)
 
                set_domain_online_request(child->domain);
 
+               if (primary_domain != child->domain) {
+                       /* We need to talk to the primary
+                        * domain as well as the trusted
+                        * domain inside a trusted domain
+                        * child.
+                        * See the code in :
+                        * set_dc_type_and_flags_trustinfo()
+                        * for details.
+                        */
+                       set_domain_online_request(primary_domain);
+               }
+
                child->lockout_policy_event = event_add_timed(
                        winbind_event_context(), NULL, timeval_zero(),
                        "account_lockout_policy_handler",