diff options
Diffstat (limited to 'src/wallet/walletdb.cpp')
-rw-r--r-- | src/wallet/walletdb.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp index 6a8f0d2481..826cecfb6f 100644 --- a/src/wallet/walletdb.cpp +++ b/src/wallet/walletdb.cpp @@ -315,6 +315,7 @@ public: std::map<uint160, CHDChain> m_hd_chains; bool tx_corrupt{false}; bool descriptor_unknown{false}; + bool unexpected_legacy_entry{false}; CWalletScanState() = default; }; @@ -332,6 +333,11 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, if (filter_fn && !filter_fn(strType)) { return true; } + // Legacy entries in descriptor wallets are not allowed, abort immediately + if (pwallet->IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS) && DBKeys::LEGACY_TYPES.count(strType) > 0) { + wss.unexpected_legacy_entry = true; + return false; + } if (strType == DBKeys::NAME) { std::string strAddress; ssKey >> strAddress; @@ -482,7 +488,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, if (!ssValue.eof()) { uint256 checksum; ssValue >> checksum; - if ((checksum_valid = Hash(vchPrivKey) != checksum)) { + if (!(checksum_valid = Hash(vchPrivKey) == checksum)) { strErr = "Error reading wallet database: Encrypted key corrupt"; return false; } @@ -833,6 +839,12 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet) std::string strType, strErr; if (!ReadKeyValue(pwallet, ssKey, ssValue, wss, strType, strErr)) { + if (wss.unexpected_legacy_entry) { + strErr = strprintf("Error: Unexpected legacy entry found in descriptor wallet %s. ", pwallet->GetName()); + strErr += "The wallet might have been tampered with or created with malicious intent."; + pwallet->WalletLogPrintf("%s\n", strErr); + return DBErrors::UNEXPECTED_LEGACY_ENTRY; + } // losing keys is considered a catastrophic error, anything else // we assume the user can live with: if (IsKeyType(strType) || strType == DBKeys::DEFAULTKEY) { |