Skip to content

Fix: Correct IPv6 address collapsing to prevent multiple '::'#103

Merged
dadepo merged 3 commits intomasterfrom
fix/ipv6-collapse-double-colon
Jun 8, 2025
Merged

Fix: Correct IPv6 address collapsing to prevent multiple '::'#103
dadepo merged 3 commits intomasterfrom
fix/ipv6-collapse-double-colon

Conversation

@dadepo
Copy link
Member

@dadepo dadepo commented Jun 3, 2025

The collapseIPv6Number function was incorrectly producing IPv6 strings with multiple "::" segments in certain cases. This was due to a flawed replacement logic that could introduce a "::" and then later identify another segment as compressible.

The function has been rewritten to follow the standard algorithm for IPv6 address collapsing (RFC 5952):

  1. Expand the input IPv6 address to its full 8 hexadecatets.
  2. Identify all sequences of zero-value hexadecatets.
  3. Select the longest sequence (if multiple of same longest length, select the first one).
  4. If this sequence consists of two or more hexadecatets, replace it with "::".
  5. Otherwise (if the longest sequence is just one hexadecatet, or no zeros), no "::" compression is applied unless the entire address is zeros (which becomes "::").
  6. All non-compressed hexadecatets are shortened by removing leading zeros.

This change resolves issue closes #99.

Added comprehensive test cases to spec/IPv6UtilsTest.ts to cover:

  • The specific failing cases reported in the GitHub issue.
  • Addresses with multiple zero sequences of varying lengths and positions.
  • Addresses starting or ending with zero sequences.
  • The all-zero address.
  • Addresses with no compressible zeros (single zero blocks).
  • Idempotency for already collapsed addresses.
  • Addresses with prefixes.

All tests, including the new ones (total 322), pass with these changes.

google-labs-jules bot and others added 3 commits June 3, 2025 16:08
The `collapseIPv6Number` function was incorrectly producing IPv6 strings
with multiple "::" segments in certain cases. This was due to a flawed
replacement logic that could introduce a "::" and then later identify
another segment as compressible.

The function has been rewritten to follow the standard algorithm for IPv6
address collapsing (RFC 5952):
1. Expand the input IPv6 address to its full 8 hexadecatets.
2. Identify all sequences of zero-value hexadecatets.
3. Select the longest sequence (if multiple of same longest length, select the first one).
4. If this sequence consists of two or more hexadecatets, replace it with "::".
5. Otherwise (if the longest sequence is just one hexadecatet, or no zeros), no "::" compression is applied unless the entire address is zeros (which becomes "::").
6. All non-compressed hexadecatets are shortened by removing leading zeros.

This change resolves issue #99.

Added comprehensive test cases to `spec/IPv6UtilsTest.ts` to cover:
- The specific failing cases reported in the GitHub issue.
- Addresses with multiple zero sequences of varying lengths and positions.
- Addresses starting or ending with zero sequences.
- The all-zero address.
- Addresses with no compressible zeros (single zero blocks).
- Idempotency for already collapsed addresses.
- Addresses with prefixes.

All tests, including the new ones (total 322), pass with these changes.
@dadepo dadepo merged commit a0f189a into master Jun 8, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug in collapseIPv6Number()

1 participant