mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-23 14:10:15 +01:00
Remove pointer cast in CRPCTable::dumpArgMap
CRPCTable::dumpArgMap currently works by casting RPC command unique_id integer field to a function pointer, and then calling the function. The unique_id field wasn't supposed to be used this way (it's meant to be used to detect RPC aliases), and this code segfaults in the rpc_help.py test in multiprocess PR https://github.com/bitcoin/bitcoin/pull/10102 because wallet RPC functions aren't directly accessible from the node process. Fix this by adding a new GET_ARGS request mode to retrieve argument information similar to the way the GET_HELP mode retrieves help information.
This commit is contained in:
@@ -149,7 +149,7 @@ static RPCHelpMan help()
|
||||
}
|
||||
if (strCommand == "dump_all_command_conversions") {
|
||||
// Used for testing only, undocumented
|
||||
return tableRPC.dumpArgMap();
|
||||
return tableRPC.dumpArgMap(jsonRequest);
|
||||
}
|
||||
|
||||
return tableRPC.help(strCommand, jsonRequest);
|
||||
@@ -492,13 +492,18 @@ std::vector<std::string> CRPCTable::listCommands() const
|
||||
return commandList;
|
||||
}
|
||||
|
||||
UniValue CRPCTable::dumpArgMap() const
|
||||
UniValue CRPCTable::dumpArgMap(const JSONRPCRequest& args_request) const
|
||||
{
|
||||
JSONRPCRequest request(args_request);
|
||||
request.mode = JSONRPCRequest::GET_ARGS;
|
||||
|
||||
UniValue ret{UniValue::VARR};
|
||||
for (const auto& cmd : mapCommands) {
|
||||
for (const auto& c : cmd.second) {
|
||||
const auto help = RpcMethodFnType(c->unique_id)();
|
||||
help.AppendArgMap(ret);
|
||||
UniValue result;
|
||||
if (ExecuteCommands(cmd.second, request, result)) {
|
||||
for (const auto& values : result.getValues()) {
|
||||
ret.push_back(values);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user