Skip to content

Commit 30cccf0

Browse files
miss-islingtonniconorsk
authored andcommitted
bpo-36845: validate integer network prefix when constructing IP networks (GH-13298)
(cherry picked from commit 5e48e3d) Co-authored-by: Nicolai Moore <[email protected]>
1 parent 0a5b88e commit 30cccf0

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
@@ -1101,6 +1101,8 @@ def _make_netmask(cls, arg):
11011101
if arg not in cls._netmask_cache:
11021102
if isinstance(arg, int):
11031103
prefixlen = arg
1104+
if not (0 <= prefixlen <= cls._max_prefixlen):
1105+
cls._report_invalid_netmask(prefixlen)
11041106
else:
11051107
try:
11061108
# Check for a netmask in prefix length form
@@ -1622,6 +1624,8 @@ def _make_netmask(cls, arg):
16221624
if arg not in cls._netmask_cache:
16231625
if isinstance(arg, int):
16241626
prefixlen = arg
1627+
if not (0 <= prefixlen <= cls._max_prefixlen):
1628+
cls._report_invalid_netmask(prefixlen)
16251629
else:
16261630
prefixlen = cls._prefix_from_prefix_string(arg)
16271631
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
@@ -579,6 +587,14 @@ def assertBadNetmask(addr, netmask):
579587
assertBadNetmask("::1", "pudding")
580588
assertBadNetmask("::", "::")
581589

590+
def test_netmask_in_tuple_errors(self):
591+
def assertBadNetmask(addr, netmask):
592+
msg = "%r is not a valid netmask" % netmask
593+
with self.assertNetmaskError(re.escape(msg)):
594+
self.factory((addr, netmask))
595+
assertBadNetmask("::1", -1)
596+
assertBadNetmask("::1", 129)
597+
582598
def test_pickle(self):
583599
self.pickle_test('2001:db8::1000/124')
584600
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
@@ -1093,6 +1093,7 @@ Bastien Montagne
10931093
Skip Montanaro
10941094
Peter Moody
10951095
Alan D. Moore
1096+
Nicolai Moore
10961097
Paul Moore
10971098
Ross Moore
10981099
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)