From c58a372d93e22f990161da5612a9207dfe0218b2 Mon Sep 17 00:00:00 2001 From: Loyalsoldier <10487845+Loyalsoldier@users.noreply.github.com> Date: Sat, 11 Sep 2021 10:07:54 +0800 Subject: [PATCH] Fix: IP length not deterministic (#1267) The length of IPv4 address in Go standard library could be 16 if it is in IPv6-mapped-IPv4 format. --- app/router/condition_geoip.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/app/router/condition_geoip.go b/app/router/condition_geoip.go index 0b7a6f618fb..73a5ff5eb9c 100644 --- a/app/router/condition_geoip.go +++ b/app/router/condition_geoip.go @@ -4,8 +4,6 @@ package router import ( - "strconv" - "inet.af/netaddr" "github.com/v2fly/v2ray-core/v4/common/net" @@ -21,16 +19,15 @@ type GeoIPMatcher struct { func (m *GeoIPMatcher) Init(cidrs []*CIDR) error { var builder4, builder6 netaddr.IPSetBuilder for _, cidr := range cidrs { - ip := net.IP(cidr.GetIp()) - ipStr := ip.String() + "/" + strconv.Itoa(int(cidr.GetPrefix())) - ipPrefix, err := netaddr.ParseIPPrefix(ipStr) - if err != nil { - return err + netaddrIP, ok := netaddr.FromStdIP(net.IP(cidr.GetIp())) + if !ok { + return newError("invalid IP address ", cidr) } - switch len(ip) { - case net.IPv4len: + ipPrefix := netaddr.IPPrefixFrom(netaddrIP, uint8(cidr.GetPrefix())) + switch { + case netaddrIP.Is4(): builder4.AddPrefix(ipPrefix) - case net.IPv6len: + case netaddrIP.Is6(): builder6.AddPrefix(ipPrefix) } }