The branch, v3-5-test has been updated
       via  1a17c8f... s3: let gencache_init() use tdb_check()
       via  8f737c3... s3: let netsamlogon_cache_init() use tdb_check()
       via  66847ad... s3: let tdb_validate_child() use tdb_check()
       via  7a16b95... s3: require tdb 1.1.7 with tdb_check()
      from  a9077c7... s3:docs: Document "directory name cache size".

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


- Log -----------------------------------------------------------------
commit 1a17c8ffe0f17138e45b57a82d5b4a3c73628bca
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 4 16:46:34 2009 +0100

    s3: let gencache_init() use tdb_check()
    
    If the check fails we try to clear the tdb and start
    with an empty cache.
    
    metze
    (cherry picked from commit 909cd2617fa1c170183664af1fc4253af2dc2f21)
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit 8f737c3cd154f394f821b0e34ced3f84ff8773c4
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 4 16:34:08 2009 +0100

    s3: let netsamlogon_cache_init() use tdb_check()
    
    If the check fails we try to unlink the old file and
    start with an empty cache.
    
    metze
    (cherry picked from commit 8f19c08072a7a6036d59cf6c2ca6ce17c74b7635)
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit 66847adf072606e6519a1de1ede3aa26d9e041ba
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 4 16:32:42 2009 +0100

    s3: let tdb_validate_child() use tdb_check()
    
    metze
    (cherry picked from commit 6f6608c2aa6122c87ea1e8a937708d08e6c5785e)
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit 7a16b95703bf063b2c02133c97a06f7ab0e85963
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Dec 4 16:59:39 2009 +0100

    s3: require tdb 1.1.7 with tdb_check()
    
    metze
    (cherry picked from commit 886fe5b92082c2d18f97ff0bdcced52d38f344ca)
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

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

Summary of changes:
 source3/configure.in            |    2 +-
 source3/lib/gencache.c          |   25 +++++++++++++++++++++
 source3/lib/tdb_validate.c      |   11 +++++++++
 source3/libsmb/samlogon_cache.c |   46 +++++++++++++++++++++++++++++++++++---
 4 files changed, 79 insertions(+), 5 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/configure.in b/source3/configure.in
index adb0339..1517bc5 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -1921,7 +1921,7 @@ AC_ARG_ENABLE(external_libtdb,
 
 if test "x$enable_external_libtdb" != xno
 then
-       PKG_CHECK_MODULES(LIBTDB, tdb >= 1.1.4,
+       PKG_CHECK_MODULES(LIBTDB, tdb >= 1.1.7,
                [ enable_external_libtdb=yes ],
                [
                if test x$enable_external_libtdb = xyes; then
diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c
index 4889d7c..9a4cbc2 100644
--- a/source3/lib/gencache.c
+++ b/source3/lib/gencache.c
@@ -55,6 +55,7 @@ static bool gencache_init(void)
 {
        char* cache_fname = NULL;
        int open_flags = O_RDWR|O_CREAT;
+       bool first_try = true;
 
        /* skip file open if it's already opened */
        if (cache) return True;
@@ -63,7 +64,30 @@ static bool gencache_init(void)
 
        DEBUG(5, ("Opening cache file at %s\n", cache_fname));
 
+again:
        cache = tdb_open_log(cache_fname, 0, TDB_DEFAULT, open_flags, 0644);
+       if (cache) {
+               int ret;
+               ret = tdb_check(cache, NULL, NULL);
+               if (ret != 0) {
+                       tdb_close(cache);
+                       cache = NULL;
+                       if (!first_try) {
+                               DEBUG(0, ("gencache_init: tdb_check(%s) 
failed\n",
+                                         cache_fname));
+                               return false;
+                       }
+                       first_try = false;
+                       DEBUG(0, ("gencache_init: tdb_check(%s) failed - retry 
after CLEAR_IF_FIRST\n",
+                                 cache_fname));
+                       cache = tdb_open_log(cache_fname, 0, 
TDB_CLEAR_IF_FIRST, open_flags, 0644);
+                       if (cache) {
+                               tdb_close(cache);
+                               cache = NULL;
+                               goto again;
+                       }
+               }
+       }
 
        if (!cache && (errno == EACCES)) {
                open_flags = O_RDONLY;
@@ -89,6 +113,7 @@ static bool gencache_init(void)
                DEBUG(5, ("Opening %s failed: %s\n", cache_fname,
                          strerror(errno)));
                tdb_close(cache);
+               cache = NULL;
                return false;
        }
 
diff --git a/source3/lib/tdb_validate.c b/source3/lib/tdb_validate.c
index 092546e..a1fb185 100644
--- a/source3/lib/tdb_validate.c
+++ b/source3/lib/tdb_validate.c
@@ -44,6 +44,17 @@ static int tdb_validate_child(struct tdb_context *tdb,
                goto out;
        }
 
+       /*
+        * we can simplify this by passing a check function,
+        * but I don't want to change all the callers...
+        */
+       ret = tdb_check(tdb, NULL, NULL);
+       if (ret == -1) {
+               v_status.tdb_error = True;
+               v_status.success = False;
+               goto out;
+       }
+
        /* Check if the tdb's freelist is good. */
        if (tdb_validate_freelist(tdb, &num_entries) == -1) {
                v_status.bad_freelist = True;
diff --git a/source3/libsmb/samlogon_cache.c b/source3/libsmb/samlogon_cache.c
index c96f5da..1290182 100644
--- a/source3/libsmb/samlogon_cache.c
+++ b/source3/libsmb/samlogon_cache.c
@@ -34,12 +34,50 @@ static TDB_CONTEXT *netsamlogon_tdb = NULL;
 
 bool netsamlogon_cache_init(void)
 {
-       if (!netsamlogon_tdb) {
-               netsamlogon_tdb = tdb_open_log(cache_path(NETSAMLOGON_TDB), 0,
-                                              TDB_DEFAULT, O_RDWR | O_CREAT, 
0600);
+       bool first_try = true;
+       const char *path = NULL;
+       int ret;
+       struct tdb_context *tdb;
+
+       if (netsamlogon_tdb) {
+               return true;
+       }
+
+       path = cache_path(NETSAMLOGON_TDB);
+again:
+       tdb = tdb_open_log(path, 0, TDB_DEFAULT,
+                          O_RDWR | O_CREAT, 0600);
+       if (tdb == NULL) {
+               DEBUG(0,("tdb_open_log('%s') - failed\n", path));
+               goto clear;
+       }
+
+       ret = tdb_check(tdb, NULL, NULL);
+       if (ret != 0) {
+               tdb_close(tdb);
+               DEBUG(0,("tdb_check('%s') - failed\n", path));
+               goto clear;
+       }
+
+       netsamlogon_tdb = tdb;
+       return true;
+
+clear:
+       if (!first_try) {
+               return false;
+       }
+       first_try = false;
+
+       DEBUG(0,("retry after CLEAR_IF_FIRST for '%s'\n", path));
+       tdb = tdb_open_log(path, 0, TDB_CLEAR_IF_FIRST,
+                          O_RDWR | O_CREAT, 0600);
+       if (tdb) {
+               tdb_close(tdb);
+               goto again;
        }
+       DEBUG(0,("tdb_open_log(%s) with CLEAR_IF_FIRST - failed\n", path));
 
-       return (netsamlogon_tdb != NULL);
+       return false;
 }
 
 


-- 
Samba Shared Repository

Reply via email to