Skip to content

Commit cf58dfb

Browse files
[3.6] bpo-29931 fix __lt__ check in ipaddress.ip_interface for both v4 and v6. (GH-879) (#2217)
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. (cherry picked from commit 7bd8d3e)
1 parent f75f6ed commit cf58dfb

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
@@ -51,6 +51,9 @@ Core and Builtins
5151
Library
5252
-------
5353

54+
- bpo-29931: Fixed comparison check for ipaddress.ip_interface objects.
55+
Patch by Sanjay Sundaresan.
56+
5457
- bpo-30605: re.compile() no longer raises a BytesWarning when compiling a
5558
bytes instance with misplaced inline modifier. Patch by Roy Williams.
5659

0 commit comments

Comments
 (0)