8000 bpo-29931 fix __lt__ check in ipaddress.ip_interface for both v4 and … · python/cpython@7bd8d3e · GitHub
[go: up one dir, main page]

Skip to content

Commit 7bd8d3e

Browse files
s-sanjayserhiy-storchaka
authored andcommitted
bpo-29931 fix __lt__ check in ipaddress.ip_interface for both v4 and v6. (#879)
the original logic was just comparing the network address but this is wrong because if the network address is equal then we need to compare the ip address for breaking the tie add more ip_interface comparison tests
1 parent 1f5425f commit 7bd8d3e

File tree

3 files changed

+36
-10
lines changed

3 files changed

+36
-10
lines changed

Lib/ipaddress.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,7 +1410,8 @@ def __lt__(self, other):
14101410
if address_less is NotImplemented:
14111411
return NotImplemented
14121412
try:
1413-
return self.network < other.network
1413+
return (self.network < other.network or
1414+
self.network == other.network and address_less)
14141415
except AttributeError:
14151416
# We *do* allow addresses and interfaces to be sorted. The
14161417
# unassociated address is considered less than all interfaces.
@@ -2100,7 +2101,8 @@ def __lt__(self, other):
21002101
if address_less is NotImplemented:
21012102
return NotImplemented
21022103
try:
2103-
return self.network < other.network
2104+
return (self.network < other.network or
2105+
self.network == other.network and address_less)
21042106
except AttributeError:
21052107
# We *do* allow addresses and interfaces to be sorted. The
21062108
# unassociated address is considered less than all interfaces.

Lib/test/test_ipaddress.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,14 +1405,35 @@ def testAddressComparison(self):
14051405
ipaddress.ip_address('::2'))
14061406

14071407
def testInterfaceComparison(self):
1408-
self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1409-
ipaddress.ip_interface('1.1.1.1'))
1410-
self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1411-
ipaddress.ip_interface('1.1.1.2'))
1412-
self.assertTrue(ipaddress.ip_interface('::1') <=
1413-
ipaddress.ip_interface('::1'))
1414-
self.assertTrue(ipaddress.ip_interface('::1') <=
1415-
ipaddress.ip_interface('::2'))
1408+
self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1409+
ipaddress.ip_interface('1.1.1.1/24'))
1410+
self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1411+
ipaddress.ip_interface('1.1.1.1/24'))
1412+
self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1413+
ipaddress.ip_interface('1.1.1.2/24'))
1414+
self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1415+
ipaddress.ip_interface('1.1.1.1/24'))
1416+
self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1417+
ipaddress.ip_interface('1.1.1.1/16'))
1418+
self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1419+
ipaddress.ip_interface('1.1.1.1/24'))
1420+
self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1421+
ipaddress.ip_interface('1.1.1.2/16'))
1422+
1423+
self.assertTrue(ipaddress.ip_interface('::1/64') ==
1424+
ipaddress.ip_interface('::1/64'))
1425+
self.assertTrue(ipaddress.ip_interface('::1/64') <
1426+
ipaddress.ip_interface('::1/80'))
1427+
self.assertTrue(ipaddress.ip_interface('::1/64') <
1428+
ipaddress.ip_interface('::2/64'))
1429+
self.assertTrue(ipaddress.ip_interface('::2/48') <
1430+
ipaddress.ip_interface('::1/64'))
1431+
self.assertTrue(ipaddress.ip_interface('::1/80') >
1432+
ipaddress.ip_interface('::1/64'))
1433+
self.assertTrue(ipaddress.ip_interface('::2/64') >
1434+
ipaddress.ip_interface('::1/64'))
1435+
self.assertTrue(ipaddress.ip_interface('::1/64') >
1436+
ipaddress.ip_interface('::2/48'))
14161437

14171438
def testNetworkComparison(self):
14181439
# ip1 and ip2 have the same network address

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ Extension Modules
301301
Library
302302
-------
303303

304+
- bpo-29931: Fixed comparison check for ipaddress.ip_interface objects.
305+
Patch by Sanjay Sundaresan.
306+
304307
- bpo-29953: Fixed memory leaks in the replace() method of datetime and time
305308
objects when pass out of bound fold argument.
306309

0 commit comments

Comments
 (0)
0