Merge bitcoin/bitcoin#24678: Prevent wallet unload on GetWalletForJSONRPCRequest

f59959e381 wallet: Prevent wallet unload on GetWalletForJSONRPCRequest (João Barbosa)

Pull request description:

  Don't extend shared ownership of all wallets to `GetWalletForJSONRPCRequest` scope.

ACKs for top commit:
  achow101:
    ACK f59959e381
  shaavan:
    Code Review ACK f59959e381
  theStack:
    Concept and code-review ACK f59959e381

Tree-SHA512: 7c0294098b5c32acaab8cc6fcf17a581d580ad1a557ba0602a9506074ac035815739afb4a25b3e61be9132535c7fc3ec7ef5137c1dfc9d4078f13663d508ef55
This commit is contained in:
fanquake
2022-08-17 14:35:53 +01:00
3 changed files with 12 additions and 5 deletions

View File

@@ -64,12 +64,11 @@ std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& reques
return pwallet; return pwallet;
} }
std::vector<std::shared_ptr<CWallet>> wallets = GetWallets(context); size_t count{0};
if (wallets.size() == 1) { auto wallet = GetDefaultWallet(context, count);
return wallets[0]; if (wallet) return wallet;
}
if (wallets.empty()) { if (count == 0) {
throw JSONRPCError( throw JSONRPCError(
RPC_WALLET_NOT_FOUND, "No wallet is loaded. Load a wallet using loadwallet or create a new one with createwallet. (Note: A default wallet is no longer automatically created)"); RPC_WALLET_NOT_FOUND, "No wallet is loaded. Load a wallet using loadwallet or create a new one with createwallet. (Note: A default wallet is no longer automatically created)");
} }

View File

@@ -149,6 +149,13 @@ std::vector<std::shared_ptr<CWallet>> GetWallets(WalletContext& context)
return context.wallets; return context.wallets;
} }
std::shared_ptr<CWallet> GetDefaultWallet(WalletContext& context, size_t& count)
{
LOCK(context.wallets_mutex);
count = context.wallets.size();
return count == 1 ? context.wallets[0] : nullptr;
}
std::shared_ptr<CWallet> GetWallet(WalletContext& context, const std::string& name) std::shared_ptr<CWallet> GetWallet(WalletContext& context, const std::string& name)
{ {
LOCK(context.wallets_mutex); LOCK(context.wallets_mutex);

View File

@@ -64,6 +64,7 @@ bool AddWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet);
bool RemoveWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet, std::optional<bool> load_on_start, std::vector<bilingual_str>& warnings); bool RemoveWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet, std::optional<bool> load_on_start, std::vector<bilingual_str>& warnings);
bool RemoveWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet, std::optional<bool> load_on_start); bool RemoveWallet(WalletContext& context, const std::shared_ptr<CWallet>& wallet, std::optional<bool> load_on_start);
std::vector<std::shared_ptr<CWallet>> GetWallets(WalletContext& context); std::vector<std::shared_ptr<CWallet>> GetWallets(WalletContext& context);
std::shared_ptr<CWallet> GetDefaultWallet(WalletContext& context, size_t& count);
std::shared_ptr<CWallet> GetWallet(WalletContext& context, const std::string& name); std::shared_ptr<CWallet> GetWallet(WalletContext& context, const std::string& name);
std::shared_ptr<CWallet> LoadWallet(WalletContext& context, const std::string& name, std::optional<bool> load_on_start, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings); std::shared_ptr<CWallet> LoadWallet(WalletContext& context, const std::string& name, std::optional<bool> load_on_start, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings);
std::shared_ptr<CWallet> CreateWallet(WalletContext& context, const std::string& name, std::optional<bool> load_on_start, DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings); std::shared_ptr<CWallet> CreateWallet(WalletContext& context, const std::string& name, std::optional<bool> load_on_start, DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings);