[wallet] Fix potential memory leak in CreateWalletFromFile
Fix proposed by ryanofsky in https://github.com/bitcoin/bitcoin/pull/12647#discussion_r174875670
This commit is contained in:
parent
13da2899ae
commit
59b87a27ef
1 changed files with 8 additions and 2 deletions
|
@ -4012,7 +4012,10 @@ CWallet* CWallet::CreateWalletFromFile(const std::string& name, const fs::path&
|
||||||
|
|
||||||
int64_t nStart = GetTimeMillis();
|
int64_t nStart = GetTimeMillis();
|
||||||
bool fFirstRun = true;
|
bool fFirstRun = true;
|
||||||
CWallet *walletInstance = new CWallet(name, WalletDatabase::Create(path));
|
// Make a temporary wallet unique pointer so memory doesn't get leaked if
|
||||||
|
// wallet creation fails.
|
||||||
|
auto temp_wallet = MakeUnique<CWallet>(name, WalletDatabase::Create(path));
|
||||||
|
CWallet* walletInstance = temp_wallet.get();
|
||||||
DBErrors nLoadWalletRet = walletInstance->LoadWallet(fFirstRun);
|
DBErrors nLoadWalletRet = walletInstance->LoadWallet(fFirstRun);
|
||||||
if (nLoadWalletRet != DBErrors::LOAD_OK)
|
if (nLoadWalletRet != DBErrors::LOAD_OK)
|
||||||
{
|
{
|
||||||
|
@ -4224,7 +4227,6 @@ CWallet* CWallet::CreateWalletFromFile(const std::string& name, const fs::path&
|
||||||
}
|
}
|
||||||
|
|
||||||
walletInstance->m_last_block_processed = chainActive.Tip();
|
walletInstance->m_last_block_processed = chainActive.Tip();
|
||||||
RegisterValidationInterface(walletInstance);
|
|
||||||
|
|
||||||
if (chainActive.Tip() && chainActive.Tip() != pindexRescan)
|
if (chainActive.Tip() && chainActive.Tip() != pindexRescan)
|
||||||
{
|
{
|
||||||
|
@ -4290,6 +4292,10 @@ CWallet* CWallet::CreateWalletFromFile(const std::string& name, const fs::path&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Register with the validation interface. It's ok to do this after rescan since we're still holding cs_main.
|
||||||
|
RegisterValidationInterface(temp_wallet.release());
|
||||||
|
|
||||||
walletInstance->SetBroadcastTransactions(gArgs.GetBoolArg("-walletbroadcast", DEFAULT_WALLETBROADCAST));
|
walletInstance->SetBroadcastTransactions(gArgs.GetBoolArg("-walletbroadcast", DEFAULT_WALLETBROADCAST));
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue