Browse Source

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.
Rusty Russell 15 years ago
parent
commit
115648946c
1 changed files with 5 additions and 1 deletions
  1. 5 1
      ccan/tdb2/hash.c

+ 5 - 1
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)
 	if (tdb_read_convert(tdb, off, rec, sizeof(*rec)) == -1)
 		return ret;
 		return ret;
 
 
-	/* FIXME: check extra bits in header? */
 	if (rec_key_length(rec) != key->dsize) {
 	if (rec_key_length(rec) != key->dsize) {
 		add_stat(tdb, compare_wrong_keylen, 1);
 		add_stat(tdb, compare_wrong_keylen, 1);
 		return ret;
 		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);
 	rkey = tdb_access_read(tdb, off + sizeof(*rec), key->dsize, false);
 	if (!rkey)
 	if (!rkey)
 		return ret;
 		return ret;