r19249: Attempt to fix a site lookup bug found by Guenther.
authorJeremy Allison <jra@samba.org>
Wed, 11 Oct 2006 18:54:40 +0000 (18:54 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:15:25 +0000 (12:15 -0500)
- "The problem is, with a fresh system, we don't know our sitename,
therefor we do a stupid DNS query for all DCs. The reply we get is a
round-robin list of all 21 DCs, we just pick the first, contact that
and safe that INET.COM#1C query in the name cache for later use...
What we need to do if we don't yet know our sitename, is to contact to
any DC, get the CLDAP reply to tell us in which site we are, then flush
the namecache and requery DNS including the sitename"

Implement the flushing of the #1C entries for a given NetBIOS name/realm
when looking up the site value.

Jeremy.
(This used to be commit b2d1e44f59d32c91b1d48eacd1a158ba7b65762d)

source3/libsmb/namecache.c
source3/libsmb/namequery_dc.c

index bd4b3caeb7d32751ee122fcc9d9bbaa396429ab5..02956fa1371e29acda9f82aab0a3729151346ba5 100644 (file)
@@ -142,6 +142,10 @@ BOOL namecache_store(const char *name, int name_type,
        }
        
        key = namecache_key(name, name_type);
+       if (!key) {
+               return False;
+       }
+
        expiry = time(NULL) + lp_name_cache_timeout();
 
        /*
@@ -198,6 +202,9 @@ BOOL namecache_fetch(const char *name, int name_type, struct ip_service **ip_lis
         * Use gencache interface - lookup the key
         */
        key = namecache_key(name, name_type);
+       if (!key) {
+               return False;
+       }
 
        if (!gencache_get(key, &value, &timeout)) {
                DEBUG(5, ("no entry for %s#%02X found.\n", name, name_type));
@@ -218,6 +225,31 @@ BOOL namecache_fetch(const char *name, int name_type, struct ip_service **ip_lis
        return *num_names > 0;          /* true only if some ip has been fetched */
 }
 
+/**
+ * Remove a namecache entry. Needed for site support.
+ *
+ **/
+
+BOOL namecache_delete(const char *name, int name_type)
+{
+       BOOL ret;
+       char *key;
+
+       if (!gencache_init())
+               return False;
+
+       if (name_type > 255) {
+               return False; /* Don't fetch non-real name types. */
+       }
+
+       key = namecache_key(name, name_type);
+       if (!key) {
+               return False;
+       }
+       ret = gencache_del(key);
+       SAFE_FREE(key);
+       return ret;
+}
 
 /**
  * Delete single namecache entry. Look at the
index cf01fb269edce26e769e820d81e8233245c9eb14..5280118ab85d592f8d0cd6cee1525276d98da1c0 100644 (file)
@@ -72,6 +72,9 @@ static BOOL ads_dc_name(const char *domain,
                        SAFE_FREE(sitename);
                        sitename = sitename_fetch();
                        ads_destroy(&ads);
+                       /* Ensure we don't cache the DC we just connected to. */
+                       namecache_delete(realm, 0x1C);
+                       namecache_delete(domain, 0x1C);
                        continue;
                }