+
+ /* If we crash after ftruncate, we can get zeroes or fill. */
+ if (p->r.magic == TDB_RECOVERY_INVALID_MAGIC
+ || p->r.magic == 0x4343434343434343ULL) {
+ if (recovery == off) {
+ found_recovery = true;
+ len = sizeof(p->r) + p->r.max_len;
+ } else {
+ len = dead_space(tdb, off);
+ if (len < sizeof(p->r)) {
+ tdb->log(tdb, TDB_DEBUG_ERROR,
+ tdb->log_priv,
+ "tdb_check: invalid dead space"
+ " at %zu\n", (size_t)off);
+ return false;
+ }
+
+ tdb->log(tdb, TDB_DEBUG_WARNING, tdb->log_priv,
+ "Dead space at %zu-%zu (of %zu)\n",
+ (size_t)off, (size_t)(off + len),
+ (size_t)tdb->map_size);
+ }
+ } else if (p->r.magic == TDB_RECOVERY_MAGIC) {
+ if (recovery != off) {
+ tdb->log(tdb, TDB_DEBUG_ERROR, tdb->log_priv,
+ "tdb_check: unexpected recovery"
+ " record at offset %zu\n",
+ (size_t)off);
+ return false;
+ }
+ found_recovery = true;
+ len = sizeof(p->r) + p->r.max_len;
+ } else if (frec_magic(&p->f) == TDB_FREE_MAGIC
+ || frec_magic(&p->f) == TDB_COALESCING_MAGIC) {