Browse Source

tdb2: fix valgrind warnings.

The unreserved headers were a real bug; the others could cause a false error too.
Rusty Russell 15 years ago
parent
commit
9faf17435f
2 changed files with 13 additions and 8 deletions
  1. 12 7
      ccan/tdb2/lock.c
  2. 1 1
      ccan/tdb2/tdb.c

+ 12 - 7
ccan/tdb2/lock.c

@@ -255,13 +255,18 @@ static int tdb_nest_lock(struct tdb_context *tdb, tdb_off_t offset, int ltype,
 {
 {
 	struct tdb_lock_type *new_lck;
 	struct tdb_lock_type *new_lck;
 
 
-	if (offset >= TDB_HASH_LOCK_START + (1ULL << tdb->header.v.hash_bits)
-	    + (tdb->header.v.num_zones * (tdb->header.v.free_buckets+1))) {
-		tdb->ecode = TDB_ERR_LOCK;
-		tdb->log(tdb, TDB_DEBUG_FATAL, tdb->log_priv,
-			 "tdb_lock: invalid offset %llu for ltype=%d\n",
-			 (long long)offset, ltype);
-		return -1;
+	/* Header is not valid for open lock; valgrind complains. */
+	if (offset >= TDB_HASH_LOCK_START) {
+		if (offset > TDB_HASH_LOCK_START
+		    + (1ULL << tdb->header.v.hash_bits)
+		    + (tdb->header.v.num_zones
+		       * (tdb->header.v.free_buckets+1))) {
+			tdb->ecode = TDB_ERR_LOCK;
+			tdb->log(tdb, TDB_DEBUG_FATAL, tdb->log_priv,
+				 "tdb_lock: invalid offset %llu ltype=%d\n",
+				 (long long)offset, ltype);
+			return -1;
+		}
 	}
 	}
 	if (tdb->flags & TDB_NOLOCK)
 	if (tdb->flags & TDB_NOLOCK)
 		return 0;
 		return 0;

+ 1 - 1
ccan/tdb2/tdb.c

@@ -147,7 +147,7 @@ static int tdb_new_database(struct tdb_context *tdb)
 					 sizeof(newdb.hdr.hash_test),
 					 sizeof(newdb.hdr.hash_test),
 					 newdb.hdr.hash_seed,
 					 newdb.hdr.hash_seed,
 					 tdb->hash_priv);
 					 tdb->hash_priv);
-
+	memset(newdb.hdr.reserved, 0, sizeof(newdb.hdr.reserved));
 	newdb.hdr.v.generation = 0;
 	newdb.hdr.v.generation = 0;
 
 
 	/* The initial zone must cover the initial database size! */
 	/* The initial zone must cover the initial database size! */