提交 4ca93678 编写于 作者: J Jared Parsons

Merge pull request #8504 from jaredpar/fix

Normalize paths when generating pipe names
......@@ -75,7 +75,7 @@ internal static async Task<int> RunShutdownAsync(string pipeName, bool waitForPr
if (string.IsNullOrEmpty(pipeName))
{
var clientDirectory = AppDomain.CurrentDomain.BaseDirectory;
pipeName = DesktopBuildClient.GetPipeNameFromFileInfo(clientDirectory);
pipeName = DesktopBuildClient.GetPipeNameForPath(clientDirectory);
}
var mutexName = BuildProtocolConstants.GetServerMutexName(pipeName);
......
......@@ -284,5 +284,18 @@ public void KeepAlive()
Assert.Null(_sessionKey);
}
}
public class MiscTest
{
[Fact]
public void GetBasePipeNameSlashes()
{
var path = string.Format(@"q:{0}the{0}path", Path.DirectorySeparatorChar);
var name = DesktopBuildClient.GetBasePipeName(path);
Assert.Equal(name, DesktopBuildClient.GetBasePipeName(path));
Assert.Equal(name, DesktopBuildClient.GetBasePipeName(path + Path.DirectorySeparatorChar));
Assert.Equal(name, DesktopBuildClient.GetBasePipeName(path + Path.DirectorySeparatorChar + Path.DirectorySeparatorChar));
}
}
}
}
......@@ -82,7 +82,7 @@ protected override int RunLocalCompilation(string[] arguments, BuildPaths buildP
language,
arguments,
buildPaths,
GetPipeNameFromFileInfo(buildPaths.ClientDirectory),
GetPipeNameForPath(buildPaths.ClientDirectory),
keepAlive,
libEnvVariable,
timeoutOverride: null,
......@@ -419,11 +419,28 @@ private static bool CheckPipeConnectionOwnership(NamedPipeClientStream pipeStrea
/// </summary>
protected override string GetSessionKey(BuildPaths buildPaths)
{
return GetPipeNameFromFileInfo(buildPaths.ClientDirectory);
return GetPipeNameForPath(buildPaths.ClientDirectory);
}
internal static string GetPipeNameFromFileInfo(string compilerExeDirectory)
internal static string GetPipeNameForPath(string compilerExeDirectory)
{
var basePipeName = GetBasePipeName(compilerExeDirectory);
// Prefix with username and elevation
var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
var isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
var userName = Environment.UserName;
return $"{userName}.{isAdmin}.{basePipeName}";
}
internal static string GetBasePipeName(string compilerExeDirectory)
{
// Normalize away trailing slashes. File APIs include / exclude this with no
// discernable pattern. Easiest to normalize it here vs. auditing every caller
// of this method.
compilerExeDirectory = compilerExeDirectory.TrimEnd(Path.DirectorySeparatorChar);
string basePipeName;
using (var sha = SHA256.Create())
{
......@@ -433,12 +450,7 @@ internal static string GetPipeNameFromFileInfo(string compilerExeDirectory)
.Replace("=", string.Empty);
}
// Prefix with username and elevation
var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
var isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
var userName = Environment.UserName;
return $"{userName}.{isAdmin}.{basePipeName}";
return basePipeName;
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册