https://github.com/python/cpython/commit/69a6612ff02c022d17f9b9f358dd972eecd2fec5
commit: 69a6612ff02c022d17f9b9f358dd972eecd2fec5
branch: main
author: Vyron Vasileiadis <[email protected]>
committer: orsenthil <[email protected]>
date: 2026-09-09T17:08:37-07:00
summary:

gh-156680: Raise the documented error from IPv6Network.next_network() (#156681)

* gh-156680: Raise the documented error from IPv6Network.next_network()

next_network() guarded address-space exhaustion with except
OverflowError, which only int.to_bytes() on the IPv4 path raises.
_BaseV6._string_from_ip_int() raises ValueError instead, so the
handler never ran for IPv6 and the internal 'IPv6 address is too
large' message escaped.

Build the result from an (address, prefix) tuple rather than formatting
and reparsing a string.

files:
M Doc/whatsnew/3.16.rst
M Lib/ipaddress.py
M Lib/test/test_ipaddress.py
M Misc/NEWS.d/next/Library/2021-01-09-18-40-15.bpo-42861.T7Ge9O.rst

diff --git a/Doc/whatsnew/3.16.rst b/Doc/whatsnew/3.16.rst
index 243bd078d37c998..69fb89ab56446e0 100644
--- a/Doc/whatsnew/3.16.rst
+++ b/Doc/whatsnew/3.16.rst
@@ -412,9 +412,9 @@ io
 ipaddress
 ---------
 
-* Add :meth:`~ipaddress.IPv4Network.next_network` and
-  :meth:`~ipaddress.IPv6Network.next_network` methods to find the next nearest
-  network with a specific prefix size.
+* Add :meth:`IPv4Network.next_network() <ipaddress.IPv4Network.next_network>`
+  and :meth:`IPv6Network.next_network() <ipaddress.IPv6Network.next_network>`
+  methods to find the next nearest network with a specific prefix size.
   (Contributed by Faisal Mahmood in :gh:`87027`.)
 
 
diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
index 6978483544e621a..de489c0ed034bb0 100644
--- a/Lib/ipaddress.py
+++ b/Lib/ipaddress.py
@@ -1124,11 +1124,15 @@ def next_network(self, next_prefix=None):
 
         Args:
             next_prefix: The desired next prefix length, if not specified the
-            same self.prefixlen will be used
+            same self.prefixlen will be used.
 
         Returns:
             An IPv(4|6) Network object of the next closest network.
 
+        Raises:
+            ValueError: If next_prefix is outside the range of valid prefix
+            lengths, or if no further network of that size exists.
+
         """
         if next_prefix is None:
             next_prefix = self.prefixlen
@@ -1150,15 +1154,13 @@ def next_network(self, next_prefix=None):
             ((new_netmask._ip & self.network_address._ip) >> bit_shift) + 1
         ) << bit_shift
 
-        try:
-            return self.__class__(
-                f"{self._string_from_ip_int(next_ip)}/{next_prefix}"
-            )
-        except OverflowError:
+        if next_ip > self._ALL_ONES:
             raise ValueError(
                 f"out of address space, cannot make another /{next_prefix} "
                 "network"
-            ) from None
+            )
+
+        return self.__class__((next_ip, next_prefix))
 
 
 class _BaseConstants:
diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py
index 375d45172a9f4d1..d6d0d8220449bdb 100644
--- a/Lib/test/test_ipaddress.py
+++ b/Lib/test/test_ipaddress.py
@@ -1596,9 +1596,15 @@ def testNextNetworkWithBadPrefix(self):
 
     def testNextNetworkOutOfAddressSpace(self):
         ipv4 = ipaddress.IPv4Network('255.255.255.0/24')
-        self.assertRaises(ValueError, ipv4.next_network)
+        self.assertRaisesRegex(
+            ValueError,
+            'out of address space, cannot make another /24 network',
+            ipv4.next_network)
         ipv6 = 
ipaddress.IPv6Network('ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112')
-        self.assertRaises(ValueError, ipv6.next_network)
+        self.assertRaisesRegex(
+            ValueError,
+            'out of address space, cannot make another /112 network',
+            ipv6.next_network)
 
     def testFancySubnetting(self):
         self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
diff --git a/Misc/NEWS.d/next/Library/2021-01-09-18-40-15.bpo-42861.T7Ge9O.rst 
b/Misc/NEWS.d/next/Library/2021-01-09-18-40-15.bpo-42861.T7Ge9O.rst
index 46ed99d1e1b4992..9de1e937278152e 100644
--- a/Misc/NEWS.d/next/Library/2021-01-09-18-40-15.bpo-42861.T7Ge9O.rst
+++ b/Misc/NEWS.d/next/Library/2021-01-09-18-40-15.bpo-42861.T7Ge9O.rst
@@ -1,2 +1,3 @@
-Add :meth:`~ipaddress.IPv4Network.next_network` and
-:meth:`~ipaddress.IPv6Network.next_network`.  Patch by Faisal Mahmood.
+Add :meth:`IPv4Network.next_network() <ipaddress.IPv4Network.next_network>`
+and :meth:`IPv6Network.next_network() <ipaddress.IPv6Network.next_network>`.
+Patch by Faisal Mahmood.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to