Skip to content

Commit 93ac9b6

Browse files
authored
match IPv4MappedToIPv6 address in IPv4 networks (#103381)
* match IPv4MappedToIPv6 address in IPv4 networks * feedback
1 parent 7efc8a7 commit 93ac9b6

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

src/libraries/System.Net.Primitives/src/System/Net/IPAddress.cs

+14
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,20 @@ private set
8686
}
8787
}
8888

89+
internal uint PrivateIPv4Address
90+
{
91+
get
92+
{
93+
Debug.Assert(IsIPv4 || IsIPv4MappedToIPv6);
94+
if (IsIPv4)
95+
{
96+
return _addressOrScopeId;
97+
}
98+
uint address = (uint)_numbers[6] << 16 | (uint)_numbers[7];
99+
return (uint)HostToNetworkOrder(unchecked((int)address));
100+
}
101+
}
102+
89103
private uint PrivateScopeId
90104
{
91105
get

src/libraries/System.Net.Primitives/src/System/Net/IPNetwork.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public bool Contains(IPAddress address)
8484
{
8585
ArgumentNullException.ThrowIfNull(address);
8686

87-
if (address.AddressFamily != BaseAddress.AddressFamily)
87+
if (address.AddressFamily != BaseAddress.AddressFamily && (BaseAddress.AddressFamily != AddressFamily.InterNetwork || !address.IsIPv4MappedToIPv6))
8888
{
8989
return false;
9090
}
@@ -95,15 +95,15 @@ public bool Contains(IPAddress address)
9595
return true;
9696
}
9797

98-
if (address.AddressFamily == AddressFamily.InterNetwork)
98+
if (address.AddressFamily == AddressFamily.InterNetwork || address.IsIPv4MappedToIPv6)
9999
{
100100
uint mask = uint.MaxValue << (32 - PrefixLength);
101101
if (BitConverter.IsLittleEndian)
102102
{
103103
mask = BinaryPrimitives.ReverseEndianness(mask);
104104
}
105105

106-
return BaseAddress.PrivateAddress == (address.PrivateAddress & mask);
106+
return BaseAddress.PrivateIPv4Address == (address.PrivateIPv4Address & mask);
107107
}
108108
else
109109
{

src/libraries/System.Net.Primitives/tests/FunctionalTests/IPNetworkTest.cs

+2
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,12 @@ public void Contains_DifferentAddressFamily_ReturnsFalse()
151151

152152
[Theory]
153153
[InlineData("0.0.0.0/0", "0.0.0.0", "127.127.127.127", "255.255.255.255")] // the whole IPv4 space
154+
[InlineData("0.0.0.0/0", "0.0.0.0", "::ffff:127.127.127.127", "::ffff:255.255.255.255")] // the whole IPv4 space
154155
[InlineData("::/0", "::", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")] // the whole IPv6 space
155156
[InlineData("255.255.255.255/32", "255.255.255.255")] // single IPv4 address
156157
[InlineData("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")] // single IPv6 address
157158
[InlineData("255.255.255.0/24", "255.255.255.0", "255.255.255.255")]
159+
[InlineData("255.255.255.0/24", "::ffff:255.255.255.0", "::ffff:255.255.255.255")]
158160
[InlineData("198.51.248.0/22", "198.51.248.0", "198.51.250.42", "198.51.251.255")]
159161
[InlineData("255.255.255.128/25", "255.255.255.128", "255.255.255.129", "255.255.255.255")]
160162
[InlineData("2a00::/13", "2a00::", "2a00::1", "2a01::", "2a07::", "2a07:ffff:ffff:ffff:ffff:ffff:ffff:ffff")]

0 commit comments

Comments
 (0)