From: Rusty Russell Date: Fri, 10 Sep 2010 03:20:16 +0000 (+0930) Subject: tdb: test that new-style TDBs with non-default hashes can't be opened. X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=fdf3c148052f30d10e8c72fbdbdaf67d4a51b11e;hp=63bceea014e091a2f2907e49f7c3b33f042106f4 tdb: test that new-style TDBs with non-default hashes can't be opened. We currently allow opening of a TDB without any idea if we're using the right hash function. Since most people use the default, this hasn't been a big issue. The next change will put an example hash value in the rwlocks field in the header: current TDB already refuses to open a TDB with this field non-zero. This commit simply adds tests that that occurs. --- diff --git a/ccan/tdb/_info b/ccan/tdb/_info index 75f20b45..7ba90f79 100644 --- a/ccan/tdb/_info +++ b/ccan/tdb/_info @@ -1,4 +1,5 @@ #include +#include /** * tdb - The trivial (transactional) database @@ -63,14 +64,18 @@ * Author: Andrew Tridgell, Jeremy Allison, Rusty Russell * * Licence: LGPLv3 (or later) + * + * Fails: valgrind-tests // valgrind breaks fcntl locks. */ int main(int argc, char *argv[]) { if (argc != 2) return 1; - if (strcmp(argv[1], "depends") == 0) + if (strcmp(argv[1], "depends") == 0) { + printf("ccan/hash\n"); return 0; + } return 1; } diff --git a/ccan/tdb/test/jenkins-be-hash.tdb b/ccan/tdb/test/jenkins-be-hash.tdb new file mode 100644 index 00000000..45b5f09a Binary files /dev/null and b/ccan/tdb/test/jenkins-be-hash.tdb differ diff --git a/ccan/tdb/test/jenkins-le-hash.tdb b/ccan/tdb/test/jenkins-le-hash.tdb new file mode 100644 index 00000000..45b5f09a Binary files /dev/null and b/ccan/tdb/test/jenkins-le-hash.tdb differ diff --git a/ccan/tdb/test/run-wronghash-old.c b/ccan/tdb/test/run-wronghash-old.c new file mode 100644 index 00000000..3f1955ee --- /dev/null +++ b/ccan/tdb/test/run-wronghash-old.c @@ -0,0 +1,68 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static unsigned int non_jenkins_hash(TDB_DATA *key) +{ + return ~hash_stable(key->dptr, key->dsize, 0); +} + +static void log_fn(struct tdb_context *tdb, enum tdb_debug_level level, const char *fmt, ...) +{ + unsigned int *count = tdb_get_logging_private(tdb); + /* Old code used to complain about spinlocks on new databases. */ + if (strstr(fmt, "spinlock")) + (*count)++; +} + +/* The old code should barf on new-style TDBs created with a non-default hash. + */ +int main(int argc, char *argv[]) +{ + struct tdb_context *tdb; + unsigned int log_count; + struct tdb_logging_context log_ctx = { log_fn, &log_count }; + + plan_tests(8); + + /* We should fail to open new-style non-default-hash tdbs of + * either endian. */ + log_count = 0; + tdb = tdb_open_ex("test/jenkins-le-hash.tdb", 0, 0, O_RDWR, 0, + &log_ctx, NULL); + ok1(!tdb); + ok1(log_count == 1); + + log_count = 0; + tdb = tdb_open_ex("test/jenkins-be-hash.tdb", 0, 0, O_RDWR, 0, + &log_ctx, NULL); + ok1(!tdb); + ok1(log_count == 1); + + /* And of course, if we use the wrong hash it will still fail. */ + log_count = 0; + tdb = tdb_open_ex("test/jenkins-le-hash.tdb", 0, 0, O_RDWR, 0, + &log_ctx, non_jenkins_hash); + ok1(!tdb); + ok1(log_count == 1); + + log_count = 0; + tdb = tdb_open_ex("test/jenkins-be-hash.tdb", 0, 0, O_RDWR, 0, + &log_ctx, non_jenkins_hash); + ok1(!tdb); + ok1(log_count == 1); + + return exit_status(); +}