From fdf3c148052f30d10e8c72fbdbdaf67d4a51b11e Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 10 Sep 2010 12:50:16 +0930 Subject: [PATCH 1/1] 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. --- ccan/tdb/_info | 7 ++- ccan/tdb/test/jenkins-be-hash.tdb | Bin 0 -> 696 bytes ccan/tdb/test/jenkins-le-hash.tdb | Bin 0 -> 696 bytes ccan/tdb/test/run-wronghash-old.c | 68 ++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 ccan/tdb/test/jenkins-be-hash.tdb create mode 100644 ccan/tdb/test/jenkins-le-hash.tdb create mode 100644 ccan/tdb/test/run-wronghash-old.c 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 0000000000000000000000000000000000000000..45b5f09a1b619b4f79201057dd811781d4151d33 GIT binary patch literal 696 ncmWG>aZ*Uj%t_^9zz%XH8P%GBQt3za#j&dx6&(!$`iB4j>yiaW literal 0 HcmV?d00001 diff --git a/ccan/tdb/test/jenkins-le-hash.tdb b/ccan/tdb/test/jenkins-le-hash.tdb new file mode 100644 index 0000000000000000000000000000000000000000..45b5f09a1b619b4f79201057dd811781d4151d33 GIT binary patch literal 696 ncmWG>aZ*Uj%t_^9zz%XH8P%GBQt3za#j&dx6&(!$`iB4j>yiaW literal 0 HcmV?d00001 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(); +} -- 2.39.2