diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2014-06-10 09:42:42 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2014-08-18 15:34:29 +0200 |
commit | 4b57c5b3c7f425a8cd122491c9dd69fe52dd3715 (patch) | |
tree | ae6cf8bc1bd8e479a5e23b652c8e61a5227351a0 | |
parent | f8cdf4f93704c3a123fa10b41efdc7e63cb5f1bf (diff) |
Ignore too-long redeemScripts while loading wallet
This avoids that long redeemScripts that were grandfathered in
prevent the wallet from loading.
Fixes #4313.
Rebased-From: 18116b0
-rw-r--r-- | src/wallet.cpp | 16 | ||||
-rw-r--r-- | src/wallet.h | 2 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/wallet.cpp b/src/wallet.cpp index bc132ad046..80f011e7df 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -128,6 +128,22 @@ bool CWallet::AddCScript(const CScript& redeemScript) return CWalletDB(strWalletFile).WriteCScript(Hash160(redeemScript), redeemScript); } +bool CWallet::LoadCScript(const CScript& redeemScript) +{ + /* A sanity check was added in pull #3843 to avoid adding redeemScripts + * that never can be redeemed. However, old wallets may still contain + * these. Do not add them to the wallet and warn. */ + if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE) + { + std::string strAddr = CBitcoinAddress(redeemScript.GetID()).ToString(); + LogPrintf("%s: Warning: This wallet contains a redeemScript of size %i which exceeds maximum size %i thus can never be redeemed. Do not use address %s.\n", + __func__, redeemScript.size(), MAX_SCRIPT_ELEMENT_SIZE, strAddr); + return true; + } + + return CCryptoKeyStore::AddCScript(redeemScript); +} + bool CWallet::Unlock(const SecureString& strWalletPassphrase) { CCrypter crypter; diff --git a/src/wallet.h b/src/wallet.h index 2d4b18dccd..095781e5df 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -211,7 +211,7 @@ public: // Adds an encrypted key to the store, without saving it to disk (used by LoadWallet) bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret); bool AddCScript(const CScript& redeemScript); - bool LoadCScript(const CScript& redeemScript) { return CCryptoKeyStore::AddCScript(redeemScript); } + bool LoadCScript(const CScript& redeemScript); /// Adds a destination data tuple to the store, and saves it to disk bool AddDestData(const CTxDestination &dest, const std::string &key, const std::string &value); |