tdb: fix recovery reuse after crash
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 4 Feb 2010 13:29:54 +0000 (23:59 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 10 Feb 2010 06:26:14 +0000 (16:56 +1030)
commitb37b452cb8c1f56b37b04abe7bffdede371ca361
tree337e63a2be310ca1107aa37ec5bd18b5aa705fd8
parent6269cdcd1538e2e3cead9e0f3c156b0363d607a0
tdb: fix recovery reuse after crash

If a process (or the machine) dies after just after writing the
recovery head (pointing at the end of file), the recovery record will filled
with 0x42.  This will not invoke a recovery on open, since rec.magic
!= TDB_RECOVERY_MAGIC.

Unfortunately, the first transaction commit will happily reuse that
area: tdb_recovery_allocate() doesn't check the magic.  The recovery
record has length 0x42424242, and it writes that back into the
now-valid-looking transaction header) for the next comer (which
happens to be tdb_wipe_all in my tests).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
lib/tdb/common/transaction.c