message: rpc: Fix wallet unload during walletpassphrase timeout
diff: @@ -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;
  }
  