Skip to content

Commit

Permalink
Filter invalid IPs on external interface matching (jellyfin#11766)
Browse files Browse the repository at this point in the history
  • Loading branch information
gnattu committed May 25, 2024
1 parent ef98589 commit 2eece01
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
5 changes: 5 additions & 0 deletions MediaBrowser.Common/Net/NetworkConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@ public static class NetworkConstants
/// </summary>
public static readonly IPNetwork IPv4RFC1918PrivateClassC = new IPNetwork(IPAddress.Parse("192.168.0.0"), 16);

/// <summary>
/// IPv4 Link-Local as defined in RFC 3927.
/// </summary>
public static readonly IPNetwork IPv4RFC3927LinkLocal = new IPNetwork(IPAddress.Parse("169.254.0.0"), 16);

/// <summary>
/// IPv6 loopback as defined in RFC 4291.
/// </summary>
Expand Down
17 changes: 16 additions & 1 deletion src/Jellyfin.Networking/Manager/NetworkManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -903,6 +903,17 @@ public bool IsInLocalNetwork(string address)
return false;
}

/// <summary>
/// Get if the IPAddress is Link-local.
/// </summary>
/// <param name="address">The IP Address.</param>
/// <returns>Bool indicates if the address is link-local.</returns>
public bool IsLinkLocalAddress(IPAddress address)
{
ArgumentNullException.ThrowIfNull(address);
return NetworkConstants.IPv4RFC3927LinkLocal.Contains(address) || address.IsIPv6LinkLocal;
}

/// <inheritdoc/>
public bool IsInLocalNetwork(IPAddress address)
{
Expand Down Expand Up @@ -1084,7 +1095,11 @@ private bool MatchesBindInterface(IPAddress source, bool isInExternalSubnet, out
private bool MatchesExternalInterface(IPAddress source, out string result)
{
// Get the first external interface address that isn't a loopback.
var extResult = _interfaces.Where(p => !IsInLocalNetwork(p.Address)).OrderBy(x => x.Index).ToArray();
var extResult = _interfaces
.Where(p => !IsInLocalNetwork(p.Address))
.Where(p => p.Address.AddressFamily.Equals(source.AddressFamily))
.Where(p => !IsLinkLocalAddress(p.Address))
.OrderBy(x => x.Index).ToArray();

// No external interface found
if (extResult.Length == 0)
Expand Down

0 comments on commit 2eece01

Please sign in to comment.