Fix negated IP addresses without subnet mask not being parsed correctly (#13854)

This commit is contained in:
Markus Prettner 2025-04-09 03:21:57 +02:00 committed by GitHub
parent 0bbc6bb31d
commit c152f610ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 6 deletions

View File

@ -198,14 +198,25 @@ public static partial class NetworkUtils
/// <returns><c>True</c> if parsing was successful.</returns> /// <returns><c>True</c> if parsing was successful.</returns>
public static bool TryParseToSubnet(ReadOnlySpan<char> value, [NotNullWhen(true)] out IPNetwork? result, bool negated = false) public static bool TryParseToSubnet(ReadOnlySpan<char> value, [NotNullWhen(true)] out IPNetwork? result, bool negated = false)
{ {
// If multiple IP addresses are in a comma-separated string, the individual addresses may contain leading and/or trailing whitespace
value = value.Trim(); value = value.Trim();
bool isAddressNegated = false;
if (value.StartsWith('!'))
{
isAddressNegated = true;
value = value[1..]; // Remove leading '!' character
}
if (isAddressNegated != negated)
{
result = null;
return false;
}
if (value.Contains('/')) if (value.Contains('/'))
{ {
if (negated && value.StartsWith("!") && IPNetwork.TryParse(value[1..], out result)) if (IPNetwork.TryParse(value, out result))
{
return true;
}
else if (!negated && IPNetwork.TryParse(value, out result))
{ {
return true; return true;
} }

View File

@ -79,7 +79,10 @@ namespace Jellyfin.Networking.Tests
[InlineData("[fe80::7add:12ff:febb:c67b%16]")] [InlineData("[fe80::7add:12ff:febb:c67b%16]")]
[InlineData("fd23:184f:2029:0:3139:7386:67d7:d517/56")] [InlineData("fd23:184f:2029:0:3139:7386:67d7:d517/56")]
public static void TryParseValidIPStringsTrue(string address) public static void TryParseValidIPStringsTrue(string address)
=> Assert.True(NetworkUtils.TryParseToSubnet(address, out _)); {
Assert.True(NetworkUtils.TryParseToSubnet(address, out _));
Assert.True(NetworkUtils.TryParseToSubnet('!' + address, out _, true));
}
/// <summary> /// <summary>
/// Checks invalid IP address formats. /// Checks invalid IP address formats.