Browse Source

wallet: Warn on unexpected EOF while salvaging wallet

Check for EOF before every getline, and warn when reading gets to EOF
before the end of the data.

Stricter error checking could shed more light on issues such as #7463
and #7379.
0.13
Wladimir J. van der Laan 9 years ago
parent
commit
ca8fb59ae1
  1. 22
      src/wallet/db.cpp

22
src/wallet/db.cpp

@ -165,6 +165,11 @@ CDBEnv::VerifyResult CDBEnv::Verify(const std::string& strFile, bool (*recoverFu
return (fRecovered ? RECOVER_OK : RECOVER_FAIL); return (fRecovered ? RECOVER_OK : RECOVER_FAIL);
} }
/* End of headers, beginning of key/value data */
static const char *HEADER_END = "HEADER=END";
/* End of key/value data */
static const char *DATA_END = "DATA=END";
bool CDBEnv::Salvage(const std::string& strFile, bool fAggressive, std::vector<CDBEnv::KeyValPair>& vResult) bool CDBEnv::Salvage(const std::string& strFile, bool fAggressive, std::vector<CDBEnv::KeyValPair>& vResult)
{ {
LOCK(cs_db); LOCK(cs_db);
@ -199,18 +204,29 @@ bool CDBEnv::Salvage(const std::string& strFile, bool fAggressive, std::vector<C
// DATA=END // DATA=END
string strLine; string strLine;
while (!strDump.eof() && strLine != "HEADER=END") while (!strDump.eof() && strLine != HEADER_END)
getline(strDump, strLine); // Skip past header getline(strDump, strLine); // Skip past header
std::string keyHex, valueHex; std::string keyHex, valueHex;
while (!strDump.eof() && keyHex != "DATA=END") { while (!strDump.eof() && keyHex != DATA_END) {
getline(strDump, keyHex); getline(strDump, keyHex);
if (keyHex != "DATA=END") { if (keyHex != DATA_END) {
if (strDump.eof())
break;
getline(strDump, valueHex); getline(strDump, valueHex);
if (valueHex == DATA_END) {
LogPrintf("CDBEnv::Salvage: WARNING: Number of keys in data does not match number of values.\n");
break;
}
vResult.push_back(make_pair(ParseHex(keyHex), ParseHex(valueHex))); vResult.push_back(make_pair(ParseHex(keyHex), ParseHex(valueHex)));
} }
} }
if (keyHex != DATA_END) {
LogPrintf("CDBEnv::Salvage: WARNING: Unexpected end of file while reading salvage output.\n");
return false;
}
return (result == 0); return (result == 0);
} }

Loading…
Cancel
Save