diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2014-05-29 08:02:15 -0600 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2014-05-29 08:02:15 -0600 |
commit | 2eaf8f7ce0ced2b5660f41a169447a8520bcc943 (patch) | |
tree | 338a93407332c554e0b703cb649a63a9874afff2 /db_test.go | |
parent | Merge pull request #177 from tv42/tx-copy-rollback (diff) | |
download | dedo-2eaf8f7ce0ced2b5660f41a169447a8520bcc943.tar.gz dedo-2eaf8f7ce0ced2b5660f41a169447a8520bcc943.tar.xz |
Add freelist assertion on every free().
This commit performs a check on the freelist pages to ensure that a double free can never happen.
Diffstat (limited to 'db_test.go')
-rw-r--r-- | db_test.go | 46 |
1 files changed, 46 insertions, 0 deletions
@@ -335,6 +335,52 @@ func TestMeta_validate_version(t *testing.T) { assert.Equal(t, m.validate(), ErrVersionMismatch) } +// Ensure that a DB in strict mode will fail when corrupted. +func TestDB_StrictMode(t *testing.T) { + var msg string + func() { + defer func() { + msg = fmt.Sprintf("%s", recover()) + }() + + withOpenDB(func(db *DB, path string) { + db.StrictMode = true + db.Update(func(tx *Tx) error { + tx.CreateBucket([]byte("foo")) + + // Corrupt the DB by extending the high water mark. + tx.meta.pgid++ + + return nil + }) + }) + }() + + assert.Equal(t, "check fail: page 4: unreachable unfreed", msg) +} + +// Ensure that a double freeing a page will result in a panic. +func TestDB_DoubleFree(t *testing.T) { + var msg string + func() { + defer func() { + msg = fmt.Sprintf("%s", recover()) + }() + withOpenDB(func(db *DB, path string) { + db.Update(func(tx *Tx) error { + tx.CreateBucket([]byte("foo")) + + // Corrupt the DB by adding a page to the freelist. + db.freelist.free(0, tx.page(3)) + + return nil + }) + }) + }() + + assert.Equal(t, "tx 2: page 3 already freed in tx 0", msg) +} + func ExampleDB_Update() { // Open the database. db, _ := Open(tempfile(), 0666) |