diff options
author | Samuel Dobson <dobsonsa68@gmail.com> | 2019-09-09 23:33:33 +1200 |
---|---|---|
committer | Samuel Dobson <dobsonsa68@gmail.com> | 2019-09-09 23:34:05 +1200 |
commit | 8af835a72d15d19e98ce22d21903cc0d080d3b92 (patch) | |
tree | 34fe9a17a355bcd2aabd67dc17f0795ace0252e5 /test/functional | |
parent | 5b4e6886e0f5cde1ba357f4ffd8499e6cf70962c (diff) | |
parent | fa734603b78ba31ebf0da5d2dbe87386eafff01a (diff) |
Merge #16796: wallet: Fix segfault in CreateWalletFromFile
fa734603b78ba31ebf0da5d2dbe87386eafff01a wallet: Fix segmentation fault in CreateWalletFromFile (MarcoFalke)
fab3c34412379598b812631e3c123e9467cdc485 test: Print both messages on failure in assert_raises_message (MarcoFalke)
faa13539d5262bb7a512e9ff82e80083e04315ee wallet: Fix documentation around WalletParameterInteraction (MarcoFalke)
Pull request description:
Comes with a test to aid review. The test should fail without the fix to bitcoind
The following `CreateWalletFromFile` issues are fixed:
* `walletFile` refers to freed memory and will thus corrupt the debug.log and/or crash the node if read
* `WalletParameterInteraction` was moved to `CreateWalletFromFile` and `WalletInit::ParameterInteraction` without updating the documentation
ACKs for top commit:
promag:
ACK fa734603b78ba31ebf0da5d2dbe87386eafff01a.
darosior:
ACK fa734603b78ba31ebf0da5d2dbe87386eafff01a
meshcollider:
LGTM, code-read ACK fa734603b78ba31ebf0da5d2dbe87386eafff01a
Tree-SHA512: 2aceb63a3f25b90a840cfa08d37f5874aad4eb3df8c2ebf94e2ed18b55809b185e6920bdb345b988bff1fcea5e68a214fe06c361f7da2c01a3cc29e0cc421cb4
Diffstat (limited to 'test/functional')
-rw-r--r-- | test/functional/data/wallets/high_minversion/.walletlock | 0 | ||||
-rw-r--r-- | test/functional/data/wallets/high_minversion/db.log | 0 | ||||
-rw-r--r-- | test/functional/data/wallets/high_minversion/wallet.dat | bin | 0 -> 16384 bytes | |||
-rw-r--r-- | test/functional/test_framework/util.py | 8 | ||||
-rwxr-xr-x | test/functional/wallet_multiwallet.py | 25 |
5 files changed, 31 insertions, 2 deletions
diff --git a/test/functional/data/wallets/high_minversion/.walletlock b/test/functional/data/wallets/high_minversion/.walletlock new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/functional/data/wallets/high_minversion/.walletlock diff --git a/test/functional/data/wallets/high_minversion/db.log b/test/functional/data/wallets/high_minversion/db.log new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/functional/data/wallets/high_minversion/db.log diff --git a/test/functional/data/wallets/high_minversion/wallet.dat b/test/functional/data/wallets/high_minversion/wallet.dat Binary files differnew file mode 100644 index 0000000000..99ab809263 --- /dev/null +++ b/test/functional/data/wallets/high_minversion/wallet.dat diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py index 821e1cd3c5..6d74447ada 100644 --- a/test/functional/test_framework/util.py +++ b/test/functional/test_framework/util.py @@ -56,7 +56,9 @@ def assert_raises_message(exc, message, fun, *args, **kwds): raise AssertionError("Use assert_raises_rpc_error() to test RPC failures") except exc as e: if message is not None and message not in e.error['message']: - raise AssertionError("Expected substring not found:" + e.error['message']) + raise AssertionError( + "Expected substring not found in error message:\nsubstring: '{}'\nerror message: '{}'.".format( + message, e.error['message'])) except Exception as e: raise AssertionError("Unexpected exception raised: " + type(e).__name__) else: @@ -116,7 +118,9 @@ def try_rpc(code, message, fun, *args, **kwds): if (code is not None) and (code != e.error["code"]): raise AssertionError("Unexpected JSONRPC error code %i" % e.error["code"]) if (message is not None) and (message not in e.error['message']): - raise AssertionError("Expected substring not found:" + e.error['message']) + raise AssertionError( + "Expected substring not found in error message:\nsubstring: '{}'\nerror message: '{}'.".format( + message, e.error['message'])) return True except Exception as e: raise AssertionError("Unexpected exception raised: " + type(e).__name__) diff --git a/test/functional/wallet_multiwallet.py b/test/functional/wallet_multiwallet.py index 99d2c77587..68bc45f986 100755 --- a/test/functional/wallet_multiwallet.py +++ b/test/functional/wallet_multiwallet.py @@ -17,6 +17,8 @@ from test_framework.util import ( assert_raises_rpc_error, ) +FEATURE_LATEST = 169900 + class MultiWalletTest(BitcoinTestFramework): def set_test_params(self): @@ -27,6 +29,13 @@ class MultiWalletTest(BitcoinTestFramework): def skip_test_if_missing_module(self): self.skip_if_no_wallet() + def add_options(self, parser): + parser.add_argument( + '--data_wallets_dir', + default=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data/wallets/'), + help='Test data with wallet directories (default: %(default)s)', + ) + def run_test(self): node = self.nodes[0] @@ -323,6 +332,22 @@ class MultiWalletTest(BitcoinTestFramework): self.nodes[0].unloadwallet(wallet) self.nodes[1].loadwallet(wallet) + # Fail to load if wallet is downgraded + shutil.copytree(os.path.join(self.options.data_wallets_dir, 'high_minversion'), wallet_dir('high_minversion')) + self.restart_node(0, extra_args=['-upgradewallet={}'.format(FEATURE_LATEST)]) + assert {'name': 'high_minversion'} in self.nodes[0].listwalletdir()['wallets'] + self.log.info("Fail -upgradewallet that results in downgrade") + assert_raises_rpc_error( + -4, + "Wallet loading failed.", + lambda: self.nodes[0].loadwallet(filename='high_minversion'), + ) + self.stop_node( + i=0, + expected_stderr='Error: Error loading {}: Wallet requires newer version of Bitcoin Core'.format( + wallet_dir('high_minversion', 'wallet.dat')), + ) + if __name__ == '__main__': MultiWalletTest().main() |