diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3128,24 +3128,10 @@ WalletContext &context = EnsureWalletContext(request.context); const std::string name(request.params[0].get_str()); - fs::path path(fs::absolute(name, GetWalletDir())); - - if (fs::symlink_status(path).type() == fs::file_not_found) { - throw JSONRPCError(RPC_WALLET_NOT_FOUND, - "Wallet " + name + " not found."); - } else if (fs::is_directory(path)) { - // The given filename is a directory. Check that there's a wallet.dat - // file. - fs::path wallet_dat_file = path / "wallet.dat"; - if (fs::symlink_status(wallet_dat_file).type() == fs::file_not_found) { - throw JSONRPCError(RPC_WALLET_NOT_FOUND, - "Directory " + name + - " does not contain a wallet.dat file."); - } - } DatabaseOptions options; DatabaseStatus status; + options.require_existing = true; bilingual_str error; std::vector warnings; std::optional load_on_start = @@ -3155,7 +3141,13 @@ std::shared_ptr const wallet = LoadWallet( *context.chain, name, load_on_start, options, status, error, warnings); if (!wallet) { - throw JSONRPCError(RPC_WALLET_ERROR, error.original); + // Map bad format to not found, since bad format is returned when the + // wallet directory exists, but doesn't contain a data file. + RPCErrorCode code = status == DatabaseStatus::FAILED_NOT_FOUND || + status == DatabaseStatus::FAILED_BAD_FORMAT + ? RPC_WALLET_NOT_FOUND + : RPC_WALLET_ERROR; + throw JSONRPCError(code, error.original); } UniValue obj(UniValue::VOBJ); diff --git a/test/functional/rpc_createmultisig.py b/test/functional/rpc_createmultisig.py --- a/test/functional/rpc_createmultisig.py +++ b/test/functional/rpc_createmultisig.py @@ -133,8 +133,12 @@ try: node1.loadwallet('wmulti') except JSONRPCException as e: - if e.error['code'] == -18 and \ - 'Wallet wmulti not found' in e.error['message']: + path = os.path.join(self.options.tmpdir, "node1", "regtest", + "wallets", "wmulti") + if e.error['code'] == -18 and ( + "Wallet file verification failed. Failed to load " + "database path '{}'. Path does not exist.".format(path) + in e.error['message']): node1.createwallet(wallet_name='wmulti', disable_private_keys=True) else: diff --git a/test/functional/wallet_multiwallet.py b/test/functional/wallet_multiwallet.py --- a/test/functional/wallet_multiwallet.py +++ b/test/functional/wallet_multiwallet.py @@ -278,8 +278,13 @@ assert_equal(set(self.nodes[0].listwallets()), set(wallet_names)) # Fail to load if wallet doesn't exist - assert_raises_rpc_error(-18, 'Wallet wallets not found.', - self.nodes[0].loadwallet, 'wallets') + path = os.path.join(self.options.tmpdir, "node0", "regtest", + "wallets", "wallets") + assert_raises_rpc_error( + -18, + "Wallet file verification failed. Failed to load database path " + "'{}'. Path does not exist.".format(path), + self.nodes[0].loadwallet, 'wallets') # Fail to load duplicate wallets path = os.path.join( @@ -332,8 +337,13 @@ # Fail to load if a directory is specified that doesn't contain a # wallet os.mkdir(wallet_dir('empty_wallet_dir')) - assert_raises_rpc_error(-18, "Directory empty_wallet_dir does not contain a wallet.dat file", - self.nodes[0].loadwallet, 'empty_wallet_dir') + path = os.path.join(self.options.tmpdir, "node0", "regtest", + "wallets", "empty_wallet_dir") + assert_raises_rpc_error( + -18, + "Wallet file verification failed. Failed to load database " + "path '{}'. Data is not in recognized format.".format(path), + self.nodes[0].loadwallet, 'empty_wallet_dir') self.log.info("Test dynamic wallet creation.")