diff options
-rw-r--r-- | lib/tdb/common/check.c | 2 | ||||
-rw-r--r-- | lib/tdb/common/open.c | 21 | ||||
-rw-r--r-- | lib/tdb/common/tdb_private.h | 1 | ||||
-rw-r--r-- | lib/tdb/configure.ac | 2 | ||||
-rw-r--r-- | lib/tdb/include/tdb.h | 1 | ||||
-rw-r--r-- | lib/tdb/wscript | 2 |
6 files changed, 23 insertions, 6 deletions
diff --git a/lib/tdb/common/check.c b/lib/tdb/common/check.c index b1b98d4f1e..58c9c26540 100644 --- a/lib/tdb/common/check.c +++ b/lib/tdb/common/check.c @@ -39,7 +39,7 @@ static bool tdb_check_header(struct tdb_context *tdb, tdb_off_t *recovery) if (hdr.version != TDB_VERSION) goto corrupt; - if (hdr.rwlocks != 0) + if (hdr.rwlocks != 0 && hdr.rwlocks != TDB_HASH_RWLOCK_MAGIC) goto corrupt; tdb_header_hash(tdb, &h1, &h2); diff --git a/lib/tdb/common/open.c b/lib/tdb/common/open.c index 9a82bc9bad..66539c3f6c 100644 --- a/lib/tdb/common/open.c +++ b/lib/tdb/common/open.c @@ -70,6 +70,11 @@ static int tdb_new_database(struct tdb_context *tdb, int hash_size) tdb_header_hash(tdb, &newdb->magic1_hash, &newdb->magic2_hash); + /* Make sure older tdbs (which don't check the magic hash fields) + * will refuse to open this TDB. */ + if (tdb->flags & TDB_INCOMPATIBLE_HASH) + newdb->rwlocks = TDB_HASH_RWLOCK_MAGIC; + if (tdb->flags & TDB_INTERNAL) { tdb->map_size = size; tdb->map_ptr = (char *)newdb; @@ -150,7 +155,10 @@ static bool check_header_hash(struct tdb_context *tdb, return false; /* Otherwise, try the other inbuilt hash. */ - tdb->hash_fn = tdb_jenkins_hash; + if (tdb->hash_fn == tdb_old_hash) + tdb->hash_fn = tdb_jenkins_hash; + else + tdb->hash_fn = tdb_old_hash; return check_header_hash(tdb, false, m1, m2); } @@ -193,7 +201,12 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags, tdb->hash_fn = hash_fn; hash_alg = "the user defined"; } else { - tdb->hash_fn = tdb_old_hash; + /* This controls what we use when creating a tdb. */ + if (tdb->flags & TDB_INCOMPATIBLE_HASH) { + tdb->hash_fn = tdb_jenkins_hash; + } else { + tdb->hash_fn = tdb_old_hash; + } hash_alg = "either default"; } @@ -312,13 +325,15 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags, if (fstat(tdb->fd, &st) == -1) goto fail; - if (tdb->header.rwlocks != 0) { + if (tdb->header.rwlocks != 0 && + tdb->header.rwlocks != TDB_HASH_RWLOCK_MAGIC) { TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: spinlocks no longer supported\n")); goto fail; } if ((tdb->header.magic1_hash == 0) && (tdb->header.magic2_hash == 0)) { /* older TDB without magic hash references */ + tdb->hash_fn = tdb_old_hash; } else if (!check_header_hash(tdb, !hash_fn, &magic1, &magic2)) { TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_open_ex: " "%s was not created with %s hash function we are using\n" diff --git a/lib/tdb/common/tdb_private.h b/lib/tdb/common/tdb_private.h index fe3603c104..0c621636fa 100644 --- a/lib/tdb/common/tdb_private.h +++ b/lib/tdb/common/tdb_private.h @@ -50,6 +50,7 @@ typedef uint32_t tdb_off_t; #define TDB_DEAD_MAGIC (0xFEE1DEAD) #define TDB_RECOVERY_MAGIC (0xf53bc0e7U) #define TDB_RECOVERY_INVALID_MAGIC (0x0) +#define TDB_HASH_RWLOCK_MAGIC (0xbad1a51U) #define TDB_ALIGNMENT 4 #define DEFAULT_HASH_SIZE 131 #define FREELIST_TOP (sizeof(struct tdb_header)) diff --git a/lib/tdb/configure.ac b/lib/tdb/configure.ac index a858aa7ec3..26e8ed42ce 100644 --- a/lib/tdb/configure.ac +++ b/lib/tdb/configure.ac @@ -2,7 +2,7 @@ AC_PREREQ(2.50) AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""]) AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""]) AC_DEFUN([SMB_ENABLE], [echo -n ""]) -AC_INIT(tdb, 1.2.5) +AC_INIT(tdb, 1.2.6) AC_CONFIG_SRCDIR([common/tdb.c]) AC_CONFIG_HEADER(include/config.h) AC_LIBREPLACE_ALL_CHECKS diff --git a/lib/tdb/include/tdb.h b/lib/tdb/include/tdb.h index 08b6b3ab55..96fc157f68 100644 --- a/lib/tdb/include/tdb.h +++ b/lib/tdb/include/tdb.h @@ -50,6 +50,7 @@ extern "C" { #define TDB_VOLATILE 256 /* Activate the per-hashchain freelist, default 5 */ #define TDB_ALLOW_NESTING 512 /* Allow transactions to nest */ #define TDB_DISALLOW_NESTING 1024 /* Disallow transactions to nest */ +#define TDB_INCOMPATIBLE_HASH 2048 /* Better hashing: can't be opened by tdb < 1.2.6. */ /* error codes */ enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK, diff --git a/lib/tdb/wscript b/lib/tdb/wscript index 970c6287cf..94f85cd708 100644 --- a/lib/tdb/wscript +++ b/lib/tdb/wscript @@ -1,7 +1,7 @@ #!/usr/bin/env python APPNAME = 'tdb' -VERSION = '1.2.5' +VERSION = '1.2.6' blddir = 'bin' |