mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 15:04:44 +01:00
Return false on corrupt tx rather than asserting
Co-authored-by: Russell Yanofsky <russ@yanofsky.org> Co-authored-by: Andrew Chow <achow101-github@achow101.com>
This commit is contained in:
parent
ccc4b9125a
commit
0ab4c3b272
1 changed files with 13 additions and 1 deletions
|
@ -311,6 +311,7 @@ public:
|
||||||
std::map<std::pair<uint256, CKeyID>, CKey> m_descriptor_keys;
|
std::map<std::pair<uint256, CKeyID>, CKey> m_descriptor_keys;
|
||||||
std::map<std::pair<uint256, CKeyID>, std::pair<CPubKey, std::vector<unsigned char>>> m_descriptor_crypt_keys;
|
std::map<std::pair<uint256, CKeyID>, std::pair<CPubKey, std::vector<unsigned char>>> m_descriptor_crypt_keys;
|
||||||
std::map<uint160, CHDChain> m_hd_chains;
|
std::map<uint160, CHDChain> m_hd_chains;
|
||||||
|
bool tx_corrupt{false};
|
||||||
|
|
||||||
CWalletScanState() {
|
CWalletScanState() {
|
||||||
}
|
}
|
||||||
|
@ -345,7 +346,13 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
||||||
// LoadToWallet call below creates a new CWalletTx that fill_wtx
|
// LoadToWallet call below creates a new CWalletTx that fill_wtx
|
||||||
// callback fills with transaction metadata.
|
// callback fills with transaction metadata.
|
||||||
auto fill_wtx = [&](CWalletTx& wtx, bool new_tx) {
|
auto fill_wtx = [&](CWalletTx& wtx, bool new_tx) {
|
||||||
assert(new_tx);
|
if(!new_tx) {
|
||||||
|
// There's some corruption here since the tx we just tried to load was already in the wallet.
|
||||||
|
// We don't consider this type of corruption critical, and can fix it by removing tx data and
|
||||||
|
// rescanning.
|
||||||
|
wss.tx_corrupt = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
ssValue >> wtx;
|
ssValue >> wtx;
|
||||||
if (wtx.GetHash() != hash)
|
if (wtx.GetHash() != hash)
|
||||||
return false;
|
return false;
|
||||||
|
@ -818,6 +825,11 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet)
|
||||||
} else if (strType == DBKeys::FLAGS) {
|
} else if (strType == DBKeys::FLAGS) {
|
||||||
// reading the wallet flags can only fail if unknown flags are present
|
// reading the wallet flags can only fail if unknown flags are present
|
||||||
result = DBErrors::TOO_NEW;
|
result = DBErrors::TOO_NEW;
|
||||||
|
} else if (wss.tx_corrupt) {
|
||||||
|
pwallet->WalletLogPrintf("Error: Corrupt transaction found. This can be fixed by removing transactions from wallet and rescanning.\n");
|
||||||
|
// Set tx_corrupt back to false so that the error is only printed once (per corrupt tx)
|
||||||
|
wss.tx_corrupt = false;
|
||||||
|
result = DBErrors::CORRUPT;
|
||||||
} else {
|
} else {
|
||||||
// Leave other errors alone, if we try to fix them we might make things worse.
|
// Leave other errors alone, if we try to fix them we might make things worse.
|
||||||
fNoncriticalErrors = true; // ... but do warn the user there is something wrong.
|
fNoncriticalErrors = true; // ... but do warn the user there is something wrong.
|
||||||
|
|
Loading…
Add table
Reference in a new issue