Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStephen Toub <stoub@microsoft.com>2021-07-14 03:10:24 +0300
committerGitHub <noreply@github.com>2021-07-14 03:10:24 +0300
commitbf0fdf0a78a1411f5abed5d892dcac2ba21899e1 (patch)
tree088bdfca85f75742f9b0556e7f5db4b8d8527059 /src
parentccfe21882e4a2206ce49cd5b32d3eb3cab3e530f (diff)
Fix Task.WhenAny failure mode when passed ICollection of zero tasks (#55580)
Diffstat (limited to 'src')
-rw-r--r--src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs8
-rw-r--r--src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs14
2 files changed, 21 insertions, 1 deletions
diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs
index a64dc008429..89fab991d73 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs
@@ -6305,8 +6305,14 @@ namespace System.Threading.Tasks
return WhenAny(taskArray);
}
+ int count = taskCollection.Count;
+ if (count <= 0)
+ {
+ ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_EmptyTaskList, ExceptionArgument.tasks);
+ }
+
int index = 0;
- taskArray = new Task[taskCollection.Count];
+ taskArray = new Task[count];
foreach (Task task in tasks)
{
if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks);
diff --git a/src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs b/src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs
index e696a38cf92..923875f6e43 100644
--- a/src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs
+++ b/src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs
@@ -189,6 +189,20 @@ namespace TaskCoverage
}
[Fact]
+ public static void Task_WhenAny_NoTasks_Throws()
+ {
+ AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task[0]); });
+ AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task>()); });
+ AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task>()); });
+
+ AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task<int>[0]); });
+ AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task<int>>()); });
+ AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task<int>>()); });
+
+ static IEnumerable<T> EmptyIterator<T>() { yield break; }
+ }
+
+ [Fact]
public static async Task Task_WhenAny_TwoTasks_OnePreCompleted()
{
Task<int> t1 = Task.FromResult(1);