aboutsummaryrefslogtreecommitdiff
path: root/src/rpc
diff options
context:
space:
mode:
authorRussell Yanofsky <russ@yanofsky.org>2021-01-29 18:15:48 -0500
committerRussell Yanofsky <russ@yanofsky.org>2021-01-29 18:15:48 -0500
commit9048c58e10841d9e1d709c0a325dd14684cec325 (patch)
treeaa399e99d405412a1205c6eec856d5a886b21dc7 /src/rpc
parent14f3d9b908ed9e78997bfaad3d8a06357a89d46e (diff)
downloadbitcoin-9048c58e10841d9e1d709c0a325dd14684cec325.tar.xz
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.
Diffstat (limited to 'src/rpc')
-rw-r--r--src/rpc/request.h2
-rw-r--r--src/rpc/server.cpp15
-rw-r--r--src/rpc/server.h2
-rw-r--r--src/rpc/util.cpp7
-rw-r--r--src/rpc/util.h4
5 files changed, 20 insertions, 10 deletions
diff --git a/src/rpc/request.h b/src/rpc/request.h
index 1751c24cd3..27d06f3c92 100644
--- a/src/rpc/request.h
+++ b/src/rpc/request.h
@@ -34,7 +34,7 @@ public:
UniValue id;
std::string strMethod;
UniValue params;
- enum Mode { EXECUTE, GET_HELP } mode = EXECUTE;
+ enum Mode { EXECUTE, GET_HELP, GET_ARGS } mode = EXECUTE;
std::string URI;
std::string authUser;
std::string peerAddr;
diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
index 66134a77b2..39938f4eb9 100644
--- a/src/rpc/server.cpp
+++ b/src/rpc/server.cpp
@@ -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;
diff --git a/src/rpc/server.h b/src/rpc/server.h
index fe5a791e1e..03967020c2 100644
--- a/src/rpc/server.h
+++ b/src/rpc/server.h
@@ -148,7 +148,7 @@ public:
/**
* Return all named arguments that need to be converted by the client from string to another JSON type
*/
- UniValue dumpArgMap() const;
+ UniValue dumpArgMap(const JSONRPCRequest& request) const;
/**
* Appends a CRPCCommand to the dispatch table.
diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp
index dc57d2be07..c7472fc5c1 100644
--- a/src/rpc/util.cpp
+++ b/src/rpc/util.cpp
@@ -478,6 +478,9 @@ std::string RPCExamples::ToDescriptionString() const
UniValue RPCHelpMan::HandleRequest(const JSONRPCRequest& request)
{
+ if (request.mode == JSONRPCRequest::GET_ARGS) {
+ return GetArgMap();
+ }
/*
* Check if the given request is valid according to this command or if
* the user is asking for help information, and throw help when appropriate.
@@ -561,8 +564,9 @@ std::string RPCHelpMan::ToString() const
return ret;
}
-void RPCHelpMan::AppendArgMap(UniValue& arr) const
+UniValue RPCHelpMan::GetArgMap() const
{
+ UniValue arr{UniValue::VARR};
for (int i{0}; i < int(m_args.size()); ++i) {
const auto& arg = m_args.at(i);
std::vector<std::string> arg_names;
@@ -577,6 +581,7 @@ void RPCHelpMan::AppendArgMap(UniValue& arr) const
arr.push_back(map);
}
}
+ return arr;
}
std::string RPCArg::GetFirstName() const
diff --git a/src/rpc/util.h b/src/rpc/util.h
index aaca887900..90521949a6 100644
--- a/src/rpc/util.h
+++ b/src/rpc/util.h
@@ -337,8 +337,8 @@ public:
UniValue HandleRequest(const JSONRPCRequest& request);
std::string ToString() const;
- /** Append the named args that need to be converted from string to another JSON type */
- void AppendArgMap(UniValue& arr) const;
+ /** Return the named args that need to be converted from string to another JSON type */
+ UniValue GetArgMap() const;
/** If the supplied number of args is neither too small nor too high */
bool IsValidNumArgs(size_t num_args) const;
std::vector<std::string> GetArgNames() const;