From 7414733beac92ce8ba365def592d0363fb24872c Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Sun, 10 Jul 2011 16:07:22 +0200 Subject: [PATCH] Make an invalid addrIncoming so that old clients crash. This prevents old clients from opening, and thus corrupting or otherwise causing harm to encrypted wallets. --- src/db.cpp | 2 -- src/main.cpp | 1 - src/main.h | 1 - src/wallet.cpp | 15 +++++++++++++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index e639a347..ebe7e3a8 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -828,7 +828,6 @@ bool CWalletDB::LoadWallet(CWallet* pwallet) if (strKey == "fGenerateBitcoins") ssValue >> fGenerateBitcoins; #endif if (strKey == "nTransactionFee") ssValue >> nTransactionFee; - if (strKey == "addrIncoming") ssValue >> addrIncoming; if (strKey == "fLimitProcessors") ssValue >> fLimitProcessors; if (strKey == "nLimitProcessors") ssValue >> nLimitProcessors; if (strKey == "fMinimizeToTray") ssValue >> fMinimizeToTray; @@ -847,7 +846,6 @@ bool CWalletDB::LoadWallet(CWallet* pwallet) printf("nFileVersion = %d\n", nFileVersion); printf("fGenerateBitcoins = %d\n", fGenerateBitcoins); printf("nTransactionFee = %"PRI64d"\n", nTransactionFee); - printf("addrIncoming = %s\n", addrIncoming.ToString().c_str()); printf("fMinimizeToTray = %d\n", fMinimizeToTray); printf("fMinimizeOnClose = %d\n", fMinimizeOnClose); printf("fUseProxy = %d\n", fUseProxy); diff --git a/src/main.cpp b/src/main.cpp index 53cdab17..6e973493 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,7 +55,6 @@ int64 nHPSTimerStart; // Settings int fGenerateBitcoins = false; int64 nTransactionFee = 0; -CAddress addrIncoming; int fLimitProcessors = false; int nLimitProcessors = 1; int fMinimizeToTray = true; diff --git a/src/main.h b/src/main.h index aa74ac5a..0757ef50 100644 --- a/src/main.h +++ b/src/main.h @@ -68,7 +68,6 @@ extern std::set setpwalletRegistered; // Settings extern int fGenerateBitcoins; extern int64 nTransactionFee; -extern CAddress addrIncoming; extern int fLimitProcessors; extern int nLimitProcessors; extern int fMinimizeToTray; diff --git a/src/wallet.cpp b/src/wallet.cpp index 9f3701a8..93313e7b 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -108,6 +108,19 @@ bool CWallet::ChangeWalletPassphrase(const string& strOldWalletPassphrase, const return false; } + +// This class implements an addrIncoming entry that causes pre-0.4 +// clients to crash on startup if reading a private-key-encrypted wallet. +class CCorruptAddress +{ +public: + IMPLEMENT_SERIALIZE + ( + if (nType & SER_DISK) + READWRITE(nVersion); + ) +}; + bool CWallet::EncryptWallet(const string& strWalletPassphrase) { CRITICAL_BLOCK(cs_mapPubKeys) @@ -166,6 +179,8 @@ bool CWallet::EncryptWallet(const string& strWalletPassphrase) if (fFileBacked) { + CCorruptAddress corruptAddress; + pwalletdbEncryption->WriteSetting("addrIncoming", corruptAddress); if (!pwalletdbEncryption->TxnCommit()) exit(1); //We now have keys encrypted in memory, but no on disk...die to avoid confusion and let the user reload their unencrypted wallet.