From 7b33cfe8470e100e4de3942eecbb57549e293747 Mon Sep 17 00:00:00 2001 From: "Joel Sallow (/u/ta11ow)" <32407840+vexx32@users.noreply.github.com> Date: Thu, 19 Dec 2019 11:51:34 -0600 Subject: [PATCH] Test-Connection: Fallback to hop IP Address on `-Traceroute` without `-ResolveDestination` (#11335) --- .../management/TestConnectionCommand.cs | 56 ++++++++++--------- .../Test-Connection.Tests.ps1 | 6 ++ 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/TestConnectionCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/TestConnectionCommand.cs index 9a213b7a86..ab9c299b71 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/TestConnectionCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/TestConnectionCommand.cs @@ -285,7 +285,7 @@ namespace Microsoft.PowerShell.Commands private void ProcessConnectionByTCPPort(string targetNameOrAddress) { - if (!InitProcessPing(targetNameOrAddress, out _, out IPAddress? targetAddress)) + if (!TryResolveNameOrAddress(targetNameOrAddress, out _, out IPAddress? targetAddress)) { return; } @@ -336,7 +336,7 @@ namespace Microsoft.PowerShell.Commands { byte[] buffer = GetSendBuffer(BufferSize); - if (!InitProcessPing(targetNameOrAddress, out string resolvedTargetName, out IPAddress? targetAddress)) + if (!TryResolveNameOrAddress(targetNameOrAddress, out string resolvedTargetName, out IPAddress? targetAddress)) { return; } @@ -351,8 +351,6 @@ namespace Microsoft.PowerShell.Commands IPAddress hopAddress; do { - // Clear the stored router name for every hop - string routerName = string.Empty; pingOptions.Ttl = currentHop; #if !UNIX @@ -383,25 +381,25 @@ namespace Microsoft.PowerShell.Commands #endif var hopAddressString = discoveryReply.Address.ToString(); + string routerName = hopAddressString; + try + { + if (!TryResolveNameOrAddress(hopAddressString, out routerName, out _)) + { + routerName = hopAddressString; + } + } + catch + { + // Swallow hostname resolve exceptions and continue with traceroute + } + // In traceroutes we don't use 'Count' parameter. // If we change 'DefaultTraceRoutePingCount' we should change 'ConsoleTraceRouteReply' resource string. for (uint i = 1; i <= DefaultTraceRoutePingCount; i++) { try { -#if !UNIX - if (ResolveDestination.IsPresent && routerName == string.Empty) - { - try - { - InitProcessPing(hopAddressString, out routerName, out _); - } - catch - { - // Swallow host resolve exceptions and just use the IP address. - } - } -#endif reply = SendCancellablePing(hopAddress, timeout, buffer, pingOptions, timer); if (!Quiet.IsPresent) @@ -475,7 +473,7 @@ namespace Microsoft.PowerShell.Commands private void ProcessMTUSize(string targetNameOrAddress) { PingReply? reply, replyResult = null; - if (!InitProcessPing(targetNameOrAddress, out string resolvedTargetName, out IPAddress? targetAddress)) + if (!TryResolveNameOrAddress(targetNameOrAddress, out string resolvedTargetName, out IPAddress? targetAddress)) { return; } @@ -578,7 +576,7 @@ namespace Microsoft.PowerShell.Commands private void ProcessPing(string targetNameOrAddress) { - if (!InitProcessPing(targetNameOrAddress, out string resolvedTargetName, out IPAddress? targetAddress)) + if (!TryResolveNameOrAddress(targetNameOrAddress, out string resolvedTargetName, out IPAddress? targetAddress)) { return; } @@ -643,7 +641,7 @@ namespace Microsoft.PowerShell.Commands #endregion PingTest - private bool InitProcessPing( + private bool TryResolveNameOrAddress( string targetNameOrAddress, out string resolvedTargetName, [NotNullWhen(true)] @@ -1007,6 +1005,16 @@ namespace Microsoft.PowerShell.Commands Source = source; Target = destination; TargetAddress = destinationAddress; + + if (_status.Address == IPAddress.Any + || _status.Address == IPAddress.IPv6Any) + { + Hostname = null; + } + else + { + Hostname = _status.Destination; + } } private readonly PingStatus _status; @@ -1020,13 +1028,7 @@ namespace Microsoft.PowerShell.Commands /// Gets the hostname of the current hop point. /// /// - public string? Hostname - { - get => _status.Destination != IPAddress.Any.ToString() - && _status.Destination != IPAddress.IPv6Any.ToString() - ? _status.Destination - : null; - } + public string? Hostname { get; } /// /// Gets the sequence number of the ping in the sequence of pings to the hop point. diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Test-Connection.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Test-Connection.Tests.ps1 index d3ec629f80..b7e90b9383 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Test-Connection.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Test-Connection.Tests.ps1 @@ -275,6 +275,12 @@ Describe "Test-Connection" -tags "CI" { It 'returns false without error if MaxHops is exceeded during -Traceroute -Quiet' { Test-Connection 8.8.8.8 -Traceroute -MaxHops 2 -Quiet | Should -BeFalse } + + It 'has a non-null value for Destination for reachable hosts' { + $results = Test-Connection 127.0.0.1 -Traceroute + + $results.Hostname | Should -Not -BeNullOrEmpty + } } }