From c1b1442d0f08a1d271b1231ec71dc1b1a9be6d7b Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 25 Mar 2026 12:34:09 +0300 Subject: [PATCH] Fix stdout/stderr deadlock in CmdHelper.RunCmdAndGetOutput Read stdout and stderr concurrently to prevent pipe buffer deadlock. The sequential ReadToEnd() calls caused a hang when child processes (e.g. dotnet build) produced enough stderr output to fill the OS pipe buffer (~4KB on Windows), since the parent blocked on stdout while the child blocked on stderr. Made-with: Cursor --- .../Volo/Abp/Cli/Utils/CmdHelper.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs index 5ccd9034cd..515fd5dc25 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs @@ -1,7 +1,8 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; +using System.Threading.Tasks; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -137,14 +138,13 @@ public class CmdHelper : ICmdHelper, ITransientDependency process.Start(); - using (var standardOutput = process.StandardOutput) - { - using (var standardError = process.StandardError) - { - output = standardOutput.ReadToEnd(); - output += standardError.ReadToEnd(); - } - } + var outputTask = process.StandardOutput.ReadToEndAsync(); + var errorTask = process.StandardError.ReadToEndAsync(); + + output = Task.WhenAll(outputTask, errorTask).GetAwaiter().GetResult() + is { Length: 2 } results + ? results[0] + results[1] + : string.Empty; process.WaitForExit();