summaryrefslogtreecommitdiff
path: root/lib/tdb2/test
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2011-09-14 07:34:13 +0930
committerRusty Russell <rusty@rustcorp.com.au>2011-09-14 07:34:13 +0930
commit61b1bd1dca145a0417907793579352c66b016c23 (patch)
tree913e709da52d81b38afb6f91e917e5e25db3f451 /lib/tdb2/test
parentebb3017cf08cc4dad3217db6cea404069b494b47 (diff)
downloadsamba-61b1bd1dca145a0417907793579352c66b016c23.tar.gz
samba-61b1bd1dca145a0417907793579352c66b016c23.tar.bz2
samba-61b1bd1dca145a0417907793579352c66b016c23.zip
tdb2: approximate INCOMPATIBLE_HASH flag with tdb1_incompatible_hash()
Rather than leak TDB_INCOMPATIBLE_HASH through to the TDB2 API, we make it that if they use the tdb1_incompatible_hash function as their hash, then we treat it as if they had specified the TDB_INCOMPATIBLE_HASH flag (ie. we mark the header so it's unusable by tdb < 1.2.6). This precludes the possibility of using TDB_INCOMPATIBLE_HASH with a custom hash function: that used to allow the user to ensure that old TDB versions couldn't open the TDB file (and recent ones check the header to ensure they're using the right hash). But that's a small loss. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (Imported from CCAN commit 3004f7e89a5978064b4fb29c1027e6d0d39e9418)
Diffstat (limited to 'lib/tdb2/test')
-rw-r--r--lib/tdb2/test/run-tdb1-incompatible.c38
-rw-r--r--lib/tdb2/test/run-tdb1-oldhash.c4
-rw-r--r--lib/tdb2/test/run-tdb1-wronghash-fail.c26
3 files changed, 46 insertions, 22 deletions
diff --git a/lib/tdb2/test/run-tdb1-incompatible.c b/lib/tdb2/test/run-tdb1-incompatible.c
index 51aa52d4b7..6f3aee0336 100644
--- a/lib/tdb2/test/run-tdb1-incompatible.c
+++ b/lib/tdb2/test/run-tdb1-incompatible.c
@@ -31,6 +31,16 @@ static unsigned int hdr_rwlocks(const char *fname)
return hdr.rwlocks;
}
+static unsigned int jenkins_hashfn(TDB_DATA *key)
+{
+ return hashlittle(key->dptr, key->dsize);
+}
+
+static unsigned int old_hash(TDB_DATA *key)
+{
+ return tdb1_old_hash(key);
+}
+
int main(int argc, char *argv[])
{
struct tdb1_context *tdb;
@@ -61,11 +71,12 @@ int main(int argc, char *argv[])
/* Should not have marked rwlocks field. */
ok1(hdr_rwlocks("run-incompatible.tdb") == 0);
- /* We can still open any old-style with incompat flag. */
+ /* We can still open any old-style with incompat hash. */
log_count = 0;
tdb = tdb1_open_ex("run-incompatible.tdb", 0,
- TDB1_INCOMPATIBLE_HASH,
- O_RDWR, 0600, &log_ctx, NULL);
+ TDB_DEFAULT,
+ O_RDWR, 0600, &log_ctx,
+ tdb1_incompatible_hash);
ok1(tdb);
ok1(log_count == 0);
d = tdb1_fetch(tdb, d);
@@ -76,7 +87,7 @@ int main(int argc, char *argv[])
log_count = 0;
tdb = tdb1_open_ex("test/jenkins-le-hash.tdb1", 0, 0, O_RDONLY,
- 0, &log_ctx, tdb1_jenkins_hash);
+ 0, &log_ctx, jenkins_hashfn);
ok1(tdb);
ok1(log_count == 0);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
@@ -84,18 +95,18 @@ int main(int argc, char *argv[])
log_count = 0;
tdb = tdb1_open_ex("test/jenkins-be-hash.tdb1", 0, 0, O_RDONLY,
- 0, &log_ctx, tdb1_jenkins_hash);
+ 0, &log_ctx, jenkins_hashfn);
ok1(tdb);
ok1(log_count == 0);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
tdb1_close(tdb);
- /* OK, now create with incompatible flag, default hash. */
+ /* OK, now create with incompatible hash. */
log_count = 0;
tdb = tdb1_open_ex("run-incompatible.tdb", 0,
- flags|TDB1_INCOMPATIBLE_HASH,
+ flags,
O_CREAT|O_RDWR|O_TRUNC, 0600, &log_ctx,
- NULL);
+ tdb1_incompatible_hash);
ok1(tdb);
ok1(log_count == 0);
d.dptr = (void *)"Hello";
@@ -109,14 +120,14 @@ int main(int argc, char *argv[])
/* Cannot open with old hash. */
log_count = 0;
tdb = tdb1_open_ex("run-incompatible.tdb", 0, 0,
- O_RDWR, 0600, &log_ctx, tdb1_old_hash);
+ O_RDWR, 0600, &log_ctx, old_hash);
ok1(!tdb);
ok1(log_count == 1);
/* Can open with jenkins hash. */
log_count = 0;
tdb = tdb1_open_ex("run-incompatible.tdb", 0, 0,
- O_RDWR, 0600, &log_ctx, tdb1_jenkins_hash);
+ O_RDWR, 0600, &log_ctx, jenkins_hashfn);
ok1(tdb);
ok1(log_count == 0);
d = tdb1_fetch(tdb, d);
@@ -139,10 +150,11 @@ int main(int argc, char *argv[])
ok1(tdb1_check(tdb, NULL, NULL) == 0);
tdb1_close(tdb);
+ /* FIXME: Not possible with TDB2 :( */
/* We can also use incompatible hash with other hashes. */
log_count = 0;
tdb = tdb1_open_ex("run-incompatible.tdb", 0,
- flags|TDB1_INCOMPATIBLE_HASH,
+ flags,
O_CREAT|O_RDWR|O_TRUNC, 0600, &log_ctx,
tdb1_dumb_hash);
ok1(tdb);
@@ -152,8 +164,8 @@ int main(int argc, char *argv[])
ok1(tdb1_store(tdb, d, d, TDB_INSERT) == 0);
tdb1_close(tdb);
- /* Should have marked rwlocks field. */
- ok1(hdr_rwlocks("run-incompatible.tdb") == rwmagic);
+ /* FIXME: Should have marked rwlocks field. */
+ ok1(hdr_rwlocks("run-incompatible.tdb") != rwmagic);
/* It should not open if we don't specify. */
log_count = 0;
diff --git a/lib/tdb2/test/run-tdb1-oldhash.c b/lib/tdb2/test/run-tdb1-oldhash.c
index 32b4200d54..4f74dbb95b 100644
--- a/lib/tdb2/test/run-tdb1-oldhash.c
+++ b/lib/tdb2/test/run-tdb1-oldhash.c
@@ -25,13 +25,13 @@ int main(int argc, char *argv[])
tdb1_close(tdb);
tdb = tdb1_open_ex("test/old-nohash-le.tdb1", 0, 0, O_RDWR, 0,
- &taplogctx, tdb1_jenkins_hash);
+ &taplogctx, tdb1_incompatible_hash);
ok1(tdb);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
tdb1_close(tdb);
tdb = tdb1_open_ex("test/old-nohash-be.tdb1", 0, 0, O_RDWR, 0,
- &taplogctx, tdb1_jenkins_hash);
+ &taplogctx, tdb1_incompatible_hash);
ok1(tdb);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
tdb1_close(tdb);
diff --git a/lib/tdb2/test/run-tdb1-wronghash-fail.c b/lib/tdb2/test/run-tdb1-wronghash-fail.c
index 368835ed7f..97a8293e7d 100644
--- a/lib/tdb2/test/run-tdb1-wronghash-fail.c
+++ b/lib/tdb2/test/run-tdb1-wronghash-fail.c
@@ -11,6 +11,18 @@ static void log_fn(struct tdb1_context *tdb, enum tdb_log_level level,
(*count)++;
}
+static unsigned int jenkins_hashfn(TDB_DATA *key)
+{
+ return hashlittle(key->dptr, key->dsize);
+}
+
+/* the tdb1_old_hash function is "magic" as it automatically makes us test the
+ * tdb1_incompatible_hash as well, so use this wrapper. */
+static unsigned int old_hash(TDB_DATA *key)
+{
+ return tdb1_old_hash(key);
+}
+
int main(int argc, char *argv[])
{
struct tdb1_context *tdb;
@@ -33,7 +45,7 @@ int main(int argc, char *argv[])
/* Fail to open with different hash. */
tdb = tdb1_open_ex("run-wronghash-fail.tdb", 0, 0, O_RDWR, 0,
- &log_ctx, tdb1_jenkins_hash);
+ &log_ctx, jenkins_hashfn);
ok1(!tdb);
ok1(log_count == 1);
@@ -41,7 +53,7 @@ int main(int argc, char *argv[])
log_count = 0;
tdb = tdb1_open_ex("run-wronghash-fail.tdb", 0, 0,
O_CREAT|O_RDWR|O_TRUNC,
- 0600, &log_ctx, tdb1_jenkins_hash);
+ 0600, &log_ctx, jenkins_hashfn);
ok1(tdb);
ok1(log_count == 0);
tdb1_close(tdb);
@@ -49,26 +61,26 @@ int main(int argc, char *argv[])
/* Endian should be no problem. */
log_count = 0;
tdb = tdb1_open_ex("test/jenkins-le-hash.tdb1", 0, 0, O_RDWR, 0,
- &log_ctx, tdb1_old_hash);
+ &log_ctx, old_hash);
ok1(!tdb);
ok1(log_count == 1);
log_count = 0;
tdb = tdb1_open_ex("test/jenkins-be-hash.tdb1", 0, 0, O_RDWR, 0,
- &log_ctx, tdb1_old_hash);
+ &log_ctx, old_hash);
ok1(!tdb);
ok1(log_count == 1);
log_count = 0;
/* Fail to open with old default hash. */
tdb = tdb1_open_ex("run-wronghash-fail.tdb", 0, 0, O_RDWR, 0,
- &log_ctx, tdb1_old_hash);
+ &log_ctx, old_hash);
ok1(!tdb);
ok1(log_count == 1);
log_count = 0;
tdb = tdb1_open_ex("test/jenkins-le-hash.tdb1", 0, 0, O_RDONLY,
- 0, &log_ctx, tdb1_jenkins_hash);
+ 0, &log_ctx, tdb1_incompatible_hash);
ok1(tdb);
ok1(log_count == 0);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
@@ -76,7 +88,7 @@ int main(int argc, char *argv[])
log_count = 0;
tdb = tdb1_open_ex("test/jenkins-be-hash.tdb1", 0, 0, O_RDONLY,
- 0, &log_ctx, tdb1_jenkins_hash);
+ 0, &log_ctx, tdb1_incompatible_hash);
ok1(tdb);
ok1(log_count == 0);
ok1(tdb1_check(tdb, NULL, NULL) == 0);