diff options
author | Jeff Garzik <jgarzik@exmulti.com> | 2012-05-22 14:39:49 -0700 |
---|---|---|
committer | Jeff Garzik <jgarzik@exmulti.com> | 2012-05-22 14:39:49 -0700 |
commit | 5d0f7c4f47e6b9aa382846dd9b4a034e724d461a (patch) | |
tree | ce4b08cbe53dee3091698617fdcecb1665f7ccd0 | |
parent | fa638ec8af92d6deaf17d3c09b03406808f19904 (diff) | |
parent | 8fe791e4e2db4b66f47d44d2ecaf734e2a36e5ed (diff) |
Merge pull request #1381 from jgarzik/check-deser
Prevent crashes due to missing or corrupted database records
-rw-r--r-- | src/db.cpp | 16 | ||||
-rw-r--r-- | src/db.h | 9 | ||||
-rw-r--r-- | src/main.cpp | 5 | ||||
-rw-r--r-- | src/main.h | 15 |
4 files changed, 37 insertions, 8 deletions
diff --git a/src/db.cpp b/src/db.cpp index a0b9dc20f7..5c169fe0ca 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -416,9 +416,15 @@ bool CTxDB::ReadOwnerTxes(uint160 hash160, int nMinHeight, vector<CTransaction>& string strType; uint160 hashItem; CDiskTxPos pos; - ssKey >> strType >> hashItem >> pos; int nItemHeight; - ssValue >> nItemHeight; + + try { + ssKey >> strType >> hashItem >> pos; + ssValue >> nItemHeight; + } + catch (std::exception &e) { + return error("%s() : deserialize error", __PRETTY_FUNCTION__); + } // Read transaction if (strType != "owner" || hashItem != hash160) @@ -533,6 +539,8 @@ bool CTxDB::LoadBlockIndex() return false; // Unserialize + + try { string strType; ssKey >> strType; if (strType == "blockindex" && !fRequestShutdown) @@ -564,6 +572,10 @@ bool CTxDB::LoadBlockIndex() { break; // if shutdown requested or finished loading block index } + } // try + catch (std::exception &e) { + return error("%s() : deserialize error", __PRETTY_FUNCTION__); + } } pcursor->close(); @@ -72,8 +72,13 @@ protected: return false; // Unserialize value - CDataStream ssValue((char*)datValue.get_data(), (char*)datValue.get_data() + datValue.get_size(), SER_DISK, CLIENT_VERSION); - ssValue >> value; + try { + CDataStream ssValue((char*)datValue.get_data(), (char*)datValue.get_data() + datValue.get_size(), SER_DISK, CLIENT_VERSION); + ssValue >> value; + } + catch (std::exception &e) { + return false; + } // Clear and free memory memset(datValue.get_data(), 0, datValue.get_size()); diff --git a/src/main.cpp b/src/main.cpp index 2c7f1fa5a1..546f8542a9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2133,8 +2133,9 @@ bool LoadExternalBlockFile(FILE* fileIn) } } } - catch (std::exception &e) - { + catch (std::exception &e) { + printf("%s() : Deserialize or I/O error caught during load\n", + __PRETTY_FUNCTION__); } } printf("Loaded %i blocks from external file\n", nLoaded); diff --git a/src/main.h b/src/main.h index ac5ba254ce..c0fe63a32a 100644 --- a/src/main.h +++ b/src/main.h @@ -593,7 +593,13 @@ public: // Read transaction if (fseek(filein, pos.nTxPos, SEEK_SET) != 0) return error("CTransaction::ReadFromDisk() : fseek failed"); - filein >> *this; + + try { + filein >> *this; + } + catch (std::exception &e) { + return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__); + } // Return file pointer if (pfileRet) @@ -969,7 +975,12 @@ public: filein.nType |= SER_BLOCKHEADERONLY; // Read block - filein >> *this; + try { + filein >> *this; + } + catch (std::exception &e) { + return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__); + } // Check the header if (!CheckProofOfWork(GetHash(), nBits)) |