aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@exmulti.com>2012-05-22 14:39:49 -0700
committerJeff Garzik <jgarzik@exmulti.com>2012-05-22 14:39:49 -0700
commit5d0f7c4f47e6b9aa382846dd9b4a034e724d461a (patch)
treece4b08cbe53dee3091698617fdcecb1665f7ccd0
parentfa638ec8af92d6deaf17d3c09b03406808f19904 (diff)
parent8fe791e4e2db4b66f47d44d2ecaf734e2a36e5ed (diff)
Merge pull request #1381 from jgarzik/check-deser
Prevent crashes due to missing or corrupted database records
-rw-r--r--src/db.cpp16
-rw-r--r--src/db.h9
-rw-r--r--src/main.cpp5
-rw-r--r--src/main.h15
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();
diff --git a/src/db.h b/src/db.h
index b8fc4db512..a67193b680 100644
--- a/src/db.h
+++ b/src/db.h
@@ -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))