diff options
author | João Barbosa <joao.paulo.barbosa@gmail.com> | 2018-10-10 00:32:27 +0100 |
---|---|---|
committer | João Barbosa <joao.paulo.barbosa@gmail.com> | 2018-10-18 23:33:36 +0100 |
commit | 321decffa1fbf213462d97e5372bd0c4eeb99635 (patch) | |
tree | ae345f8e0ef765aa3417acec9473215aacc2ffb6 /src | |
parent | 1d1417430c829a0c21bf5a2fe4a5b2f592a9423f (diff) | |
download | bitcoin-321decffa1fbf213462d97e5372bd0c4eeb99635.tar.xz |
rpc: Fix wallet unload during walletpassphrase timeout
Diffstat (limited to 'src')
-rw-r--r-- | src/wallet/rpcwallet.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 7d0219201e..37c8ce12b8 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -1928,13 +1928,6 @@ static UniValue keypoolrefill(const JSONRPCRequest& request) } -static void LockWallet(CWallet* pWallet) -{ - LOCK(pWallet->cs_wallet); - pWallet->nRelockTime = 0; - pWallet->Lock(); -} - static UniValue walletpassphrase(const JSONRPCRequest& request) { std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request); @@ -2004,7 +1997,18 @@ static UniValue walletpassphrase(const JSONRPCRequest& request) pwallet->TopUpKeyPool(); pwallet->nRelockTime = GetTime() + nSleepTime; - RPCRunLater(strprintf("lockwallet(%s)", pwallet->GetName()), std::bind(LockWallet, pwallet), nSleepTime); + + // Keep a weak pointer to the wallet so that it is possible to unload the + // wallet before the following callback is called. If a valid shared pointer + // is acquired in the callback then the wallet is still loaded. + std::weak_ptr<CWallet> weak_wallet = wallet; + RPCRunLater(strprintf("lockwallet(%s)", pwallet->GetName()), [weak_wallet] { + if (auto shared_wallet = weak_wallet.lock()) { + LOCK(shared_wallet->cs_wallet); + shared_wallet->Lock(); + shared_wallet->nRelockTime = 0; + } + }, nSleepTime); return NullUniValue; } |