Browse Source

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.
Loyalsoldier 4 years ago
parent
commit
c58a372d93
1 changed files with 7 additions and 10 deletions
  1. 7 10
      app/router/condition_geoip.go

+ 7 - 10
app/router/condition_geoip.go

@@ -4,8 +4,6 @@
 package router
 package router
 
 
 import (
 import (
-	"strconv"
-
 	"inet.af/netaddr"
 	"inet.af/netaddr"
 
 
 	"github.com/v2fly/v2ray-core/v4/common/net"
 	"github.com/v2fly/v2ray-core/v4/common/net"
@@ -21,16 +19,15 @@ type GeoIPMatcher struct {
 func (m *GeoIPMatcher) Init(cidrs []*CIDR) error {
 func (m *GeoIPMatcher) Init(cidrs []*CIDR) error {
 	var builder4, builder6 netaddr.IPSetBuilder
 	var builder4, builder6 netaddr.IPSetBuilder
 	for _, cidr := range cidrs {
 	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)
 			builder4.AddPrefix(ipPrefix)
-		case net.IPv6len:
+		case netaddrIP.Is6():
 			builder6.AddPrefix(ipPrefix)
 			builder6.AddPrefix(ipPrefix)
 		}
 		}
 	}
 	}