diff --git a/common/test/run-ip_port_parsing.c b/common/test/run-ip_port_parsing.c index 13d34952c50b..a35fdfa749e1 100644 --- a/common/test/run-ip_port_parsing.c +++ b/common/test/run-ip_port_parsing.c @@ -150,7 +150,18 @@ int main(int argc, char *argv[]) assert(!separate_address_and_port(tmpctx, "[::1]:8f", &ip, &port)); assert(!separate_address_and_port(tmpctx, "127.0.0.1:8f", &ip, &port)); assert(!separate_address_and_port(tmpctx, "127.0.0.1:0", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "127.0.0.1:65536", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "127.0.0.1:65537", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "127.0.0.1:75271", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "127.0.0.1:99999", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "127.0.0.1:18446744073709551616", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "127.0.0.1:-1", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "127.0.0.1:+9735", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "127.0.0.1: 9735", &ip, &port)); assert(!separate_address_and_port(tmpctx, "127.0.0.1:ff", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "[::1]:65536", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "[::1]:65537", &ip, &port)); + assert(!separate_address_and_port(tmpctx, "[::1]:-1", &ip, &port)); /* ret = getaddrinfo("[::1]:80", NULL, NULL, &res); */ assert(separate_address_and_port(tmpctx, "[::1]:80", &ip, &port)); @@ -170,6 +181,10 @@ int main(int argc, char *argv[]) assert(streq(ip, "192.168.1.1")); assert(port == 8000); + assert(separate_address_and_port(tmpctx, "127.0.0.1:65535", &ip, &port)); + assert(streq(ip, "127.0.0.1")); + assert(port == 65535); + port = 0; assert(separate_address_and_port(tmpctx, "192.168.2.255", &ip, &port)); assert(streq(ip, "192.168.2.255")); diff --git a/common/wireaddr.c b/common/wireaddr.c index 1364e4931383..ba7d5a2b4e15 100644 --- a/common/wireaddr.c +++ b/common/wireaddr.c @@ -344,9 +344,13 @@ bool separate_address_and_port(const tal_t *ctx, const char *arg, } if (portcolon) { - char *endp; - *port = strtol(portcolon + 1, &endp, 10); - return *port != 0 && *endp == '\0'; + u64 p; + if (!str_to_u64(portcolon + 1, strlen(portcolon + 1), &p)) + return false; + if (p == 0 || p > 65535) + return false; + *port = p; + return true; } return true;