Add custom 'Selected.*' type to PSCustomObject in Select-Object only once (#11548)

Before the fix Select-Object without parameters added custom 'Selected.' type to PSCustomObject even if this type was already present in TypeNames that was a memory leak in the edge case.
The cause of the problem was that Select-Object without parameters did not create a new object but forwarded the original.
The fix is to add custom 'Selected.' type only if object is original and it has not already custom 'Selected.*' type.
This commit is contained in:
Ilya
2020-01-25 14:10:39 +05:00
committed by GitHub
parent 0b4c43bc11
commit eb47c22339
2 changed files with 32 additions and 4 deletions
@@ -1,5 +1,6 @@
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
. (Join-Path -Path $PSScriptRoot -ChildPath Test-Mocks.ps1)
Add-TestDynamicType
@@ -349,4 +350,25 @@ Describe "Select-Object with Property = '*'" -Tags "CI" {
$p = Get-Process -Id $PID | Select-Object -Property Process* -ExcludeProperty ProcessorAffinity -ExpandProperty Modules
$p[0].psobject.Properties.Item("ProcessorAffinity") | Should -BeNullOrEmpty
}
It "Select-Object add 'Selected.*' type only once" {
$obj = [PSCustomObject]@{ Name = 1 }
$obj.psobject.TypeNames.Count | Should -Be 2
$obj.psobject.TypeNames | Should -Not -BeLike "Selected*"
$obj = $obj | Select-Object
$obj.psobject.TypeNames.Count | Should -Be 3
$obj.psobject.TypeNames[0] | Should -BeLike "Selected*"
$obj.psobject.TypeNames[1] | Should -Not -BeLike "Selected*"
$obj.psobject.TypeNames[2] | Should -Not -BeLike "Selected*"
$obj = $obj | Select-Object
$obj.psobject.TypeNames.Count | Should -Be 3
$obj.psobject.TypeNames[0] | Should -BeLike "Selected*"
$obj.psobject.TypeNames[1] | Should -Not -BeLike "Selected*"
$obj.psobject.TypeNames[2] | Should -Not -BeLike "Selected*"
}
}