Browse Source

Merge pull request #1381 from jgarzik/check-deser

Prevent crashes due to missing or corrupted database records
0.8
Jeff Garzik 13 years ago
parent
commit
5d0f7c4f47
  1. 16
      src/db.cpp
  2. 9
      src/db.h
  3. 5
      src/main.cpp
  4. 15
      src/main.h

16
src/db.cpp

@ -416,9 +416,15 @@ bool CTxDB::ReadOwnerTxes(uint160 hash160, int nMinHeight, vector<CTransaction>& @@ -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() @@ -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() @@ -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();

9
src/db.h

@ -72,8 +72,13 @@ protected: @@ -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());

5
src/main.cpp

@ -2133,8 +2133,9 @@ bool LoadExternalBlockFile(FILE* fileIn) @@ -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);

15
src/main.h

@ -593,7 +593,13 @@ public: @@ -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: @@ -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))

Loading…
Cancel
Save