Skip to content

Commit 5e48e3d

Browse files
niconorskmethane
authored andcommitted
bpo-36845: validate integer network prefix when constructing IP networks (GH-13298)
1 parent f0be4bb commit 5e48e3d

File tree

4 files changed

+23
-0
lines changed

4 files changed

+23
-0
lines changed

Lib/ipaddress.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,8 @@ def _make_netmask(cls, arg):
11081108
if arg not in cls._netmask_cache:
11091109
if isinstance(arg, int):
11101110
prefixlen = arg
1111+
if not (0 <= prefixlen <= cls._max_prefixlen):
1112+
cls._report_invalid_netmask(prefixlen)
11111113
else:
11121114
try:
11131115
# Check for a netmask in prefix length form
@@ -1538,6 +1540,8 @@ def _make_netmask(cls, arg):
15381540
if arg not in cls._netmask_cache:
15391541
if isinstance(arg, int):
15401542
prefixlen = arg
1543+
if not (0 <= prefixlen <= cls._max_prefixlen):
1544+
cls._report_invalid_netmask(prefixlen)
15411545
else:
15421546
prefixlen = cls._prefix_from_prefix_string(arg)
15431547
netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))

Lib/test/test_ipaddress.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,14 @@ def assertBadNetmask(addr, netmask):
466466
assertBadNetmask("1.1.1.1", "pudding")
467467
assertBadNetmask("1.1.1.1", "::")
468468

469+
def test_netmask_in_tuple_errors(self):
470+
def assertBadNetmask(addr, netmask):
471+
msg = "%r is not a valid netmask" % netmask
472+
with self.assertNetmaskError(re.escape(msg)):
473+
self.factory((addr, netmask))
474+
assertBadNetmask("1.1.1.1", -1)
475+
assertBadNetmask("1.1.1.1", 33)
476+
469477
def test_pickle(self):
470478
self.pickle_test('192.0.2.0/27')
471479
self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
@@ -588,6 +596,14 @@ def assertBadNetmask(addr, netmask):
588596
assertBadNetmask("::1", "pudding")
589597
assertBadNetmask("::", "::")
590598

599+
def test_netmask_in_tuple_errors(self):
600+
def assertBadNetmask(addr, netmask):
601+
msg = "%r is not a valid netmask" % netmask
602+
with self.assertNetmaskError(re.escape(msg)):
603+
self.factory((addr, netmask))
604+
assertBadNetmask("::1", -1)
605+
assertBadNetmask("::1", 129)
606+
591607
def test_pickle(self):
592608
self.pickle_test('2001:db8::1000/124')
593609
self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,7 @@ Bastien Montagne
11081108
Skip Montanaro
11091109
Peter Moody
11101110
Alan D. Moore
1111+
Nicolai Moore
11111112
Paul Moore
11121113
Ross Moore
11131114
Ben Morgan
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Added validation of integer prefixes to the construction of IP networks and
2+
interfaces in the ipaddress module.

0 commit comments

Comments
 (0)