don't call ads_destroy() twice; fixes segfault in winbindd when DC goes down; bug 437
authorGerald Carter <jerry@samba.org>
Fri, 3 Oct 2003 21:43:09 +0000 (21:43 +0000)
committerGerald Carter <jerry@samba.org>
Fri, 3 Oct 2003 21:43:09 +0000 (21:43 +0000)
source/libads/ldap.c
source/libads/ldap_utils.c
source/nsswitch/winbindd_ads.c

index 48401cc3d803f4c20418e881d32088a3d82ebdcd..8c3185ea5e3e28573349bc9374d9817bb139f291 100644 (file)
@@ -1787,7 +1787,8 @@ ADS_STATUS ads_USN(ADS_STRUCT *ads, uint32 *usn)
        void *res;
 
        status = ads_do_search_retry(ads, "", LDAP_SCOPE_BASE, "(objectclass=*)", attrs, &res);
-       if (!ADS_ERR_OK(status)) return status;
+       if (!ADS_ERR_OK(status)) 
+               return status;
 
        if (ads_count_replies(ads, res) != 1) {
                return ADS_ERROR(LDAP_NO_RESULTS_RETURNED);
index 1fa9ebfc975e9fce943cb37aa3c4d33dcd924975..4142bceabca2f0c5c8e4200c3b430e0ed39affb9 100644 (file)
@@ -54,15 +54,20 @@ ADS_STATUS ads_do_search_retry(ADS_STRUCT *ads, const char *bind_path, int scope
                        return status;
                }
 
-               if (*res) ads_msgfree(ads, *res);
+               if (*res) 
+                       ads_msgfree(ads, *res);
                *res = NULL;
+               
                DEBUG(3,("Reopening ads connection to realm '%s' after error %s\n", 
                         ads->config.realm, ads_errstr(status)));
+                        
                if (ads->ld) {
                        ldap_unbind(ads->ld); 
                }
+               
                ads->ld = NULL;
                status = ads_connect(ads);
+               
                if (!ADS_ERR_OK(status)) {
                        DEBUG(1,("ads_search_retry: failed to reconnect (%s)\n",
                                 ads_errstr(status)));
index c64359a2241d37817179656e2918efc7b2baa592..ef3f0f8fc20b766be0d8b1dbcfa87e2e850c9542 100644 (file)
@@ -787,9 +787,13 @@ static NTSTATUS sequence_number(struct winbindd_domain *domain, uint32 *seq)
        }
 
        rc = ads_USN(ads, seq);
+       
        if (!ADS_ERR_OK(rc)) {
-               /* its a dead connection */
-               ads_destroy(&ads);
+       
+               /* its a dead connection ; don't destroy it 
+                  through since ads_USN() has already done 
+                  that indirectly */
+                  
                domain->private = NULL;
        }
        return ads_ntstatus(rc);
@@ -910,8 +914,11 @@ static NTSTATUS domain_sid(struct winbindd_domain *domain, DOM_SID *sid)
        rc = ads_domain_sid(ads, sid);
 
        if (!ADS_ERR_OK(rc)) {
-               /* its a dead connection */
-               ads_destroy(&ads);
+       
+               /* its a dead connection; don't destroy it though
+                  since that has already been done indirectly 
+                  by ads_domain_sid() */
+
                domain->private = NULL;
        }