From 25c7c69886eca81272421ece8aa3d27b44c2d62e Mon Sep 17 00:00:00 2001 From: Miheichev Aleksandr Sergeevich Date: Wed, 13 May 2026 15:41:52 +0300 Subject: [PATCH] fix: tighten Unix platform handling Adds Linux and macOS platform guards so the analyzer can narrow calls through Utils.IsLinux() and Utils.IsMacOS(). Marks the Linux/macOS autostart and system proxy helpers with explicit platform attributes. Updates Utils.GetSystemHosts() to read /etc/hosts on Linux and macOS while keeping the existing Windows hosts and hosts.ics merge behavior. --- v2rayN/ServiceLib/Common/Utils.cs | 24 ++++++++++++++----- .../ServiceLib/Handler/AutoStartupHandler.cs | 7 ++++++ .../Handler/SysProxy/ProxySettingLinux.cs | 1 + .../Handler/SysProxy/ProxySettingOSX.cs | 1 + 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/v2rayN/ServiceLib/Common/Utils.cs b/v2rayN/ServiceLib/Common/Utils.cs index 2824bd83..9c2bd4af 100644 --- a/v2rayN/ServiceLib/Common/Utils.cs +++ b/v2rayN/ServiceLib/Common/Utils.cs @@ -864,15 +864,25 @@ public class Utils public static Dictionary GetSystemHosts() { - var hosts = GetSystemHosts(@"C:\Windows\System32\drivers\etc\hosts"); - var hostsIcs = GetSystemHosts(@"C:\Windows\System32\drivers\etc\hosts.ics"); - - foreach (var (key, value) in hostsIcs) + if (IsWindows()) { - hosts[key] = value; + var hosts = GetSystemHosts(@"C:\Windows\System32\drivers\etc\hosts"); + var hostsIcs = GetSystemHosts(@"C:\Windows\System32\drivers\etc\hosts.ics"); + + foreach (var (key, value) in hostsIcs) + { + hosts[key] = value; + } + + return hosts; } - return hosts; + if (IsLinux() || IsMacOS()) + { + return GetSystemHosts("/etc/hosts"); + } + + return new Dictionary(); } public static async Task GetCliWrapOutput(string filePath, string? arg) @@ -1117,8 +1127,10 @@ public class Utils [SupportedOSPlatformGuard("windows")] public static bool IsWindows() => OperatingSystem.IsWindows(); + [SupportedOSPlatformGuard("linux")] public static bool IsLinux() => OperatingSystem.IsLinux(); + [SupportedOSPlatformGuard("macos")] public static bool IsMacOS() => OperatingSystem.IsMacOS(); [UnsupportedOSPlatformGuard("windows")] diff --git a/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs b/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs index e40af63f..fd7d7fc9 100644 --- a/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs +++ b/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs @@ -127,6 +127,7 @@ public static class AutoStartupHandler #region Linux + [SupportedOSPlatform("linux")] private static async Task ClearTaskLinux() { try @@ -140,6 +141,7 @@ public static class AutoStartupHandler await Task.CompletedTask; } + [SupportedOSPlatform("linux")] private static async Task SetTaskLinux() { try @@ -160,6 +162,7 @@ public static class AutoStartupHandler } } + [SupportedOSPlatform("linux")] private static string GetHomePathLinux() { var homePath = Path.Combine(Utils.GetHomePath(), ".config", "autostart", $"{Global.AppName}.desktop"); @@ -171,6 +174,7 @@ public static class AutoStartupHandler #region macOS + [SupportedOSPlatform("macos")] private static async Task ClearTaskOSX() { try @@ -190,6 +194,7 @@ public static class AutoStartupHandler } } + [SupportedOSPlatform("macos")] private static async Task SetTaskOSX() { try @@ -207,6 +212,7 @@ public static class AutoStartupHandler } } + [SupportedOSPlatform("macos")] private static string GetLaunchAgentPathMacOS() { var homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); @@ -215,6 +221,7 @@ public static class AutoStartupHandler return launchAgentPath; } + [SupportedOSPlatform("macos")] private static string GenerateLaunchAgentPlist() { var exePath = Utils.GetExePath(); diff --git a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs index 4929c72e..14d61d9c 100644 --- a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs +++ b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs @@ -1,5 +1,6 @@ namespace ServiceLib.Handler.SysProxy; +[SupportedOSPlatform("linux")] public static class ProxySettingLinux { private static readonly string _proxySetFileName = $"{Global.ProxySetLinuxShellFileName.Replace(Global.NamespaceSample, "")}.sh"; diff --git a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs index 56fbe24d..b598a06c 100644 --- a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs +++ b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs @@ -1,5 +1,6 @@ namespace ServiceLib.Handler.SysProxy; +[SupportedOSPlatform("macos")] public static class ProxySettingOSX { private static readonly string _proxySetFileName = $"{Global.ProxySetOSXShellFileName.Replace(Global.NamespaceSample, "")}.sh";