diff --git a/src/System.Management.Automation/engine/MergedCommandParameterMetadata.cs b/src/System.Management.Automation/engine/MergedCommandParameterMetadata.cs
index f2d20c68ec..d2b972a118 100644
--- a/src/System.Management.Automation/engine/MergedCommandParameterMetadata.cs
+++ b/src/System.Management.Automation/engine/MergedCommandParameterMetadata.cs
@@ -163,6 +163,13 @@ namespace System.Management.Automation
///
private uint _nextAvailableParameterSetIndex;
+ ///
+ /// The maximum number of parameter sets allowed. Limit is set by the use
+ /// of a uint bitmask to store which parameter sets a parameter is included in.
+ /// See .
+ ///
+ private const uint MaxParameterSetCount = 32;
+
///
/// Gets the number of parameter sets that were declared for the command.
///
@@ -228,7 +235,7 @@ namespace System.Management.Automation
// A parameter set name should only be added once
if (index == -1)
{
- if (_nextAvailableParameterSetIndex == uint.MaxValue)
+ if (_nextAvailableParameterSetIndex >= MaxParameterSetCount)
{
// Don't let the parameter set index overflow
ParsingMetadataException parsingException =
diff --git a/test/powershell/Language/Scripting/ParameterBinding.Tests.ps1 b/test/powershell/Language/Scripting/ParameterBinding.Tests.ps1
index 95d62071ad..8177adab21 100644
--- a/test/powershell/Language/Scripting/ParameterBinding.Tests.ps1
+++ b/test/powershell/Language/Scripting/ParameterBinding.Tests.ps1
@@ -170,6 +170,19 @@ Describe "Tests for parameter binding" -Tags "CI" {
( get-foo -b b a c d ) -join ',' | Should -BeExactly 'a,c,d'
}
+ It 'Too many parameter sets defined' {
+ $scriptblock = {
+ param($numSets=1)
+ $parameters = (1..($numSets) | ForEach-Object { "[Parameter(parametersetname='set$_')]`$a$_" }) -join ', '
+ $body = "param($parameters) 'working'"
+ $sb = [scriptblock]::Create($body)
+ & $sb -a1 123
+ }
+
+ & $scriptblock -numSets 32 | Should -Be 'working'
+ { & $scriptblock -numSets 33 } | Should -Throw -ErrorId 'ParsingTooManyParameterSets'
+ }
+
It 'Default parameter set with value from remaining arguments case 1' {
function get-foo
{