From 15f26a4e4df84b5efeab89f0bea928794c2d1891 Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Tue, 3 Jan 2023 15:53:10 +0100 Subject: [PATCH 1/2] Account for different formats of ping output --- .../src/System/Net/NetworkInformation/Ping.PingUtility.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Net.Ping/src/System/Net/NetworkInformation/Ping.PingUtility.cs b/src/libraries/System.Net.Ping/src/System/Net/NetworkInformation/Ping.PingUtility.cs index 7bdc4120cdb537..eb77d3aa7720c3 100644 --- a/src/libraries/System.Net.Ping/src/System/Net/NetworkInformation/Ping.PingUtility.cs +++ b/src/libraries/System.Net.Ping/src/System/Net/NetworkInformation/Ping.PingUtility.cs @@ -15,6 +15,8 @@ namespace System.Net.NetworkInformation { public partial class Ping { + private static char[] s_ttlExceededAddressSeparators = new[] { ' ', ':' }; + private Process GetPingProcess(IPAddress address, byte[] buffer, int timeout, PingOptions? options) { bool isIpv4 = address.AddressFamily == AddressFamily.InterNetwork; @@ -131,9 +133,11 @@ private static bool TryParseTtlExceeded(string stdout, out PingReply? reply) return false; } - // look for address in "From 172.21.64.1 icmp_seq=1 Time to live exceeded" + // look for address in: + // - "From 172.21.64.1 icmp_seq=1 Time to live exceeded" + // - "From 172.21.64.1: icmp_seq=1 Time to live exceeded" int addressStart = stdout.IndexOf("From ", StringComparison.Ordinal) + 5; - int addressLength = stdout.IndexOf(' ', Math.Max(addressStart, 0)) - addressStart; + int addressLength = stdout.IndexOfAny(s_ttlExceededAddressSeparators, Math.Max(addressStart, 0)) - addressStart; IPAddress? address; if (addressStart < 5 || addressLength <= 0 || !IPAddress.TryParse(stdout.AsSpan(addressStart, addressLength), out address)) { From 4e2689fdc6af51ad7a9ba695076cb271bb3dfc73 Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Wed, 4 Jan 2023 13:59:24 +0100 Subject: [PATCH 2/2] Avoid allocation --- .../src/System/Net/NetworkInformation/Ping.PingUtility.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libraries/System.Net.Ping/src/System/Net/NetworkInformation/Ping.PingUtility.cs b/src/libraries/System.Net.Ping/src/System/Net/NetworkInformation/Ping.PingUtility.cs index eb77d3aa7720c3..23299bccfede0e 100644 --- a/src/libraries/System.Net.Ping/src/System/Net/NetworkInformation/Ping.PingUtility.cs +++ b/src/libraries/System.Net.Ping/src/System/Net/NetworkInformation/Ping.PingUtility.cs @@ -15,8 +15,6 @@ namespace System.Net.NetworkInformation { public partial class Ping { - private static char[] s_ttlExceededAddressSeparators = new[] { ' ', ':' }; - private Process GetPingProcess(IPAddress address, byte[] buffer, int timeout, PingOptions? options) { bool isIpv4 = address.AddressFamily == AddressFamily.InterNetwork; @@ -137,7 +135,7 @@ private static bool TryParseTtlExceeded(string stdout, out PingReply? reply) // - "From 172.21.64.1 icmp_seq=1 Time to live exceeded" // - "From 172.21.64.1: icmp_seq=1 Time to live exceeded" int addressStart = stdout.IndexOf("From ", StringComparison.Ordinal) + 5; - int addressLength = stdout.IndexOfAny(s_ttlExceededAddressSeparators, Math.Max(addressStart, 0)) - addressStart; + int addressLength = stdout.AsSpan(Math.Max(addressStart, 0)).IndexOfAny(' ', ':'); IPAddress? address; if (addressStart < 5 || addressLength <= 0 || !IPAddress.TryParse(stdout.AsSpan(addressStart, addressLength), out address)) {