From 0cc26d94623228be9b18ef0bcc9056e68f4fda12 Mon Sep 17 00:00:00 2001 From: Staffan Gustafsson Date: Thu, 14 May 2020 10:04:54 +0200 Subject: [PATCH 1/4] PSSnapinQualifiedCommandName may be null if useAbbreviationExpansion is true. This will result in NRE if we don't check for it. --- .../engine/CommandSearcher.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/System.Management.Automation/engine/CommandSearcher.cs b/src/System.Management.Automation/engine/CommandSearcher.cs index 093a2fbe993..85d3cd5c738 100644 --- a/src/System.Management.Automation/engine/CommandSearcher.cs +++ b/src/System.Management.Automation/engine/CommandSearcher.cs @@ -1010,10 +1010,10 @@ private CmdletInfo GetNextCmdlet() return null; } - WildcardPattern cmdletMatcher = - WildcardPattern.Get( - PSSnapinQualifiedCommandName.ShortName, - WildcardOptions.IgnoreCase); + var cmdletShortName = PSSnapinQualifiedCommandName?.ShortName; + WildcardPattern cmdletMatcher = cmdletShortName != null + ? WildcardPattern.Get(cmdletShortName, WildcardOptions.IgnoreCase) + : null; SessionStateInternal ss = _context.EngineSessionState; @@ -1021,13 +1021,12 @@ private CmdletInfo GetNextCmdlet() { foreach (CmdletInfo cmdlet in cmdletList) { - if (cmdletMatcher.IsMatch(cmdlet.Name) || + if (cmdletShortName != null && + cmdletMatcher.IsMatch(cmdlet.Name) || (_commandResolutionOptions.HasFlag(SearchResolutionOptions.FuzzyMatch) && - FuzzyMatcher.IsFuzzyMatch(cmdlet.Name, _commandName))) + FuzzyMatcher.IsFuzzyMatch(cmdlet.Name, _commandName))) { - if (string.IsNullOrEmpty(PSSnapinQualifiedCommandName.PSSnapInName) || - (PSSnapinQualifiedCommandName.PSSnapInName.Equals( - cmdlet.ModuleName, StringComparison.OrdinalIgnoreCase))) + if (PSSnapinQualifiedCommandName?.PSSnapInName?.Equals(cmdlet.ModuleName, StringComparison.OrdinalIgnoreCase) == true) { // If PSSnapin is specified, make sure they match matchingCmdletInfo.Add(cmdlet); From fe84eaa6875f0db15e2c683ea93e49be6f777ad5 Mon Sep 17 00:00:00 2001 From: Staffan Gustafsson Date: Tue, 19 May 2020 07:55:39 +0200 Subject: [PATCH 2/4] Fix null-handling for modulename --- src/System.Management.Automation/engine/CommandSearcher.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/System.Management.Automation/engine/CommandSearcher.cs b/src/System.Management.Automation/engine/CommandSearcher.cs index 85d3cd5c738..fe52b847907 100644 --- a/src/System.Management.Automation/engine/CommandSearcher.cs +++ b/src/System.Management.Automation/engine/CommandSearcher.cs @@ -1026,7 +1026,8 @@ private CmdletInfo GetNextCmdlet() (_commandResolutionOptions.HasFlag(SearchResolutionOptions.FuzzyMatch) && FuzzyMatcher.IsFuzzyMatch(cmdlet.Name, _commandName))) { - if (PSSnapinQualifiedCommandName?.PSSnapInName?.Equals(cmdlet.ModuleName, StringComparison.OrdinalIgnoreCase) == true) + string moduleName = PSSnapinQualifiedCommandName?.PSSnapInName; + if (moduleName == null || moduleName.Equals(cmdlet.ModuleName, StringComparison.OrdinalIgnoreCase)) { // If PSSnapin is specified, make sure they match matchingCmdletInfo.Add(cmdlet); From d7d456458212fd5a025baee81c5c2b5e7fa909cb Mon Sep 17 00:00:00 2001 From: Staffan Gustafsson Date: Tue, 19 May 2020 09:13:30 +0200 Subject: [PATCH 3/4] Moving moduleName variable out of loop --- src/System.Management.Automation/engine/CommandSearcher.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/System.Management.Automation/engine/CommandSearcher.cs b/src/System.Management.Automation/engine/CommandSearcher.cs index fe52b847907..b75f125f76a 100644 --- a/src/System.Management.Automation/engine/CommandSearcher.cs +++ b/src/System.Management.Automation/engine/CommandSearcher.cs @@ -1010,6 +1010,8 @@ private CmdletInfo GetNextCmdlet() return null; } + string moduleName = PSSnapinQualifiedCommandName?.PSSnapInName; + var cmdletShortName = PSSnapinQualifiedCommandName?.ShortName; WildcardPattern cmdletMatcher = cmdletShortName != null ? WildcardPattern.Get(cmdletShortName, WildcardOptions.IgnoreCase) @@ -1026,8 +1028,7 @@ private CmdletInfo GetNextCmdlet() (_commandResolutionOptions.HasFlag(SearchResolutionOptions.FuzzyMatch) && FuzzyMatcher.IsFuzzyMatch(cmdlet.Name, _commandName))) { - string moduleName = PSSnapinQualifiedCommandName?.PSSnapInName; - if (moduleName == null || moduleName.Equals(cmdlet.ModuleName, StringComparison.OrdinalIgnoreCase)) + if (string.IsNullOrEmpty(moduleName) || moduleName.Equals(cmdlet.ModuleName, StringComparison.OrdinalIgnoreCase)) { // If PSSnapin is specified, make sure they match matchingCmdletInfo.Add(cmdlet); From aac52c9a0f6269b55963f90417e1f1485eda876c Mon Sep 17 00:00:00 2001 From: Staffan Gustafsson Date: Tue, 19 May 2020 13:25:04 +0200 Subject: [PATCH 4/4] test nullness on cmdletMatcher instead of cmdletShortName. Functionallity wise equivalent but easier to read. --- src/System.Management.Automation/engine/CommandSearcher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System.Management.Automation/engine/CommandSearcher.cs b/src/System.Management.Automation/engine/CommandSearcher.cs index b75f125f76a..aafdadf924d 100644 --- a/src/System.Management.Automation/engine/CommandSearcher.cs +++ b/src/System.Management.Automation/engine/CommandSearcher.cs @@ -1023,7 +1023,7 @@ private CmdletInfo GetNextCmdlet() { foreach (CmdletInfo cmdlet in cmdletList) { - if (cmdletShortName != null && + if (cmdletMatcher != null && cmdletMatcher.IsMatch(cmdlet.Name) || (_commandResolutionOptions.HasFlag(SearchResolutionOptions.FuzzyMatch) && FuzzyMatcher.IsFuzzyMatch(cmdlet.Name, _commandName)))