Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit bb0dbd5

Browse files
Issue #26457: Fixed the subnets() methods in IP network classes for the case
when resulting prefix length is equal to maximal prefix length. Based on patch by Xiang Zhang.
1 parent 5f582bd commit bb0dbd5

3 files changed

Lines changed: 43 additions & 9 deletions

File tree

Lib/ipaddress.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -740,21 +740,21 @@ def address_exclude(self, other):
740740
741741
addr1 = ip_network('192.0.2.0/28')
742742
addr2 = ip_network('192.0.2.1/32')
743-
addr1.address_exclude(addr2) =
743+
list(addr1.address_exclude(addr2)) =
744744
[IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'),
745-
IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
745+
IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')]
746746
747747
or IPv6:
748748
749749
addr1 = ip_network('2001:db8::1/32')
750750
addr2 = ip_network('2001:db8::1/128')
751-
addr1.address_exclude(addr2) =
751+
list(addr1.address_exclude(addr2)) =
752752
[ip_network('2001:db8::1/128'),
753-
ip_network('2001:db8::2/127'),
754-
ip_network('2001:db8::4/126'),
755-
ip_network('2001:db8::8/125'),
756-
...
757-
ip_network('2001:db8:8000::/33')]
753+
ip_network('2001:db8::2/127'),
754+
ip_network('2001:db8::4/126'),
755+
ip_network('2001:db8::8/125'),
756+
...
757+
ip_network('2001:db8:8000::/33')]
758758
759759
Args:
760760
other: An IPv4Network or IPv6Network object of the same type.
@@ -916,7 +916,7 @@ def subnets(self, prefixlen_diff=1, new_prefix=None):
916916
new_prefixlen, self))
917917

918918
start = int(self.network_address)
919-
end = int(self.broadcast_address)
919+
end = int(self.broadcast_address) + 1
920920
step = (int(self.hostmask) + 1) >> prefixlen_diff
921921
for new_addr in range(start, end, step):
922922
current = self.__class__((new_addr, new_prefixlen))

Lib/test/test_ipaddress.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,26 @@ def testSubnet2(self):
10661066
'2001:658:22a:cafe:8000::/66',
10671067
'2001:658:22a:cafe:c000::/66'])
10681068

1069+
def testGetSubnets3(self):
1070+
subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1071+
self.assertEqual(subnets[:3],
1072+
['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1073+
self.assertEqual(subnets[-3:],
1074+
['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1075+
self.assertEqual(len(subnets), 256)
1076+
1077+
ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1078+
subnets = [str(x) for x in ipv6_network.subnets(8)]
1079+
self.assertEqual(subnets[:3],
1080+
['2001:658:22a:cafe::/128',
1081+
'2001:658:22a:cafe::1/128',
1082+
'2001:658:22a:cafe::2/128'])
1083+
self.assertEqual(subnets[-3:],
1084+
['2001:658:22a:cafe::fd/128',
1085+
'2001:658:22a:cafe::fe/128',
1086+
'2001:658:22a:cafe::ff/128'])
1087+
self.assertEqual(len(subnets), 256)
1088+
10691089
def testSubnetFailsForLargeCidrDiff(self):
10701090
self.assertRaises(ValueError, list,
10711091
self.ipv4_interface.network.subnets(9))
@@ -1670,13 +1690,23 @@ def testAddrExclude(self):
16701690
addr3 = ipaddress.ip_network('10.2.1.0/24')
16711691
addr4 = ipaddress.ip_address('10.1.1.0')
16721692
addr5 = ipaddress.ip_network('2001:db8::0/32')
1693+
addr6 = ipaddress.ip_network('10.1.1.5/32')
16731694
self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
16741695
[ipaddress.ip_network('10.1.1.64/26'),
16751696
ipaddress.ip_network('10.1.1.128/25')])
16761697
self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
16771698
self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
16781699
self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
16791700
self.assertEqual(list(addr1.address_exclude(addr1)), [])
1701+
self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1702+
[ipaddress.ip_network('10.1.1.0/30'),
1703+
ipaddress.ip_network('10.1.1.4/32'),
1704+
ipaddress.ip_network('10.1.1.6/31'),
1705+
ipaddress.ip_network('10.1.1.8/29'),
1706+
ipaddress.ip_network('10.1.1.16/28'),
1707+
ipaddress.ip_network('10.1.1.32/27'),
1708+
ipaddress.ip_network('10.1.1.64/26'),
1709+
ipaddress.ip_network('10.1.1.128/25')])
16801710

16811711
def testHash(self):
16821712
self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),

Misc/NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ Core and Builtins
8484
Library
8585
-------
8686

87+
- Issue #26457: Fixed the subnets() methods in IP network classes for the case
88+
when resulting prefix length is equal to maximal prefix length.
89+
Based on patch by Xiang Zhang.
90+
8791
- Issue #26385: Remove the file if the internal open() call in
8892
NamedTemporaryFile() fails. Patch by Silent Ghost.
8993

0 commit comments

Comments
 (0)