diff options
author | MacroFake <falke.marco@gmail.com> | 2022-05-11 16:32:42 +0200 |
---|---|---|
committer | MacroFake <falke.marco@gmail.com> | 2022-05-11 16:32:45 +0200 |
commit | 27d7b11e8ce25ebc79be5284d85cede263fa1362 (patch) | |
tree | 87785823ac5b38259936ba1e07986d3f44e826a5 | |
parent | b8ded26ef3d7c58a938050659e4c50d850628dff (diff) | |
parent | 9feb887082be911a8342f8090af4dca3db76db9b (diff) |
Merge bitcoin/bitcoin#25106: rpc: dumptxoutset: check `fopen` return code
9feb887082be911a8342f8090af4dca3db76db9b rpc: check `fopen` return code in dumptxoutset (Sebastian Falbesoner)
Pull request description:
This change improves the usability of the `dumptxoutset` RPC in two ways, in the case that an invalid path is passed:
1. return from the RPC immediately, rather then when the file is first tried to be written (which is _after_ calculating the UTXO set hash)
2. return a proper return code and error message instead of the cryptic message that appears on master currently (see below)
master branch:
(error message appears after several minutes on my machine)
```
$ ./src/bitcoin-cli dumptxoutset /invalid/path
error code: -1
error message:
CAutoFile::operator<<: file handle is nullptr: unspecified iostream_category error
```
PR branch:
(error message appears immediately)
```
$ ./src/bitcoin-cli dumptxoutset /invalid/path
error code: -8
error message:
Couldn't open file /invalid/path.incomplete for writing.
```
ACKs for top commit:
w0xlt:
Code Review ACK https://github.com/bitcoin/bitcoin/pull/25106/commits/9feb887082be911a8342f8090af4dca3db76db9b
Tree-SHA512: e8695a7e86f26cc3b086d6bc6888388061f1dee439f76409b3ee11d35032bfd9cfa5349b728cd7f45bcffd999ecf9a6a991be172ce587b9b14503d9916b6e984
-rw-r--r-- | src/rpc/blockchain.cpp | 6 | ||||
-rwxr-xr-x | test/functional/rpc_dumptxoutset.py | 6 |
2 files changed, 11 insertions, 1 deletions
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 57b5178d78..50bf764e53 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -2281,6 +2281,12 @@ static RPCHelpMan dumptxoutset() FILE* file{fsbridge::fopen(temppath, "wb")}; CAutoFile afile{file, SER_DISK, CLIENT_VERSION}; + if (afile.IsNull()) { + throw JSONRPCError( + RPC_INVALID_PARAMETER, + "Couldn't open file " + temppath.u8string() + " for writing."); + } + NodeContext& node = EnsureAnyNodeContext(request.context); UniValue result = CreateUTXOSnapshot( node, node.chainman->ActiveChainstate(), afile, path, temppath); diff --git a/test/functional/rpc_dumptxoutset.py b/test/functional/rpc_dumptxoutset.py index 4ca84748b2..672c9a53dc 100755 --- a/test/functional/rpc_dumptxoutset.py +++ b/test/functional/rpc_dumptxoutset.py @@ -49,9 +49,13 @@ class DumptxoutsetTest(BitcoinTestFramework): out['txoutset_hash'], '1f7e3befd45dc13ae198dfbb22869a9c5c4196f8e9ef9735831af1288033f890') assert_equal(out['nchaintx'], 101) - # Specifying a path to an existing file will fail. + # Specifying a path to an existing or invalid file will fail. assert_raises_rpc_error( -8, '{} already exists'.format(FILENAME), node.dumptxoutset, FILENAME) + invalid_path = str(Path(node.datadir) / "invalid" / "path") + assert_raises_rpc_error( + -8, "Couldn't open file {}.incomplete for writing".format(invalid_path), node.dumptxoutset, invalid_path) + if __name__ == '__main__': DumptxoutsetTest().main() |