diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index ba74283d237..3a0432d7a9e 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -1004,26 +1004,28 @@ static RPCHelpMan addpeeraddress() UniValue obj(UniValue::VOBJ); std::optional net_addr{LookupHost(addr_string, false)}; + if (!net_addr.has_value()) { + throw JSONRPCError(RPC_CLIENT_INVALID_IP_OR_SUBNET, "Invalid IP address"); + } + bool success{false}; - if (net_addr.has_value()) { - CService service{net_addr.value(), port}; - CAddress address{MaybeFlipIPv6toCJDNS(service), ServiceFlags{NODE_NETWORK | NODE_WITNESS}}; - address.nTime = Now(); - // The source address is set equal to the address. This is equivalent to the peer - // announcing itself. - if (addrman.Add({address}, address)) { - success = true; - if (tried) { - // Attempt to move the address to the tried addresses table. - if (!addrman.Good(address)) { - success = false; - obj.pushKV("error", "failed-adding-to-tried"); - } + CService service{net_addr.value(), port}; + CAddress address{MaybeFlipIPv6toCJDNS(service), ServiceFlags{NODE_NETWORK | NODE_WITNESS}}; + address.nTime = Now(); + // The source address is set equal to the address. This is equivalent to the peer + // announcing itself. + if (addrman.Add({address}, address)) { + success = true; + if (tried) { + // Attempt to move the address to the tried addresses table. + if (!addrman.Good(address)) { + success = false; + obj.pushKV("error", "failed-adding-to-tried"); } - } else { - obj.pushKV("error", "failed-adding-to-new"); } + } else { + obj.pushKV("error", "failed-adding-to-new"); } obj.pushKV("success", success); diff --git a/test/functional/rpc_net.py b/test/functional/rpc_net.py index aeaf20c23d5..77d036c2386 100755 --- a/test/functional/rpc_net.py +++ b/test/functional/rpc_net.py @@ -346,9 +346,12 @@ class NetTest(BitcoinTestFramework): assert "unknown command: addpeeraddress" not in node.help("addpeeraddress") self.log.debug("Test that adding an empty address fails") - assert_equal(node.addpeeraddress(address="", port=8333), {"success": False}) + assert_raises_rpc_error(-30, "Invalid IP address", node.addpeeraddress, address="", port=8333) assert_equal(node.getnodeaddresses(count=0), []) + self.log.debug("Test that adding a non-IP/hostname fails (no DNS lookup allowed)") + assert_raises_rpc_error(-30, "Invalid IP address", node.addpeeraddress, address="not_an_ip", port=8333) + self.log.debug("Test that non-bool tried fails") assert_raises_rpc_error(-3, "JSON value of type string is not of expected type bool", self.nodes[0].addpeeraddress, address="1.2.3.4", tried="True", port=1234)