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

Skip to content

Commit 5cf896f

Browse files
committed
Issue 14814: Eliminate bytes warnings from ipaddress by correctly throwing an exception early when given bytes data of the wrong length. Also removes 2.x backwards compatibility code from associated tests.
1 parent 3c2570c commit 5cf896f

2 files changed

Lines changed: 46 additions & 31 deletions

File tree

Lib/ipaddress.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,7 +1250,9 @@ def __init__(self, address):
12501250
return
12511251

12521252
# Constructing from a packed address
1253-
if isinstance(address, bytes) and len(address) == 4:
1253+
if isinstance(address, bytes):
1254+
if len(address) != 4:
1255+
raise AddressValueError(address)
12541256
self._ip = struct.unpack('!I', address)[0]
12551257
return
12561258

@@ -1379,7 +1381,9 @@ def __init__(self, address, strict=True):
13791381
_BaseNetwork.__init__(self, address)
13801382

13811383
# Constructing from a packed address
1382-
if isinstance(address, bytes) and len(address) == 4:
1384+
if isinstance(address, bytes):
1385+
if len(address) != 4:
1386+
raise AddressValueError(address)
13831387
self.network_address = IPv4Address(
13841388
struct.unpack('!I', address)[0])
13851389
self._prefixlen = self._max_prefixlen
@@ -1864,7 +1868,9 @@ def __init__(self, address):
18641868
return
18651869

18661870
# Constructing from a packed address
1867-
if isinstance(address, bytes) and len(address) == 16:
1871+
if isinstance(address, bytes):
1872+
if len(address) != 16:
1873+
raise AddressValueError(address)
18681874
tmp = struct.unpack('!QQ', address)
18691875
self._ip = (tmp[0] << 64) | tmp[1]
18701876
return
@@ -1996,7 +2002,9 @@ def __init__(self, address, strict=True):
19962002
return
19972003

19982004
# Constructing from a packed address
1999-
if isinstance(address, bytes) and len(address) == 16:
2005+
if isinstance(address, bytes):
2006+
if len(address) != 16:
2007+
raise AddressValueError(address)
20002008
tmp = struct.unpack('!QQ', address)
20012009
self.network_address = IPv6Address((tmp[0] << 64) | tmp[1])
20022010
self._prefixlen = self._max_prefixlen

Lib/test/test_ipaddress.py

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
import ipaddress
99

1010

11-
# Compatibility function to cast str to bytes objects
12-
_cb = lambda bytestr: bytes(bytestr, 'charmap')
13-
14-
1511
class IpaddrUnitTest(unittest.TestCase):
1612

1713
def setUp(self):
@@ -267,25 +263,36 @@ def testIpFromInt(self):
267263
6)
268264

269265
def testIpFromPacked(self):
270-
ip = ipaddress.ip_network
271-
266+
address = ipaddress.ip_address
272267
self.assertEqual(self.ipv4_interface._ip,
273-
ipaddress.ip_interface(_cb('\x01\x02\x03\x04'))._ip)
274-
self.assertEqual(ip('255.254.253.252'),
275-
ip(_cb('\xff\xfe\xfd\xfc')))
276-
self.assertRaises(ValueError, ipaddress.ip_network, _cb('\x00' * 3))
277-
self.assertRaises(ValueError, ipaddress.ip_network, _cb('\x00' * 5))
268+
ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
269+
self.assertEqual(address('255.254.253.252'),
270+
address(b'\xff\xfe\xfd\xfc'))
278271
self.assertEqual(self.ipv6_interface.ip,
279272
ipaddress.ip_interface(
280-
_cb('\x20\x01\x06\x58\x02\x2a\xca\xfe'
281-
'\x02\x00\x00\x00\x00\x00\x00\x01')).ip)
282-
self.assertEqual(ip('ffff:2:3:4:ffff::'),
283-
ip(_cb('\xff\xff\x00\x02\x00\x03\x00\x04' +
284-
'\xff\xff' + '\x00' * 6)))
285-
self.assertEqual(ip('::'),
286-
ip(_cb('\x00' * 16)))
287-
self.assertRaises(ValueError, ip, _cb('\x00' * 15))
288-
self.assertRaises(ValueError, ip, _cb('\x00' * 17))
273+
b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
274+
b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
275+
self.assertEqual(address('ffff:2:3:4:ffff::'),
276+
address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
277+
b'\xff\xff' + b'\x00' * 6))
278+
self.assertEqual(address('::'),
279+
address(b'\x00' * 16))
280+
281+
def testIpFromPackedErrors(self):
282+
def assertInvalidPackedAddress(f, length):
283+
self.assertRaises(ValueError, f, b'\x00' * length)
284+
assertInvalidPackedAddress(ipaddress.ip_address, 3)
285+
assertInvalidPackedAddress(ipaddress.ip_address, 5)
286+
assertInvalidPackedAddress(ipaddress.ip_address, 15)
287+
assertInvalidPackedAddress(ipaddress.ip_address, 17)
288+
assertInvalidPackedAddress(ipaddress.ip_interface, 3)
289+
assertInvalidPackedAddress(ipaddress.ip_interface, 5)
290+
assertInvalidPackedAddress(ipaddress.ip_interface, 15)
291+
assertInvalidPackedAddress(ipaddress.ip_interface, 17)
292+
assertInvalidPackedAddress(ipaddress.ip_network, 3)
293+
assertInvalidPackedAddress(ipaddress.ip_network, 5)
294+
assertInvalidPackedAddress(ipaddress.ip_network, 15)
295+
assertInvalidPackedAddress(ipaddress.ip_network, 17)
289296

290297
def testGetIp(self):
291298
self.assertEqual(int(self.ipv4_interface.ip), 16909060)
@@ -893,17 +900,17 @@ def testMaxPrefixLength(self):
893900

894901
def testPacked(self):
895902
self.assertEqual(self.ipv4_address.packed,
896-
_cb('\x01\x02\x03\x04'))
903+
b'\x01\x02\x03\x04')
897904
self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
898-
_cb('\xff\xfe\xfd\xfc'))
905+
b'\xff\xfe\xfd\xfc')
899906
self.assertEqual(self.ipv6_address.packed,
900-
_cb('\x20\x01\x06\x58\x02\x2a\xca\xfe'
901-
'\x02\x00\x00\x00\x00\x00\x00\x01'))
907+
b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
908+
b'\x02\x00\x00\x00\x00\x00\x00\x01')
902909
self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
903-
_cb('\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
904-
+ '\x00' * 6))
910+
b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
911+
+ b'\x00' * 6)
905912
self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
906-
_cb('\x00' * 6 + '\x00\x01' + '\x00' * 8))
913+
b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
907914

908915
def testIpStrFromPrefixlen(self):
909916
ipv4 = ipaddress.IPv4Interface('1.2.3.4/24')

0 commit comments

Comments
 (0)