Skip to content

Commit ba0929d

Browse files
committed
Fix edge cases
1 parent 2fd8bc9 commit ba0929d

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

src/System.Net.IPNetwork/IPNetwork2Operators.cs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ public sealed partial class IPNetwork2
117117
/// <returns>Adds the specified number of IP addresses to the network range.</returns>
118118
public static IEnumerable<IPNetwork2> operator +(IPNetwork2 left, int add)
119119
{
120+
if (add < 0)
121+
{
122+
return left - (add * -1);
123+
}
124+
if (add == 0)
125+
{
126+
return new[] { left };
127+
}
120128
var start = ToBigInteger(left.First);
121129
var last = ToBigInteger(left.Last);
122130
var end = last+ add;
@@ -148,6 +156,27 @@ public sealed partial class IPNetwork2
148156
/// <returns>Try to supernet two consecutive cidr equal subnet into a single one, otherwise return both netowkrs.</returns>
149157
public static IEnumerable<IPNetwork2> operator -(IPNetwork2 left, int subtract)
150158
{
151-
return left + (subtract * -1);
159+
if (subtract < 0)
160+
{
161+
return left + (subtract * -1);
162+
}
163+
if (subtract == 0)
164+
{
165+
return new[] { left };
166+
}
167+
var start = ToBigInteger(left.First);
168+
var last = ToBigInteger(left.Last);
169+
var end = last- subtract;
170+
171+
if (end < start)
172+
{
173+
return [];
174+
}
175+
176+
var startIp = ToIPAddress(start, left.AddressFamily);
177+
var endIp = ToIPAddress(end, left.AddressFamily);
178+
179+
InternalParseRange(true, startIp, endIp, out IEnumerable<IPNetwork2> networks);
180+
return networks;
152181
}
153182
}

src/TestProject/IPNetworkTest/IPNetworkOperatorTests.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ public void TestOperatorAdd(string left, string right, int count)
336336
/// Tests Operator functionality with Operator +.
337337
/// </summary>
338338
[TestMethod]
339+
[DataRow("10.0.0.0/32", 0, "10.0.0.0/32")]
339340
[DataRow("10.0.0.0/32", 1, "10.0.0.0/31")]
340341
[DataRow("10.0.0.0/32", 2, "10.0.0.0/31, 10.0.0.2/32")]
341342
[DataRow("10.0.0.0/32", 3, "10.0.0.0/30")]
@@ -377,12 +378,12 @@ public void TestOperatorAddOverflow(string left, int right, string expected)
377378
Assert.ThrowsExactly<OverflowException>(() => ipn1 + right);
378379
}
379380

380-
381381
/// <summary>
382382
/// Tests Operator functionality with Operator -.
383383
/// </summary>
384384
[TestMethod]
385385
[DataRow("10.0.0.0/32", 1, "")]
386+
[DataRow("255.255.255.255/32", 1, "")]
386387
[DataRow("10.0.0.0/32", 3, "")]
387388
[DataRow("10.0.0.0/32", 7, "")]
388389
[DataRow("10.0.0.0/32", 15, "")]
@@ -403,4 +404,20 @@ public void TestOperatorsubtract2(string left, int right, string expected)
403404

404405
Assert.AreEqual(expected, sresult);
405406
}
407+
408+
/// <summary>
409+
/// Tests Operator functionality with Operator -.
410+
/// </summary>
411+
[TestMethod]
412+
[DataRow("0.0.0.0/0", -1)]
413+
[DataRow("255.255.255.255/32", -1)]
414+
public void TestOperatorsubtractOverflow(string left, int right)
415+
{
416+
var ipn1 = IPNetwork2.Parse(left);
417+
Assert.ThrowsExactly<OverflowException>(() =>
418+
{
419+
var result = ipn1 - right;
420+
Assert.AreEqual("32", result.ToString());
421+
});
422+
}
406423
}

0 commit comments

Comments
 (0)