Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13711381
D988.id2648.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Subscribers
None
D988.id2648.diff
View Options
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -522,13 +522,36 @@
uiInterface.InitMessage(_("Verifying wallet(s)..."));
+ // Keep track of each wallet absolute path to detect duplicates.
+ std::set<fs::path> wallet_paths;
+
for (const std::string &walletFile : gArgs.GetArgs("-wallet")) {
- if (fs::path(walletFile).filename() != walletFile) {
- return InitError(_(
- "-wallet parameter must only specify a filename (not a path)"));
- } else if (SanitizeString(walletFile, SAFE_CHARS_FILENAME) !=
- walletFile) {
- return InitError(_("Invalid characters in -wallet filename"));
+ if (boost::filesystem::path(walletFile).filename() != walletFile) {
+ return InitError(
+ strprintf(_("Error loading wallet %s. -wallet parameter must "
+ "only specify a filename (not a path)."),
+ walletFile));
+ }
+
+ if (SanitizeString(walletFile, SAFE_CHARS_FILENAME) != walletFile) {
+ return InitError(strprintf(_("Error loading wallet %s. Invalid "
+ "characters in -wallet filename."),
+ walletFile));
+ }
+
+ fs::path wallet_path = fs::absolute(walletFile, GetDataDir());
+
+ if (fs::exists(wallet_path) && (!fs::is_regular_file(wallet_path) ||
+ fs::is_symlink(wallet_path))) {
+ return InitError(strprintf(_("Error loading wallet %s. -wallet "
+ "filename must be a regular file."),
+ walletFile));
+ }
+
+ if (!wallet_paths.insert(wallet_path).second) {
+ return InitError(strprintf(_("Error loading wallet %s. Duplicate "
+ "-wallet filename specified."),
+ walletFile));
}
std::string strError;
diff --git a/test/functional/multiwallet.py b/test/functional/multiwallet.py
--- a/test/functional/multiwallet.py
+++ b/test/functional/multiwallet.py
@@ -2,7 +2,12 @@
# Copyright (c) 2017 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-"""Test multiwallet."""
+"""Test multiwallet.
+
+Verify that a bitcoind node can load multiple wallet files
+"""
+import os
+
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import *
@@ -16,6 +21,26 @@
self.extra_args = [['-wallet=w1', '-wallet=w2', '-wallet=w3']]
def run_test(self):
+ self.stop_node(0)
+
+ # should not initialize if there are duplicate wallets
+ assert_start_raises_init_error(0, self.options.tmpdir, [
+ '-wallet=w1', '-wallet=w1'], 'Error loading wallet w1. Duplicate -wallet filename specified.')
+
+ # should not initialize if wallet file is a directory
+ os.mkdir(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w11'))
+ assert_start_raises_init_error(0, self.options.tmpdir, [
+ '-wallet=w11'], 'Error loading wallet w11. -wallet filename must be a regular file.')
+
+ # should not initialize if wallet file is a symlink
+ os.symlink(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w1'),
+ os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w12'))
+ assert_start_raises_init_error(0, self.options.tmpdir, [
+ '-wallet=w12'], 'Error loading wallet w12. -wallet filename must be a regular file.')
+
+ self.nodes[0] = self.start_node(
+ 0, self.options.tmpdir, self.extra_args[0])
+
w1 = self.nodes[0] / "wallet/w1"
w1.generate(1)
diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py
--- a/test/functional/test_framework/test_framework.py
+++ b/test/functional/test_framework/test_framework.py
@@ -36,6 +36,7 @@
set_node_times,
start_node,
start_nodes,
+ start_node,
stop_node,
stop_nodes,
sync_blocks,
@@ -44,6 +45,7 @@
)
from .authproxy import JSONRPCException
+
class TestStatus(Enum):
PASSED = 1
FAILED = 2
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Apr 26, 11:49 (6 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5573452
Default Alt Text
D988.id2648.diff (4 KB)
Attached To
D988: [backport] Reject invalid wallets
Event Timeline
Log In to Comment