From 04aba8f7677eb3837e647ee0d20d997d112dd151 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 30 Sep 2024 02:25:39 -0300 Subject: [PATCH] net: fix split_address (fix #14909) (#22349) --- vlib/net/util.v | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/vlib/net/util.v b/vlib/net/util.v index 0f36b2fb51729d..e4bdfd6adb398a 100644 --- a/vlib/net/util.v +++ b/vlib/net/util.v @@ -15,17 +15,30 @@ pub fn validate_port(port int) !u16 { // split_address splits an address into its host name and its port pub fn split_address(addr string) !(string, u16) { - port := addr.all_after_last(':').int() - mut address := addr.all_before_last(':') - - // TODO(emily): Maybe do some more checking here - // to validate ipv6 address sanity? - - // RFC4038 - allow [::1]:port - if address.len > 0 && address[0] == `[` && address[address.len - 1] == `]` { - address = address[1..address.len - 1] + if _ := addr.index(']') { + // ipv6 brackets + address := addr.all_after('[').all_before_last(']') + port := addr.all_after_last(']:').int() + p := validate_port(port)! + return address, p + } else if _ := addr.index('::') { + // ipv6 host only ::1 + if addr.all_before_last('::') == '' { + return addr, 0 + } else { + // addr:port + address := addr.all_before_last(':') + port := addr.all_after_last(':').int() + p := validate_port(port)! + return address, p + } + } else if _ := addr.index(':') { + // addr:port + address := addr.all_before_last(':') + p := validate_port(addr.all_after_last(':').int())! + return address, p + } else { + // addr only + return addr, 0 } - - p := validate_port(port)! - return address, p }