From 115648946c7a78e87fb45eac6c1759a347d4c7f8 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 1 Dec 2010 23:40:05 +1030 Subject: [PATCH] tdb2: compare the extra 11 hash bits in the header. We already have 10 hash bits encoded in the offset itself; we only get here incorrectly about 1 time in 1000, so it's a pretty minor optimization at best. Nonetheless, we have the information, so let's check it before accessing the key. This reduces the probability of a false keycmp by another factor of 2000. --- ccan/tdb2/hash.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ccan/tdb2/hash.c b/ccan/tdb2/hash.c index d4d08e42..7ade36d3 100644 --- a/ccan/tdb2/hash.c +++ b/ccan/tdb2/hash.c @@ -108,12 +108,16 @@ static bool match(struct tdb_context *tdb, if (tdb_read_convert(tdb, off, rec, sizeof(*rec)) == -1) return ret; - /* FIXME: check extra bits in header? */ if (rec_key_length(rec) != key->dsize) { add_stat(tdb, compare_wrong_keylen, 1); return ret; } + if ((h->h & ((1 << 11)-1)) != rec_hash(rec)) { + add_stat(tdb, compare_wrong_rechash, 1); + return false; + } + rkey = tdb_access_read(tdb, off + sizeof(*rec), key->dsize, false); if (!rkey) return ret; -- 2.39.2