Skip to content

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

Open
fedonman wants to merge 1 commit into
python:mainfrom
fedonman:fix-ipaddress-next-network-ipv6
Open

gh-156680: Raise the documented error from IPv6Network.next_network()#156681
fedonman wants to merge 1 commit into
python:mainfrom
fedonman:fix-ipaddress-next-network-ipv6

Conversation

@fedonman

@fedonman fedonman commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Range-check next_ip against _ALL_ONES in next_network() instead of catching OverflowError, which only the IPv4 path raises. The IPv6 path went through _BaseV6._string_from_ip_int(), whose ValueError escaped uncaught.

next_network() is new in 3.16 and unreleased, so this is folded into the entry the method landed with and needs no NEWS fragment.

testNextNetworkOutOfAddressSpace (test.test_ipaddress.IpaddrUnitTest.testNextNetworkOutOfAddressSpace) ... ok
Total tests: run=1 (filtered)
Result: SUCCESS
Total tests: run=215
Result: SUCCESS

…work()

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.

Range-check next_ip against _ALL_ONES before formatting it, which
decides the outcome for both address families before either path
runs.
@StanFromIreland

StanFromIreland commented Aug 31, 2026

Copy link
Copy Markdown
Member

Thanks! Can you also please fix the What's New entry (and news entry) for these:

image

@StanFromIreland

StanFromIreland commented Aug 31, 2026

Copy link
Copy Markdown
Member

Also, reviewing fadb785 please fix the docstring of next_network, the sentence detailing the arguments is missing a period and there's no raises section.

@StanFromIreland

StanFromIreland commented Aug 31, 2026

Copy link
Copy Markdown
Member

Oh and one more thing. I don't quite understand why we're doing this little dance with _string_from_ip_int, when we can create an instance directly.

Apologies for all the changes I've asked you to make, indeed it grew to be quite a long list. As such, here's a patch instead:

--- 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))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants