perf(rpc): move the result subtree out of the parse tree
parseRpcResult copied the "result" node out of the parsed reply, because indexing the JSON object yields an lvalue reference. On large replies - full transaction lists, unspent-note sets - that duplicated the entire subtree for no reason, and it also meant a secret-bearing result then existed in two trees at once. - The result node is now moved out of the parse tree instead of copied, so the secret lives only in the returned value that the calling code already wipes. The leftover result slot is moved-from (null), so the existing secret-scrub of the discarded tree still runs harmlessly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -451,8 +451,8 @@ json RPCClient::parseRpcResult(long httpCode, const std::string& body, bool scru
|
||||
throw RpcError(errCode, "RPC error: " + err_msg, httpCode);
|
||||
}
|
||||
|
||||
json result = response["result"]; // a COPY of the subobject (operator[] yields an lvalue ref)
|
||||
if (scrubSource) scrubJsonSecrets(response); // zero the discarded tree's secret before it frees (B7)
|
||||
json result = std::move(response["result"]); // move the subtree out: the secret now lives only here
|
||||
if (scrubSource) scrubJsonSecrets(response); // response["result"] is now moved-from (null); harmless (B7)
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user