X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Ftdb1_transaction.c;h=9cb95235662d7864e3739e75f9d86ee1d8760715;hb=0b93bd102aad6b61f1e569fb12aabc6352a1d7cd;hp=411caef360d4ff5e1353b60263e7252d87d9ef1f;hpb=afa6d57b7d93fe4675a952f556eb462951baa257;p=ccan diff --git a/ccan/tdb2/tdb1_transaction.c b/ccan/tdb2/tdb1_transaction.c index 411caef3..9cb95235 100644 --- a/ccan/tdb2/tdb1_transaction.c +++ b/ccan/tdb2/tdb1_transaction.c @@ -376,9 +376,9 @@ static void transaction1_next_hash_chain(struct tdb_context *tdb, uint32_t *chai /* out of bounds check during a transaction */ -static int transaction1_oob(struct tdb_context *tdb, tdb1_off_t len, int probe) +static int transaction1_oob(struct tdb_context *tdb, tdb1_off_t off, tdb1_off_t len, int probe) { - if (len <= tdb->file->map_size) { + if (off + len >= off && off + len <= tdb->file->map_size) { return 0; } tdb->last_error = TDB_ERR_IO; @@ -520,7 +520,7 @@ static int _tdb1_transaction_start(struct tdb_context *tdb) /* make sure we know about any file expansions already done by anyone else */ - tdb->tdb1.io->tdb1_oob(tdb, tdb->file->map_size + 1, 1); + tdb->tdb1.io->tdb1_oob(tdb, tdb->file->map_size, 1, 1); tdb->tdb1.transaction->old_map_size = tdb->file->map_size; /* finally hook the io methods, replacing them with @@ -745,8 +745,11 @@ static int tdb1_recovery_allocate(struct tdb_context *tdb, *recovery_size = tdb1_recovery_size(tdb); /* round up to a multiple of page size */ - *recovery_max_size = TDB1_ALIGN(sizeof(rec) + *recovery_size, - tdb->tdb1.page_size) - sizeof(rec); + *recovery_max_size = tdb1_expand_adjust(tdb->file->map_size, + *recovery_size, + tdb->tdb1.page_size) + - sizeof(rec); + *recovery_offset = tdb->file->map_size; recovery_head = *recovery_offset; @@ -761,7 +764,7 @@ static int tdb1_recovery_allocate(struct tdb_context *tdb, tdb->stats.transaction_expand_file++; /* remap the file (if using mmap) */ - methods->tdb1_oob(tdb, tdb->file->map_size + 1, 1); + methods->tdb1_oob(tdb, tdb->file->map_size, 1, 1); /* we have to reset the old map size so that we don't try to expand the file again in the transaction commit, which would destroy the recovery area */ @@ -1022,7 +1025,7 @@ static int _tdb1_transaction_prepare_commit(struct tdb_context *tdb) } tdb->stats.transaction_expand_file++; tdb->file->map_size = tdb->tdb1.transaction->old_map_size; - methods->tdb1_oob(tdb, tdb->file->map_size + 1, 1); + methods->tdb1_oob(tdb, tdb->file->map_size, 1, 1); } /* Keep the open lock until the actual commit */