From 1ce077fd16bb2c0e7b3a9fbd7d957b8bfb0b9604 Mon Sep 17 00:00:00 2001 From: Salman Muin Kayser Chishti Date: Mon, 22 Sep 2025 15:18:41 +0100 Subject: [PATCH] path fix --- src/Runner.Worker/Handlers/ScriptHandler.cs | 4 +- .../L0/Worker/Handlers/ScriptHandlerL0.cs | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/Test/L0/Worker/Handlers/ScriptHandlerL0.cs diff --git a/src/Runner.Worker/Handlers/ScriptHandler.cs b/src/Runner.Worker/Handlers/ScriptHandler.cs index e6fa90a0a..adc127916 100644 --- a/src/Runner.Worker/Handlers/ScriptHandler.cs +++ b/src/Runner.Worker/Handlers/ScriptHandler.cs @@ -249,7 +249,7 @@ namespace GitHub.Runner.Worker.Handlers { // We do not not the full path until we know what shell is being used, so that we can determine the file extension scriptFilePath = Path.Combine(tempDirectory, $"{Guid.NewGuid()}{ScriptHandlerHelpers.GetScriptFileExtension(shellCommand)}"); - resolvedScriptPath = StepHost.ResolvePathForStepHost(ExecutionContext, scriptFilePath).Replace("\"", "\\\""); + resolvedScriptPath = $"\"{StepHost.ResolvePathForStepHost(ExecutionContext, scriptFilePath).Replace("\"", "\\\"")}\""; } else { @@ -260,7 +260,7 @@ namespace GitHub.Runner.Worker.Handlers } scriptFilePath = Inputs["path"]; ArgUtil.NotNullOrEmpty(scriptFilePath, "path"); - resolvedScriptPath = Inputs["path"].Replace("\"", "\\\""); + resolvedScriptPath = $"\"{Inputs["path"].Replace("\"", "\\\"")}\""; } // Format arg string with script path diff --git a/src/Test/L0/Worker/Handlers/ScriptHandlerL0.cs b/src/Test/L0/Worker/Handlers/ScriptHandlerL0.cs new file mode 100644 index 000000000..6273fef9c --- /dev/null +++ b/src/Test/L0/Worker/Handlers/ScriptHandlerL0.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using GitHub.DistributedTask.Pipelines.ContextData; +using GitHub.DistributedTask.WebApi; +using GitHub.Runner.Common; +using GitHub.Runner.Worker; +using GitHub.Runner.Worker.Handlers; +using Moq; +using Xunit; + +namespace GitHub.Runner.Common.Tests.Worker.Handlers +{ + public sealed class ScriptHandlerL0 + { + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void ScriptPath_WithSpaces_ShouldBeQuoted() + { + // Arrange + using (TestHostContext hc = CreateTestContext()) + { + var scriptHandler = new ScriptHandler(); + scriptHandler.Initialize(hc); + + // Create a mock temp directory path with spaces + var tempPathWithSpaces = "/path with spaces/_temp"; + var scriptPathWithSpaces = Path.Combine(tempPathWithSpaces, "test-script.sh"); + + // Test the logic that our fix addresses + var originalPath = scriptPathWithSpaces.Replace("\"", "\\\""); + var quotedPath = $"\"{scriptPathWithSpaces.Replace("\"", "\\\"")}\""; + + // Assert + Assert.False(originalPath.StartsWith("\""), "Original path should not be quoted"); + Assert.True(quotedPath.StartsWith("\"") && quotedPath.EndsWith("\""), "Fixed path should be properly quoted"); + Assert.Contains("path with spaces", quotedPath, StringComparison.Ordinal); + } + } + + private TestHostContext CreateTestContext([CallerMemberName] string testName = "") + { + var hc = new TestHostContext(this, testName); + return hc; + } + } +} \ No newline at end of file