From f06bfbf9f12e7b7e0c88982c7a5c54cc7165848b Mon Sep 17 00:00:00 2001 From: iiiceoo Date: Fri, 10 May 2024 10:31:58 +0800 Subject: [PATCH] fix: Not all IPRanges with a size of power 2 can convert to CIDR Signed-off-by: iiiceoo --- .github/workflows/code-coverage.yml | 2 +- example_test.go | 20 ++++++++++---------- range.go | 26 +++++++++++++++----------- ranges.go | 4 ---- ranges_test.go | 2 +- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 2fd753d..757b2b3 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -4,7 +4,7 @@ jobs: unit-test: strategy: matrix: - go-version: [1.20.x, 1.21.x, 1.22.x] + go-version: [1.20.x] os: [ubuntu-latest] runs-on: ${{ matrix.os }} steps: diff --git a/example_test.go b/example_test.go index b557a10..ca030a4 100644 --- a/example_test.go +++ b/example_test.go @@ -140,18 +140,18 @@ func ExampleIPRanges_Union() { } func ExampleIPRanges_Diff() { - ranges1, err := iprange.Parse("172.18.0.20-30", "172.18.0.1-25") + ranges1, err := iprange.Parse("172.18.0.20-30", "172.18.0.0-25") if err != nil { log.Fatalf("error parsing IP ranges: %v", err) } - ranges2, err := iprange.Parse("172.18.0.5-25") + ranges2, err := iprange.Parse("172.18.0.4-26") if err != nil { log.Fatalf("error parsing IP ranges: %v", err) } fmt.Println(ranges1.Diff(ranges2)) // Output: - // [172.18.0.1/30 172.18.0.26-172.18.0.30] + // [172.18.0.0/30 172.18.0.27-172.18.0.30] } func ExampleIPRanges_Intersect() { @@ -170,14 +170,14 @@ func ExampleIPRanges_Intersect() { } func ExampleIPRanges_Slice() { - ranges, err := iprange.Parse("172.18.0.1-5", "172.18.0.10-14") + ranges, err := iprange.Parse("172.18.0.0-3", "172.18.0.10-14") if err != nil { log.Fatalf("error parsing IP ranges: %v", err) } fmt.Println(ranges.Slice(big.NewInt(2), big.NewInt(-2))) // Output: - // [172.18.0.3-172.18.0.5 172.18.0.10/30] + // [172.18.0.2/31 172.18.0.10-172.18.0.13] } func ExampleIPRanges_IsOverlap() { @@ -230,7 +230,7 @@ func ExampleIPRanges_IPIterator() { } func ExampleIPRanges_BlockIterator() { - ranges, err := iprange.Parse("172.18.0.1-5") + ranges, err := iprange.Parse("172.18.0.0-4") if err != nil { log.Fatalf("error parsing IP ranges: %v", err) } @@ -255,10 +255,10 @@ func ExampleIPRanges_BlockIterator() { } // Output: - // 172.18.0.1/31 - // 172.18.0.3/31 - // 172.18.0.5 - // 172.18.0.5 + // 172.18.0.0/31 + // 172.18.0.2/31 + // 172.18.0.4 + // 172.18.0.4 } func ExampleIPRanges_CIDRIterator() { diff --git a/range.go b/range.go index 34d61a2..d18b45b 100644 --- a/range.go +++ b/range.go @@ -139,18 +139,22 @@ func (r *ipRange) String() string { return r.start.String() } - if inc.And(inc, dv).Sign() != 0 { - return r.start.String() + "-" + r.end.String() - } + if inc.And(inc, dv).Sign() == 0 { + bits := 32 + if r.start.version() == IPv6 { + bits = 128 + } - bits := 32 - if r.start.version() == IPv6 { - bits = 128 - } - ipNet := &net.IPNet{ - IP: r.start.IP, - Mask: net.CIDRMask(bits-bl, bits), + ip := r.start.IP + mask := net.CIDRMask(bits-bl, bits) + if ip.Mask(mask).Equal(ip) { + ipNet := net.IPNet{ + IP: ip, + Mask: mask, + } + return ipNet.String() + } } - return ipNet.String() + return r.start.String() + "-" + r.end.String() } diff --git a/ranges.go b/ranges.go index 2a36703..c5836ac 100644 --- a/ranges.go +++ b/ranges.go @@ -459,10 +459,6 @@ func (rr *IPRanges) String() string { // Strings returns a slice of the string representations of the IPRanges rr. func (rr *IPRanges) Strings() []string { - if len(rr.ranges) == 0 { - return nil - } - ss := make([]string, 0, len(rr.ranges)) for _, r := range rr.ranges { ss = append(ss, r.String()) diff --git a/ranges_test.go b/ranges_test.go index 4754e60..f9df2cb 100644 --- a/ranges_test.go +++ b/ranges_test.go @@ -1637,7 +1637,7 @@ var ipRangesStringsTests = []struct { { name: "zero", ranges: &IPRanges{}, - want: nil, + want: []string{}, }, }