Skip to content

Commit 2fd8bc9

Browse files
committed
Fix: edge case with overflow
1 parent 84cc8d0 commit 2fd8bc9

File tree

3 files changed

+56
-36
lines changed

3 files changed

+56
-36
lines changed

src/System.Net.IPNetwork/IPNetwork2Operators.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,14 @@ public sealed partial class IPNetwork2
129129
var startIp = ToIPAddress(start, left.AddressFamily);
130130
var endIp = ToIPAddress(end, left.AddressFamily);
131131

132-
InternalParseRange(false, startIp, endIp, out IEnumerable<IPNetwork2> networks);
132+
var uintStart = ToBigInteger(startIp);
133+
var uintEnd = ToBigInteger(endIp);
134+
135+
if (uintEnd <= uintStart)
136+
{
137+
throw new OverflowException("IPNetwork overflow");
138+
}
139+
InternalParseRange(true, startIp, endIp, out IEnumerable<IPNetwork2> networks);
133140
return networks;
134141
}
135142

src/TestProject/IPAddressTest.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
namespace TestProject;
22

33
/// <summary>
4-
/// Test IPAddress Behaviour on MacOS
4+
/// Test IPAddress Behaviour on MacOS
55
/// </summary>
66
[TestClass]
77
public class IPAddressTest
88
{
99
/// <summary>
10-
/// Mixed IPv6 / IPvç notation
11-
/// Why This Happens
12-
/// .NET automatically uses mixed notation for IPv6 addresses when:
13-
/// The first 96 bits are zero (IPv4-compatible)
14-
/// The first 80 bits are zero and bits 81-96 are either all zeros or all ones (IPv4-mapped)
15-
/// The pattern suggests an embedded IPv4 address
10+
/// Mixed IPv6 / IPvç notation
11+
/// Why This Happens
12+
/// .NET automatically uses mixed notation for IPv6 addresses when:
13+
/// The first 96 bits are zero (IPv4-compatible)
14+
/// The first 80 bits are zero and bits 81-96 are either all zeros or all ones (IPv4-mapped)
15+
/// The pattern suggests an embedded IPv4 address
1616
/// Your bytes ::0.1.0.0 are being interpreted as an IPv4-compatible IPv6 address.
1717
/// </summary>
1818
[TestMethod]

src/TestProject/IPNetworkTest/IPNetworkOperatorTests.cs

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace TestProject.IPNetworkTest;
66

77
/// <summary>
8-
/// Tests with operators.
8+
/// Tests with operators.
99
/// </summary>
1010
[TestClass]
1111
public class IPNetworkOperatorTests
@@ -23,7 +23,7 @@ public void TestOperatorGreater1()
2323

2424
Assert.IsFalse(greater, "greater");
2525
}
26-
26+
2727
/// <summary>
2828
/// Tests Operator functionality with Operator Greater.
2929
/// </summary>
@@ -37,7 +37,7 @@ public void TestOperatorGreater2()
3737

3838
Assert.IsTrue(greater, "greater");
3939
}
40-
40+
4141
/// <summary>
4242
/// Tests Operator functionality with Operator Greater.
4343
/// </summary>
@@ -51,8 +51,8 @@ public void TestOperatorGreater3()
5151

5252
Assert.IsFalse(greater, "greater");
5353
}
54-
55-
54+
55+
5656
/// <summary>
5757
/// Tests Operator functionality with Operator Greater.
5858
/// </summary>
@@ -80,7 +80,7 @@ public void TestOperatorGreaterOrEqual1()
8080

8181
Assert.IsFalse(greater, "greater");
8282
}
83-
83+
8484
/// <summary>
8585
/// Tests Operator functionality with Operator Greater.
8686
/// </summary>
@@ -94,7 +94,7 @@ public void TestOperatorGreaterOrEqual2()
9494

9595
Assert.IsTrue(greater, "greater");
9696
}
97-
97+
9898
/// <summary>
9999
/// Tests Operator functionality with Operator Greater.
100100
/// </summary>
@@ -108,9 +108,9 @@ public void TestOperatorGreaterOrEqual3()
108108

109109
Assert.IsTrue(greater, "greater");
110110
}
111-
111+
112112
/// <summary>
113-
/// Tests Operator functionality with Operator Greater.
113+
/// Tests Operator functionality with Operator Greater.
114114
/// </summary>
115115
[TestMethod]
116116
public void TestOperatorGreaterOrEqual4()
@@ -122,9 +122,9 @@ public void TestOperatorGreaterOrEqual4()
122122

123123
Assert.IsFalse(greater, "greater");
124124
}
125-
125+
126126
/// <summary>
127-
/// Tests Operator functionality with Operator Greater.
127+
/// Tests Operator functionality with Operator Greater.
128128
/// </summary>
129129
[TestMethod]
130130
public void TestOperatorGreaterOrEqual5()
@@ -166,7 +166,7 @@ public void TestOperatorLower2()
166166
}
167167

168168
/// <summary>
169-
/// Tests Operator functionality with Operator Lower.
169+
/// Tests Operator functionality with Operator Lower.
170170
/// </summary>
171171
[TestMethod]
172172
public void TestOperatorLower3()
@@ -208,7 +208,7 @@ public void TestOperatorLowerOrEqual2()
208208
}
209209

210210
/// <summary>
211-
/// Tests Operator functionality with Operator Lower.
211+
/// Tests Operator functionality with Operator Lower.
212212
/// </summary>
213213
[TestMethod]
214214
public void TestOperatorLowerOrEqual3()
@@ -277,9 +277,9 @@ public void TestOperatorEqual2()
277277

278278
Assert.IsTrue(eq, "eq");
279279
}
280-
280+
281281
/// <summary>
282-
/// Tests Operator functionality with Operator -.
282+
/// Tests Operator functionality with Operator -.
283283
/// </summary>
284284
[TestMethod]
285285
[DataRow("10.0.0.1/32", "10.0.0.1/32", 0)]
@@ -297,14 +297,14 @@ public void TestOperatorSubtract(string left, string right, int count)
297297
var ipn1 = IPNetwork2.Parse(left);
298298
var ipn2 = IPNetwork2.Parse(right);
299299

300-
var result = ipn1 - ipn2;
300+
List<IPNetwork2> result = ipn1 - ipn2;
301301

302302
Assert.HasCount(count, result, "subtract");
303303
}
304-
305-
304+
305+
306306
/// <summary>
307-
/// Tests Operator functionality with Operator -.
307+
/// Tests Operator functionality with Operator -.
308308
/// </summary>
309309
[TestMethod]
310310
[DataRow("10.0.0.0/32", "10.0.0.1/32", 1)]
@@ -327,17 +327,19 @@ public void TestOperatorAdd(string left, string right, int count)
327327
var ipn1 = IPNetwork2.Parse(left);
328328
var ipn2 = IPNetwork2.Parse(right);
329329

330-
var result = ipn1 + ipn2;
330+
List<IPNetwork2> result = ipn1 + ipn2;
331331

332332
Assert.HasCount(count, result, "add");
333333
}
334-
334+
335335
/// <summary>
336-
/// Tests Operator functionality with Operator +.
336+
/// Tests Operator functionality with Operator +.
337337
/// </summary>
338338
[TestMethod]
339339
[DataRow("10.0.0.0/32", 1, "10.0.0.0/31")]
340+
[DataRow("10.0.0.0/32", 2, "10.0.0.0/31, 10.0.0.2/32")]
340341
[DataRow("10.0.0.0/32", 3, "10.0.0.0/30")]
342+
[DataRow("10.0.0.0/32", 4, "10.0.0.0/30, 10.0.0.4/32")]
341343
[DataRow("10.0.0.0/32", 7, "10.0.0.0/29")]
342344
[DataRow("10.0.0.0/32", 15, "10.0.0.0/28")]
343345
[DataRow("10.0.0.0/32", 31, "10.0.0.0/27")]
@@ -350,23 +352,34 @@ public void TestOperatorAdd(string left, string right, int count)
350352
[DataRow("10.0.0.0/32", 4095, "10.0.0.0/20")]
351353
[DataRow("10.0.0.0/32", -1, "")]
352354
[DataRow("10.0.0.0/32", -10, "")]
353-
[DataRow("10.0.0.0/32", 2, "10.0.0.0/31, 10.0.0.2/32")]
354355
[DataRow("::/128", 1, "::/127")]
355356
[DataRow("::/128", 3, "::/126")]
356357
[DataRow("::f/128", 1, "::f/128, ::10/128")]
357358
[DataRow("1::ffff/128", 1, "1::ffff/128, 1::1:0/128")]
358359
public void TestOperatorAdd2(string left, int right, string expected)
359360
{
360361
var ipn1 = IPNetwork2.Parse(left);
361-
var result = ipn1 + right;
362+
IEnumerable<IPNetwork2> result = ipn1 + right;
362363
string sresult = string.Join(", ", result);
363364

364365
Assert.AreEqual(expected, sresult);
365366
}
366-
367-
367+
368+
/// <summary>
369+
/// Tests Operator functionality with Operator +.
370+
/// </summary>
371+
[TestMethod]
372+
[DataRow("0.0.0.0/0", 1, "0.0.0.0/32")]
373+
[DataRow("255.255.255.255/32", 1, "10.0.0.0/31")]
374+
public void TestOperatorAddOverflow(string left, int right, string expected)
375+
{
376+
var ipn1 = IPNetwork2.Parse(left);
377+
Assert.ThrowsExactly<OverflowException>(() => ipn1 + right);
378+
}
379+
380+
368381
/// <summary>
369-
/// Tests Operator functionality with Operator -.
382+
/// Tests Operator functionality with Operator -.
370383
/// </summary>
371384
[TestMethod]
372385
[DataRow("10.0.0.0/32", 1, "")]
@@ -385,7 +398,7 @@ public void TestOperatorAdd2(string left, int right, string expected)
385398
public void TestOperatorsubtract2(string left, int right, string expected)
386399
{
387400
var ipn1 = IPNetwork2.Parse(left);
388-
var result = ipn1 - right;
401+
IEnumerable<IPNetwork2> result = ipn1 - right;
389402
string sresult = string.Join(", ", result);
390403

391404
Assert.AreEqual(expected, sresult);

0 commit comments

Comments
 (0)