diff options
| author | Ross Nicoll <[email protected]> | 2014-08-07 22:58:50 +0100 |
|---|---|---|
| committer | Ross Nicoll <[email protected]> | 2014-08-16 15:27:18 +0100 |
| commit | 5cbda4f10f16923910de2bd080152fc7bbc48738 (patch) | |
| tree | d97408d2785dabf09d3fdbe1d65f9fad799d4c9b /src/txdb.cpp | |
| parent | Merge pull request #4645 (diff) | |
| download | discoin-5cbda4f10f16923910de2bd080152fc7bbc48738.tar.xz discoin-5cbda4f10f16923910de2bd080152fc7bbc48738.zip | |
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).
Diffstat (limited to 'src/txdb.cpp')
| -rw-r--r-- | src/txdb.cpp | 6 |
1 files 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<leveldb::Iterator> 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<leveldb::Iterator> 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; } |