]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/hash.c
tdb2: fix coalesce race #3
[ccan] / ccan / tdb2 / hash.c
index ae9442d934d149717cd13200bea98b8424466cfa..dec7aae554acbd0f21fd10bf44c886ef72aae9ae 100644 (file)
@@ -537,7 +537,7 @@ again:
 /* Return 1 if we find something, 0 if not, -1 on error. */
 int next_in_hash(struct tdb_context *tdb, int ltype,
                 struct traverse_info *tinfo,
-                TDB_DATA *kbuf, unsigned int *dlen)
+                TDB_DATA *kbuf, size_t *dlen)
 {
        const unsigned group_bits = TDB_TOPLEVEL_HASH_BITS-TDB_HASH_GROUP_BITS;
        tdb_off_t hlock_start, hlock_range, off;
@@ -560,6 +560,14 @@ int next_in_hash(struct tdb_context *tdb, int ltype,
                                                  ltype);
                                return -1;
                        }
+                       if (rec_magic(&rec) != TDB_MAGIC) {
+                               tdb->log(tdb, TDB_DEBUG_FATAL, tdb->log_priv,
+                                        "next_in_hash:"
+                                        " corrupt record at %llu\n",
+                                        (long long)off);
+                               return -1;
+                       }
+
                        kbuf->dsize = rec_key_length(&rec);
 
                        /* They want data as well? */
@@ -591,7 +599,7 @@ int next_in_hash(struct tdb_context *tdb, int ltype,
 /* Return 1 if we find something, 0 if not, -1 on error. */
 int first_in_hash(struct tdb_context *tdb, int ltype,
                  struct traverse_info *tinfo,
-                 TDB_DATA *kbuf, unsigned int *dlen)
+                 TDB_DATA *kbuf, size_t *dlen)
 {
        tinfo->prev = 0;
        tinfo->toplevel_group = 0;