Browse Source

Fix uninitialized URI in batch RPC requests

This fixes "Wallet file not specified" errors when making batch wallet RPC
calls with more than one wallet loaded. This issue was reported by
NicolasDorier <nicolas.dorier@gmail.com>
https://github.com/bitcoin/bitcoin/issues/11257

Request URI is not used for anything except multiwallet request dispatching, so
this change has no other effects.

Fixes #11257
0.16
Russell Yanofsky 7 years ago
parent
commit
edafc718ad
  1. 2
      src/httprpc.cpp
  2. 7
      src/rpc/server.cpp
  3. 2
      src/rpc/server.h

2
src/httprpc.cpp

@ -192,7 +192,7 @@ static bool HTTPReq_JSONRPC(HTTPRequest* req, const std::string &)
// array of requests // array of requests
} else if (valRequest.isArray()) } else if (valRequest.isArray())
strReply = JSONRPCExecBatch(valRequest.get_array()); strReply = JSONRPCExecBatch(jreq, valRequest.get_array());
else else
throw JSONRPCError(RPC_PARSE_ERROR, "Top-level object parse error"); throw JSONRPCError(RPC_PARSE_ERROR, "Top-level object parse error");

7
src/rpc/server.cpp

@ -389,11 +389,10 @@ bool IsDeprecatedRPCEnabled(const std::string& method)
return find(enabled_methods.begin(), enabled_methods.end(), method) != enabled_methods.end(); return find(enabled_methods.begin(), enabled_methods.end(), method) != enabled_methods.end();
} }
static UniValue JSONRPCExecOne(const UniValue& req) static UniValue JSONRPCExecOne(JSONRPCRequest jreq, const UniValue& req)
{ {
UniValue rpc_result(UniValue::VOBJ); UniValue rpc_result(UniValue::VOBJ);
JSONRPCRequest jreq;
try { try {
jreq.parse(req); jreq.parse(req);
@ -413,11 +412,11 @@ static UniValue JSONRPCExecOne(const UniValue& req)
return rpc_result; return rpc_result;
} }
std::string JSONRPCExecBatch(const UniValue& vReq) std::string JSONRPCExecBatch(const JSONRPCRequest& jreq, const UniValue& vReq)
{ {
UniValue ret(UniValue::VARR); UniValue ret(UniValue::VARR);
for (unsigned int reqIdx = 0; reqIdx < vReq.size(); reqIdx++) for (unsigned int reqIdx = 0; reqIdx < vReq.size(); reqIdx++)
ret.push_back(JSONRPCExecOne(vReq[reqIdx])); ret.push_back(JSONRPCExecOne(jreq, vReq[reqIdx]));
return ret.write() + "\n"; return ret.write() + "\n";
} }

2
src/rpc/server.h

@ -191,7 +191,7 @@ extern std::string HelpExampleRpc(const std::string& methodname, const std::stri
bool StartRPC(); bool StartRPC();
void InterruptRPC(); void InterruptRPC();
void StopRPC(); void StopRPC();
std::string JSONRPCExecBatch(const UniValue& vReq); std::string JSONRPCExecBatch(const JSONRPCRequest& jreq, const UniValue& vReq);
// Retrieves any serialization flags requested in command line argument // Retrieves any serialization flags requested in command line argument
int RPCSerializationFlags(); int RPCSerializationFlags();

Loading…
Cancel
Save