From 5cbda4f10f16923910de2bd080152fc7bbc48738 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Thu, 7 Aug 2014 22:58:50 +0100 Subject: [PATCH] Changed LevelDB cursors to use scoped pointers to ensure destruction when going out of scope. This corrects a bug where an exception thrown reading from the database causes the cursor to be left open, which causes an assertion error to occur when the database is deleted (around line 938 of init.cpp). --- src/txdb.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/txdb.cpp b/src/txdb.cpp index 52cd96283..d3d05c58d 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -103,7 +103,7 @@ bool CBlockTreeDB::ReadLastBlockFile(int &nFile) { } bool CCoinsViewDB::GetStats(CCoinsStats &stats) { - leveldb::Iterator *pcursor = db.NewIterator(); + boost::scoped_ptr pcursor(db.NewIterator()); pcursor->SeekToFirst(); CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); @@ -146,7 +146,6 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) { return error("%s : Deserialize or I/O error - %s", __func__, e.what()); } } - delete pcursor; stats.nHeight = mapBlockIndex.find(GetBestBlock())->second->nHeight; stats.hashSerialized = ss.GetHash(); stats.nTotalAmount = nTotalAmount; @@ -178,7 +177,7 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) { bool CBlockTreeDB::LoadBlockIndexGuts() { - leveldb::Iterator *pcursor = NewIterator(); + boost::scoped_ptr pcursor(NewIterator()); CDataStream ssKeySet(SER_DISK, CLIENT_VERSION); ssKeySet << make_pair('b', uint256(0)); @@ -224,7 +223,6 @@ bool CBlockTreeDB::LoadBlockIndexGuts() return error("%s : Deserialize or I/O error - %s", __func__, e.what()); } } - delete pcursor; return true; }