The branch, v3-2-test has been updated
       via  6f673b7f10c145d88e6a6d3072b5f8cd98837304 (commit)
       via  62d6d4fff2edcce04e793d2a2f877cb3f4fedbdb (commit)
       via  dba24ceae78ffc49200b647838b6bf3657275add (commit)
       via  66fc1db1d19d11792d9506b06ad914d88b7e0663 (commit)
       via  d0c0f91fb9f3438a18c6f47ed894f525beb75cbf (commit)
      from  d9d6775878f8b3425665c6a45a5ef9cb92932cf8 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit 6f673b7f10c145d88e6a6d3072b5f8cd98837304
Author: Michael Adam <[EMAIL PROTECTED]>
Date:   Mon Jan 7 11:27:54 2008 +0100

    Use the proper boolean constants.
    
    Michael

commit 62d6d4fff2edcce04e793d2a2f877cb3f4fedbdb
Author: Michael Adam <[EMAIL PROTECTED]>
Date:   Mon Jan 7 11:19:27 2008 +0100

    Fix a comment.
    
    Michael

commit dba24ceae78ffc49200b647838b6bf3657275add
Author: Michael Adam <[EMAIL PROTECTED]>
Date:   Mon Jan 7 10:59:14 2008 +0100

    Make wcache_invalidate_cache() return bool, not int.
    
    Michael

commit 66fc1db1d19d11792d9506b06ad914d88b7e0663
Author: Michael Adam <[EMAIL PROTECTED]>
Date:   Mon Jan 7 10:41:09 2008 +0100

    Add some braces to if statement.
    
    Michael

commit d0c0f91fb9f3438a18c6f47ed894f525beb75cbf
Author: Andreas Schneider <[EMAIL PROTECTED]>
Date:   Mon Nov 26 11:44:30 2007 +0100

    Prevent winbindd from segfaulting due to corrupted cache tdb.
    
    If we try to flush the caches and due to a corrupted tdb we and have no tdb
    context close the tdb and validate it. Initialize the cache afterwards 
again.

-----------------------------------------------------------------------

Summary of changes:
 source/winbindd/winbindd.c       |   19 ++++-
 source/winbindd/winbindd_cache.c |  209 ++++++++++++++++++++-----------------
 2 files changed, 131 insertions(+), 97 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/winbindd/winbindd.c b/source/winbindd/winbindd.c
index 07cf226..5e9900d 100644
--- a/source/winbindd/winbindd.c
+++ b/source/winbindd/winbindd.c
@@ -121,7 +121,24 @@ static void flush_caches(void)
            otherwise cached access denied errors due to restrict anonymous
            hang around until the sequence number changes. */
 
-       wcache_invalidate_cache();
+       if (!wcache_invalidate_cache()) {
+               DEBUG(0, ("invalidating the cache failed; revalidate the 
cache\n"));
+               /* Close the cache to be able to valdite the cache */
+               close_winbindd_cache();
+               /*
+                * Ensure all cache and idmap caches are consistent
+                * before we initialize the cache again.
+                */
+               if (winbindd_validate_cache() < 0) {
+                       DEBUG(0, ("winbindd cache tdb corrupt and no backup "
+                                 "could be restore.\n"));
+               }
+
+               /* Initialize cache again. */
+               if (!initialize_winbindd_cache()) {
+                       exit(1);
+               }
+       }
 }
 
 /* Handle the signal by unlinking socket and exiting */
diff --git a/source/winbindd/winbindd_cache.c b/source/winbindd/winbindd_cache.c
index f63c7a5..fc71868 100644
--- a/source/winbindd/winbindd_cache.c
+++ b/source/winbindd/winbindd_cache.c
@@ -62,7 +62,7 @@ static bool is_non_centry_key(TDB_DATA kbuf)
        int i;
 
        if (kbuf.dptr == NULL || kbuf.dsize == 0) {
-               return False;
+               return false;
        }
        for (i = 0; non_centry_keys[i] != NULL; i++) {
                size_t namelen = strlen(non_centry_keys[i]);
@@ -70,10 +70,10 @@ static bool is_non_centry_key(TDB_DATA kbuf)
                        continue;
                }
                if (strncmp(non_centry_keys[i], (const char *)kbuf.dptr, 
namelen) == 0) {
-                       return True;
+                       return true;
                }
        }
-       return False;
+       return false;
 }
 
 /* Global online/offline state - False when online. winbindd starts up online
@@ -210,9 +210,9 @@ static bool centry_check_bytes(struct cache_entry *centry, 
size_t nbytes)
                DEBUG(0,("centry corruption? needed %u bytes, have %d\n", 
                         (unsigned int)nbytes,
                         centry->len - centry->ofs));
-               return False;
+               return false;
        }
-       return True;
+       return true;
 }
 
 /*
@@ -348,9 +348,9 @@ static bool centry_sid(struct cache_entry *centry, 
TALLOC_CTX *mem_ctx, DOM_SID
        char *sid_string;
        sid_string = centry_string(centry, mem_ctx);
        if ((sid_string == NULL) || (!string_to_sid(sid, sid_string))) {
-               return False;
+               return false;
        }
-       return True;
+       return true;
 }
 
 
@@ -372,7 +372,7 @@ static bool wcache_server_down(struct winbindd_domain 
*domain)
        bool ret;
 
        if (!wcache->tdb)
-               return False;
+               return false;
 
        ret = (domain->sequence_number == DOM_SEQUENCE_NONE);
 
@@ -454,7 +454,7 @@ static NTSTATUS store_cache_seqnum( struct winbindd_domain 
*domain )
 }
 
 /*
-  refresh the domain sequence number. If force is True
+  refresh the domain sequence number. If force is true
   then always refresh it, no matter how recently we fetched it
 */
 
@@ -538,7 +538,7 @@ static bool centry_expired(struct winbindd_domain *domain, 
const char *keystr, s
        if (lp_winbind_offline_logon() && global_winbindd_offline_state) {
                DEBUG(10,("centry_expired: Key %s for domain %s valid as 
winbindd is globally offline.\n",
                        keystr, domain->name ));
-               return False;
+               return false;
        }
 
        /* when the domain is offline return the cached entry.
@@ -547,7 +547,7 @@ static bool centry_expired(struct winbindd_domain *domain, 
const char *keystr, s
        if (!domain->online) {
                DEBUG(10,("centry_expired: Key %s for domain %s valid as domain 
is offline.\n",
                        keystr, domain->name ));
-               return False;
+               return false;
        }
 
        /* if the server is OK and our cache entry came from when it was down 
then
@@ -556,7 +556,7 @@ static bool centry_expired(struct winbindd_domain *domain, 
const char *keystr, s
            (centry->sequence_number == DOM_SEQUENCE_NONE)) {
                DEBUG(10,("centry_expired: Key %s for domain %s invalid 
sequence.\n",
                        keystr, domain->name ));
-               return True;
+               return true;
        }
 
        /* if the server is down or the cache entry is not older than the
@@ -565,14 +565,14 @@ static bool centry_expired(struct winbindd_domain 
*domain, const char *keystr, s
            centry->sequence_number == domain->sequence_number) {
                DEBUG(10,("centry_expired: Key %s for domain %s is good.\n",
                        keystr, domain->name ));
-               return False;
+               return false;
        }
 
        DEBUG(10,("centry_expired: Key %s for domain %s expired\n",
                keystr, domain->name ));
 
        /* it's expired */
-       return True;
+       return true;
 }
 
 static struct cache_entry *wcache_fetch_raw(char *kstr)
@@ -625,7 +625,7 @@ static struct cache_entry *wcache_fetch(struct 
winbind_cache *cache,
                return NULL;
        }
 
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
 
        va_start(ap, format);
        smb_xvasprintf(&kstr, format, ap);
@@ -1189,7 +1189,7 @@ do_query:
                 (retry++ < 5));
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        centry = centry_start(domain, status);
        if (!centry)
                goto skip_save;
@@ -1280,7 +1280,7 @@ do_query:
        status = domain->backend->enum_dom_groups(domain, mem_ctx, num_entries, 
info);
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        centry = centry_start(domain, status);
        if (!centry)
                goto skip_save;
@@ -1364,7 +1364,7 @@ do_query:
        status = domain->backend->enum_local_groups(domain, mem_ctx, 
num_entries, info);
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        centry = centry_start(domain, status);
        if (!centry)
                goto skip_save;
@@ -1437,7 +1437,7 @@ do_query:
                                              domain_name, name, sid, type);
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
 
        if (domain->online &&
            (NT_STATUS_IS_OK(status) || NT_STATUS_EQUAL(status, 
NT_STATUS_NONE_MAPPED))) {
@@ -1510,7 +1510,7 @@ do_query:
        status = domain->backend->sid_to_name(domain, mem_ctx, sid, 
domain_name, name, type);
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        wcache_save_sid_to_name(domain, status, sid, *domain_name, *name, 
*type);
 
        /* We can't save the name to sid mapping here, as with sid history a
@@ -1554,7 +1554,7 @@ static NTSTATUS rids_to_names(struct winbindd_domain 
*domain,
                goto error;
        }
 
-       have_mapped = have_unmapped = False;
+       have_mapped = have_unmapped = false;
 
        for (i=0; i<num_rids; i++) {
                DOM_SID sid;
@@ -1577,7 +1577,7 @@ static NTSTATUS rids_to_names(struct winbindd_domain 
*domain,
 
                if (NT_STATUS_IS_OK(centry->status)) {
                        char *dom;
-                       have_mapped = True;
+                       have_mapped = true;
                        (*types)[i] = (enum lsa_SidType)centry_uint32(centry);
 
                        dom = centry_string(centry, mem_ctx);
@@ -1590,7 +1590,7 @@ static NTSTATUS rids_to_names(struct winbindd_domain 
*domain,
                        (*names)[i] = centry_string(centry, *names);
 
                } else if (NT_STATUS_EQUAL(centry->status, 
NT_STATUS_NONE_MAPPED)) {
-                       have_unmapped = True;
+                       have_unmapped = true;
 
                } else {
                        /* something's definitely wrong */
@@ -1647,7 +1647,7 @@ static NTSTATUS rids_to_names(struct winbindd_domain 
*domain,
                return result;
        }
 
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
 
        for (i=0; i<num_rids; i++) {
                DOM_SID sid;
@@ -1739,7 +1739,7 @@ do_query:
        status = domain->backend->query_user(domain, mem_ctx, user_sid, info);
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        wcache_save_user(domain, status, info);
 
        return status;
@@ -1819,7 +1819,7 @@ do_query:
                goto skip_save;
        
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        centry = centry_start(domain, status);
        if (!centry)
                goto skip_save;
@@ -1912,7 +1912,7 @@ static NTSTATUS lookup_useraliases(struct winbindd_domain 
*domain,
                                                     num_aliases, alias_rids);
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        centry = centry_start(domain, status);
        if (!centry)
                goto skip_save;
@@ -1993,7 +1993,7 @@ do_query:
                                                  sid_mem, names, name_types);
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        centry = centry_start(domain, status);
        if (!centry)
                goto skip_save;
@@ -2013,7 +2013,7 @@ skip_save:
 /* find the sequence number for a domain */
 static NTSTATUS sequence_number(struct winbindd_domain *domain, uint32 *seq)
 {
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
 
        *seq = domain->sequence_number;
 
@@ -2104,7 +2104,7 @@ do_query:
            the main parent and always to make the query.  --jerry */
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
  
        centry = centry_start(domain, status);
        if (!centry)
@@ -2170,7 +2170,7 @@ do_query:
        status = domain->backend->lockout_policy(domain, mem_ctx, policy); 
  
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        wcache_save_lockout_policy(domain, status, policy);
  
        return status;
@@ -2221,7 +2221,7 @@ do_query:
        status = domain->backend->password_policy(domain, mem_ctx, policy); 
 
        /* and save it */
-       refresh_sequence_number(domain, False);
+       refresh_sequence_number(domain, false);
        wcache_save_password_policy(domain, status, policy);
 
        return status;
@@ -2261,7 +2261,7 @@ void wcache_invalidate_samlogon(struct winbindd_domain 
*domain,
        netsamlogon_clear_cached_user(cache->tdb, info3);
 }
 
-void wcache_invalidate_cache(void)
+bool wcache_invalidate_cache(void)
 {
        struct winbindd_domain *domain;
 
@@ -2270,9 +2270,15 @@ void wcache_invalidate_cache(void)
 
                DEBUG(10, ("wcache_invalidate_cache: invalidating cache "
                           "entries for %s\n", domain->name));
-               if (cache)
-                       tdb_traverse(cache->tdb, traverse_fn, NULL);
+               if (cache) {
+                       if (cache->tdb) {
+                               tdb_traverse(cache->tdb, traverse_fn, NULL);
+                       } else {
+                               return false;
+                       }
+               }
        }
+       return true;
 }
 
 bool init_wcache(void)
@@ -2283,7 +2289,7 @@ bool init_wcache(void)
        }
 
        if (wcache->tdb != NULL)
-               return True;
+               return true;
 
        /* when working offline we must not clear the cache on restart */
        wcache->tdb = tdb_open_log(lock_path("winbindd_cache.tdb"),
@@ -2293,10 +2299,10 @@ bool init_wcache(void)
 
        if (wcache->tdb == NULL) {
                DEBUG(0,("Failed to open winbindd_cache.tdb!\n"));
-               return False;
+               return false;
        }
 
-       return True;
+       return true;
 }
 
 /************************************************************************
@@ -2307,18 +2313,18 @@ bool init_wcache(void)
 
 bool initialize_winbindd_cache(void)
 {
-       bool cache_bad = True;
+       bool cache_bad = true;
        uint32 vers;
 
        if (!init_wcache()) {
                DEBUG(0,("initialize_winbindd_cache: init_wcache failed.\n"));
-               return False;
+               return false;
        }
 
        /* Check version number. */
        if (tdb_fetch_uint32(wcache->tdb, WINBINDD_CACHE_VERSION_KEYSTR, &vers) 
&&
                        vers == WINBINDD_CACHE_VERSION) {
-               cache_bad = False;
+               cache_bad = false;
        }
 
        if (cache_bad) {
@@ -2333,25 +2339,36 @@ bool initialize_winbindd_cache(void)
                        DEBUG(0,("initialize_winbindd_cache: unlink %s failed 
%s ",
                                lock_path("winbindd_cache.tdb"),
                                strerror(errno) ));
-                       return False;
+                       return false;
                }
                if (!init_wcache()) {
                        DEBUG(0,("initialize_winbindd_cache: re-initialization "
                                        "init_wcache failed.\n"));
-                       return False;
+                       return false;
                }
 
                /* Write the version. */
                if (!tdb_store_uint32(wcache->tdb, 
WINBINDD_CACHE_VERSION_KEYSTR, WINBINDD_CACHE_VERSION)) {
                        DEBUG(0,("initialize_winbindd_cache: version number 
store failed %s\n",
                                tdb_errorstr(wcache->tdb) ));
-                       return False;
+                       return false;
                }
        }
 
        tdb_close(wcache->tdb);
        wcache->tdb = NULL;
-       return True;
+       return true;
+}
+
+void close_winbindd_cache()
+{
+       if (!wcache) {
+               return;
+       }
+       if (wcache->tdb) {
+               tdb_close(wcache->tdb);
+               wcache->tdb = NULL;
+       }
 }
 
 void cache_store_response(pid_t pid, struct winbindd_response *response)
@@ -2400,7 +2417,7 @@ bool cache_retrieve_response(pid_t pid, struct 
winbindd_response * response)
        fstring key_str;
 
        if (!init_wcache())
-               return False;
+               return false;
 
        DEBUG(10, ("Retrieving response for pid %d\n", pid));
 
@@ -2408,17 +2425,17 @@ bool cache_retrieve_response(pid_t pid, struct 
winbindd_response * response)
        data = tdb_fetch(wcache->tdb, string_tdb_data(key_str));
 
        if (data.dptr == NULL)
-               return False;
+               return false;
 
        if (data.dsize != sizeof(*response))
-               return False;
+               return false;
 
        memcpy(response, data.dptr, data.dsize);
        SAFE_FREE(data.dptr);
 
        if (response->length == sizeof(*response)) {
                response->extra_data.data = NULL;
-               return True;
+               return true;
        }
 
        /* There's extra data */
@@ -2431,19 +2448,19 @@ bool cache_retrieve_response(pid_t pid, struct 
winbindd_response * response)
 
        if (data.dptr == NULL) {
                DEBUG(0, ("Did not find extra data\n"));
-               return False;
+               return false;
        }
 
        if (data.dsize != (response->length - sizeof(*response))) {
                DEBUG(0, ("Invalid extra data length: %d\n", (int)data.dsize));
                SAFE_FREE(data.dptr);
-               return False;
+               return false;
        }
 
        dump_data(11, (uint8 *)data.dptr, data.dsize);
 
        response->extra_data.data = data.dptr;
-       return True;
+       return true;
 }
 
 void cache_cleanup_response(pid_t pid)
@@ -2475,19 +2492,19 @@ bool lookup_cached_sid(TALLOC_CTX *mem_ctx, const 
DOM_SID *sid,
 
        domain = find_lookup_domain_from_sid(sid);
        if (domain == NULL) {
-               return False;
+               return false;
        }
 
        cache = get_cache(domain);
 
        if (cache->tdb == NULL) {
-               return False;
+               return false;
        }
 
        centry = wcache_fetch(cache, domain, "SN/%s",
                              sid_to_fstring(tmp, sid));
        if (centry == NULL) {
-               return False;
+               return false;
        }
 
        if (NT_STATUS_IS_OK(centry->status)) {
@@ -2516,13 +2533,13 @@ bool lookup_cached_name(TALLOC_CTX *mem_ctx,
 
        domain = find_lookup_domain_from_name(domain_name);
        if (domain == NULL) {
-               return False;
+               return false;
        }
 


-- 
Samba Shared Repository

Reply via email to