python / python/cpython

ipaddress: Two more IPv6 ranges (RFC 9602, 9780) missing from _private_networks

オープン
#151,749 コメント 5 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

stdlib type-bug
主要言語
Python
スター
77.2k
フォーク
35.9k
PR マージ指標
PR 指標を取得中

説明

Bug report

Bug description:

Description

This is a peer issue to gh-151049 / PR 151050, which is addressing RFC 9665 ranges.

In this case, we similarly have the following examples return True:

  • ipaddress.ip_address('5f00::1').is_global
  • ipaddress.ip_address('100:0:0:1::1').is_global

Both blocks are registered by IANA with Globally Reachable = False.

The companion is_private returns False, so the documented-safe not ip.is_global check treats these addresses as ordinary public addresses.

IANA registration

The IANA IPv6 Special-Purpose Address Registry lists both blocks as Globally Reachable = False:

Address Block Name RFC Globally Reachable
5f00::/16 Segment Routing (SRv6) SIDs RFC 9602 False
100:0:0:1::/64 Dummy IPv6 Prefix RFC 9780 False

Registry: https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml

Both were added after the table was last revised: RFC 9602 (Segment Routing over IPv6 SIDs) registered 5f00::/16 in 2024, and RFC 9780 registered the 100:0:0:1::/64 Dummy IPv6 Prefix. Note that 100:0:0:1::/64 is disjoint from the already-listed 100::/64 (RFC 6666 Discard-Only), so the existing 100::/64 entry does not cover it.

The bug

_IPv6Constants._private_networks enumerates the not-globally-reachable blocks. It lists, among others, 100::/64, 2001:db8::/32, 2002::/16, 3fff::/20, but is missing 5f00::/16 and 100:0:0:1::/64, so addresses in those blocks fall through to globally-reachable.

This is the same class as gh-124217 (which added 3fff::/20) and the IPv4 case in bpo-42937 (the 192.0.0.8 dummy address), and the GR=False complement of the in-flight #151050 (which adds the GR=True 2001:1::3/128 to the exceptions list).

Reproduce

On current main:

>>> import ipaddress
>>> ipaddress.ip_address('5f00::1').is_global
True          # expected: False (RFC 9602, IANA GR=False)
>>> ipaddress.ip_address('5f00::1').is_private
False         # expected: True
>>> ipaddress.ip_address('100:0:0:1::1').is_global
True          # expected: False (RFC 9780, IANA GR=False)
>>> ipaddress.ip_address('100:0:0:1::1').is_private
False         # expected: True
>>> ipaddress.ip_address('3fff::1').is_global      # already-fixed sibling, correct
False
>>> ipaddress.ip_address('100::1').is_global       # adjacent in-table block, correct
False
Fix

Add the two blocks to _IPv6Constants._private_networks, with RFC reference comments, e.g.:

        IPv6Network('5f00::/16'),       # RFC 9602 (SRv6 SIDs)
        IPv6Network('100:0:0:1::/64'),  # RFC 9780 (Dummy IPv6 Prefix)

and extend testReservedIpv6 to assert that 5f00::1 and 100:0:0:1::1 are not global and are private, and that an adjacent unregistered address (e.g. 100:0:0:2::1) stays unchanged so the carve-out is exact. A Misc/NEWS entry as usual. The exceptions framework and the related entries landed in GH-113179 (first shipped in 3.13), so this applies to 3.13+.

CPython versions tested on:

3.15, CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-151764

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

_IPv6Constants._private_networks と、報告で指定されているテスト testReservedIpv6 から始め、リンクされている PR gh-151764 を確認して現在の実装状況を判断します。2 つの RFC 記載範囲がカバレッジを持ち、隣接する未登録範囲が変更されず、通常の Misc/NEWS エントリが含まれていれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
networking
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
30/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。