Fix #4139 - escape quoted strings for process start
This commit is contained in:
parent
9cc2b7cd2f
commit
ba8e18dac7
3 changed files with 27 additions and 7 deletions
|
@ -185,12 +185,6 @@ namespace Microsoft.DotNet.Cli.Utils
|
||||||
|
|
||||||
internal static bool ShouldSurroundWithQuotes(string argument)
|
internal static bool ShouldSurroundWithQuotes(string argument)
|
||||||
{
|
{
|
||||||
// Don't quote already quoted strings
|
|
||||||
if (IsSurroundedWithQuotes(argument))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only quote if whitespace exists in the string
|
// Only quote if whitespace exists in the string
|
||||||
return ArgumentContainsWhitespace(argument);
|
return ArgumentContainsWhitespace(argument);
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,8 @@ namespace Microsoft.DotNet.Cli.Utils
|
||||||
|
|
||||||
var cmdEscapedArgs = ArgumentEscaper.EscapeAndConcatenateArgArrayForCmdProcessStart(args);
|
var cmdEscapedArgs = ArgumentEscaper.EscapeAndConcatenateArgArrayForCmdProcessStart(args);
|
||||||
|
|
||||||
if (ArgumentEscaper.ShouldSurroundWithQuotes(command))
|
if (!ArgumentEscaper.IsSurroundedWithQuotes(command) // Don't quote already quoted strings
|
||||||
|
&& ArgumentEscaper.ShouldSurroundWithQuotes(command))
|
||||||
{
|
{
|
||||||
command = $"\"{command}\"";
|
command = $"\"{command}\"";
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||||
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||||
|
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.DotNet.Cli.Utils.Tests
|
||||||
|
{
|
||||||
|
public class ArgumentEscaperTests
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
[InlineData(new[] { "one", "two", "three" }, "one two three")]
|
||||||
|
[InlineData(new[] { "line1\nline2", "word1\tword2" }, "\"line1\nline2\" \"word1\tword2\"")]
|
||||||
|
[InlineData(new[] { "with spaces" }, "\"with spaces\"")]
|
||||||
|
[InlineData(new[] { @"with\backslash" }, @"with\backslash")]
|
||||||
|
[InlineData(new[] { @"""quotedwith\backslash""" }, @"\""quotedwith\backslash\""")]
|
||||||
|
[InlineData(new[] { @"C:\Users\" }, @"C:\Users\")]
|
||||||
|
[InlineData(new[] { @"C:\Program Files\dotnet\" }, @"""C:\Program Files\dotnet\\""")]
|
||||||
|
[InlineData(new[] { @"backslash\""preceedingquote" }, @"backslash\\\""preceedingquote")]
|
||||||
|
[InlineData(new[] { @""" hello """ }, @"""\"" hello \""""")]
|
||||||
|
public void EscapesArgumentsForProcessStart(string[] args, string expected)
|
||||||
|
{
|
||||||
|
Assert.Equal(expected, ArgumentEscaper.EscapeAndConcatenateArgArrayForProcessStart(args));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue