diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2015-11-09 08:40:46 +0100 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2015-11-09 08:44:19 +0100 |
commit | 2980a18572dbe6173c41afc037b0cefe367d935c (patch) | |
tree | 84c50cb7b8447730453204ff1739651542b1e9e3 | |
parent | 4ee149a6db25cde31432f83369b40c92be13021c (diff) |
Fix crash in validateaddress with -disablewallet
Fix a null pointer dereference in validateaddress with -disablewallet. Also add a regression testcase.
-rwxr-xr-x | qa/pull-tester/rpc-tests.py | 1 | ||||
-rwxr-xr-x | qa/rpc-tests/disablewallet.py | 32 | ||||
-rw-r--r-- | src/rpcmisc.cpp | 4 |
3 files changed, 35 insertions, 2 deletions
diff --git a/qa/pull-tester/rpc-tests.py b/qa/pull-tester/rpc-tests.py index 3059fee426..c23dcbdb7c 100755 --- a/qa/pull-tester/rpc-tests.py +++ b/qa/pull-tester/rpc-tests.py @@ -68,6 +68,7 @@ testScripts = [ 'decodescript.py', 'p2p-fullblocktest.py', 'blockchain.py', + 'disablewallet.py', ] testScriptsExt = [ 'bip65-cltv.py', diff --git a/qa/rpc-tests/disablewallet.py b/qa/rpc-tests/disablewallet.py new file mode 100755 index 0000000000..4cb01575e2 --- /dev/null +++ b/qa/rpc-tests/disablewallet.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python2 +# Copyright (c) 2014 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Exercise API with -disablewallet. +# + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import * + +class DisableWalletTest (BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 1) + + def setup_network(self, split=False): + self.nodes = start_nodes(1, self.options.tmpdir, [['-disablewallet']]) + self.is_network_split = False + self.sync_all() + + def run_test (self): + # Check regression: https://github.com/bitcoin/bitcoin/issues/6963#issuecomment-154548880 + x = self.nodes[0].validateaddress('3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy') + assert(x['isvalid'] == False) + x = self.nodes[0].validateaddress('mneYUmWYsuk7kySiURxCi3AGxrAqZxLgPZ') + assert(x['isvalid'] == True) + +if __name__ == '__main__': + DisableWalletTest ().main () diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 0f0457c5cf..0c656d5cf1 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -117,7 +117,7 @@ public: UniValue obj(UniValue::VOBJ); CPubKey vchPubKey; obj.push_back(Pair("isscript", false)); - if (pwalletMain->GetPubKey(keyID, vchPubKey)) { + if (pwalletMain && pwalletMain->GetPubKey(keyID, vchPubKey)) { obj.push_back(Pair("pubkey", HexStr(vchPubKey))); obj.push_back(Pair("iscompressed", vchPubKey.IsCompressed())); } @@ -128,7 +128,7 @@ public: UniValue obj(UniValue::VOBJ); CScript subscript; obj.push_back(Pair("isscript", true)); - if (pwalletMain->GetCScript(scriptID, subscript)) { + if (pwalletMain && pwalletMain->GetCScript(scriptID, subscript)) { std::vector<CTxDestination> addresses; txnouttype whichType; int nRequired; |