r19975: Deal with 2 keytypes I messed previously (DR/DE).
authorJeremy Allison <jra@samba.org>
Fri, 1 Dec 2006 01:58:43 +0000 (01:58 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:16:16 +0000 (12:16 -0500)
Fix code that mistakenly assumed tdb_traverse
returned 0 or -1, it actually returns -1 or the
number of entries traversed. Add a static as another
way to return the bad cache value.
Jeremy.
(This used to be commit 5266a70ae9971eb54fa769f89bec7c688285e811)

source3/nsswitch/winbindd_cache.c

index b742ca37dd81b5c85ace233c6ab58665d735904f..799eb5855c7f4ba1c1959ebc5ec3eaea3599ed87 100644 (file)
@@ -2596,6 +2596,8 @@ BOOL get_global_winbindd_state_offline(void)
  Validate functions for all possible cache tdb keys.
 ***********************************************************************/
 
+static int bad_cache_entry;
+
 static int validate_seqnum(TDB_DATA kbuf, TDB_DATA dbuf)
 {
        return 0;
@@ -2656,6 +2658,16 @@ static int validate_gm(TDB_DATA kbuf, TDB_DATA dbuf)
        return 0;
 }
 
+static int validate_dr(TDB_DATA kbuf, TDB_DATA dbuf)
+{
+       return 0;
+}
+
+static int validate_de(TDB_DATA kbuf, TDB_DATA dbuf)
+{
+       return 0;
+}
+
 static int validate_trustdoms(TDB_DATA kbuf, TDB_DATA dbuf)
 {
        return 0;
@@ -2687,6 +2699,8 @@ struct key_val_struct {
        {"UG/", validate_ug},
        {"UA", validate_ua},
        {"GM/", validate_gm},
+       {"DR/", validate_dr},
+       {"DE/", validate_de},
        {"TRUSTDOMS/", validate_trustdoms},
        {"WINBINDD_OFFLINE", validate_offline},
        {NULL, NULL}
@@ -2708,6 +2722,11 @@ static int cache_traverse_validate_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_D
                        return key_val[i].validate_data_fn(kbuf, dbuf);
                }
        }
+
+       DEBUG(0,("cache_traverse_validate_fn: unknown cache entry\nkey :\n"));
+       dump_data(0, kbuf.dptr, kbuf.dsize);
+       DEBUG(0,("data :\n"));
+       dump_data(0, dbuf.dptr, dbuf.dsize);
        return 1; /* terminate. */
 }
 
@@ -2789,15 +2808,19 @@ int winbindd_validate_cache(void)
                goto out;
        }
 
+       DEBUG(10,("winbindd_validate_cache: cache %s freelist has %d entries\n",
+               cache_path, num_entries));
+
        /* Now traverse the cache to validate it. */
-       if (tdb_traverse(tdb, cache_traverse_validate_fn, NULL)) {
+       num_entries = tdb_traverse(tdb, cache_traverse_validate_fn, NULL);
+       if (num_entries == -1 || bad_cache_entry) {
                DEBUG(0,("winbindd_validate_cache: cache %s traverse failed\n",
                        cache_path));
                goto out;
        }
 
        DEBUG(10,("winbindd_validate_cache: cache %s is good "
-               "freelist has %d entries\n", cache_path, num_entries));
+               "with %d entries\n", cache_path, num_entries));
        ret = 0; /* Cache is good. */
 
   out: