Commit 5e48e3db authored by Nicolai Moore's avatar Nicolai Moore Committed by Inada Naoki

bpo-36845: validate integer network prefix when constructing IP networks (GH-13298)

parent f0be4bbb
...@@ -1108,6 +1108,8 @@ class _BaseV4: ...@@ -1108,6 +1108,8 @@ class _BaseV4:
if arg not in cls._netmask_cache: if arg not in cls._netmask_cache:
if isinstance(arg, int): if isinstance(arg, int):
prefixlen = arg prefixlen = arg
if not (0 <= prefixlen <= cls._max_prefixlen):
cls._report_invalid_netmask(prefixlen)
else: else:
try: try:
# Check for a netmask in prefix length form # Check for a netmask in prefix length form
...@@ -1538,6 +1540,8 @@ class _BaseV6: ...@@ -1538,6 +1540,8 @@ class _BaseV6:
if arg not in cls._netmask_cache: if arg not in cls._netmask_cache:
if isinstance(arg, int): if isinstance(arg, int):
prefixlen = arg prefixlen = arg
if not (0 <= prefixlen <= cls._max_prefixlen):
cls._report_invalid_netmask(prefixlen)
else: else:
prefixlen = cls._prefix_from_prefix_string(arg) prefixlen = cls._prefix_from_prefix_string(arg)
netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen))
......
...@@ -466,6 +466,14 @@ class NetmaskTestMixin_v4(CommonTestMixin_v4): ...@@ -466,6 +466,14 @@ class NetmaskTestMixin_v4(CommonTestMixin_v4):
assertBadNetmask("1.1.1.1", "pudding") assertBadNetmask("1.1.1.1", "pudding")
assertBadNetmask("1.1.1.1", "::") assertBadNetmask("1.1.1.1", "::")
def test_netmask_in_tuple_errors(self):
def assertBadNetmask(addr, netmask):
msg = "%r is not a valid netmask" % netmask
with self.assertNetmaskError(re.escape(msg)):
self.factory((addr, netmask))
assertBadNetmask("1.1.1.1", -1)
assertBadNetmask("1.1.1.1", 33)
def test_pickle(self): def test_pickle(self):
self.pickle_test('192.0.2.0/27') self.pickle_test('192.0.2.0/27')
self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
...@@ -588,6 +596,14 @@ class NetmaskTestMixin_v6(CommonTestMixin_v6): ...@@ -588,6 +596,14 @@ class NetmaskTestMixin_v6(CommonTestMixin_v6):
assertBadNetmask("::1", "pudding") assertBadNetmask("::1", "pudding")
assertBadNetmask("::", "::") assertBadNetmask("::", "::")
def test_netmask_in_tuple_errors(self):
def assertBadNetmask(addr, netmask):
msg = "%r is not a valid netmask" % netmask
with self.assertNetmaskError(re.escape(msg)):
self.factory((addr, netmask))
assertBadNetmask("::1", -1)
assertBadNetmask("::1", 129)
def test_pickle(self): def test_pickle(self):
self.pickle_test('2001:db8::1000/124') self.pickle_test('2001:db8::1000/124')
self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
......
...@@ -1108,6 +1108,7 @@ Bastien Montagne ...@@ -1108,6 +1108,7 @@ Bastien Montagne
Skip Montanaro Skip Montanaro
Peter Moody Peter Moody
Alan D. Moore Alan D. Moore
Nicolai Moore
Paul Moore Paul Moore
Ross Moore Ross Moore
Ben Morgan Ben Morgan
......
Added validation of integer prefixes to the construction of IP networks and
interfaces in the ipaddress module.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment