Skip to content

Commit ac4f82c

Browse files
committed
C#: Verify that downloaded .NET CLIs are executable
1 parent dcd87a9 commit ac4f82c

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ public BuildScript Analyse(IAutobuilder<CSharpAutobuildOptions> builder, bool au
4646

4747
return WithDotNet(builder, ensureDotNetAvailable: false, (dotNetPath, environment) =>
4848
{
49-
var ret = GetInfoCommand(builder.Actions, dotNetPath, environment);
49+
// When a custom .NET CLI has been installed, `dotnet --info` has already been executed
50+
// to verify the installation.
51+
var ret = dotNetPath is null ? GetInfoCommand(builder.Actions, dotNetPath, environment) : BuildScript.Success;
5052
foreach (var projectOrSolution in builder.ProjectsOrSolutionsToBuild)
5153
{
5254
var cleanCommand = GetCleanCommand(builder.Actions, dotNetPath, environment);

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public sealed partial class DependencyManager : IDisposable, ICompilationInfoCon
4141
private int conflictedReferences = 0;
4242
private readonly DirectoryInfo sourceDir;
4343
private string? dotnetPath;
44-
4544
private readonly TemporaryDirectory tempWorkingDirectory;
4645
private readonly bool cleanupTempWorkingDirectory;
4746

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,20 @@ public partial class DotNet : IDotNet
1919
private readonly ILogger logger;
2020
private readonly TemporaryDirectory? tempWorkingDirectory;
2121

22-
private DotNet(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, TemporaryDirectory? tempWorkingDirectory = null)
22+
private DotNet(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, bool runDotnetInfo, TemporaryDirectory? tempWorkingDirectory = null)
2323
{
2424
this.tempWorkingDirectory = tempWorkingDirectory;
2525
this.dotnetCliInvoker = dotnetCliInvoker;
2626
this.logger = logger;
27-
Info();
27+
if (runDotnetInfo)
28+
{
29+
Info();
30+
}
2831
}
2932

30-
private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) : this(new DotNetCliInvoker(logger, Path.Combine(dotNetPath ?? string.Empty, "dotnet"), dependabotProxy), logger, tempWorkingDirectory) { }
33+
private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) : this(new DotNetCliInvoker(logger, Path.Combine(dotNetPath ?? string.Empty, "dotnet"), dependabotProxy), logger, dotNetPath is null, tempWorkingDirectory) { }
3134

32-
internal static IDotNet Make(IDotNetCliInvoker dotnetCliInvoker, ILogger logger) => new DotNet(dotnetCliInvoker, logger);
35+
internal static IDotNet Make(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, bool runDotnetInfo) => new DotNet(dotnetCliInvoker, logger, runDotnetInfo);
3336

3437
public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) => new DotNet(logger, dotNetPath, tempWorkingDirectory, dependabotProxy);
3538

@@ -169,7 +172,10 @@ private static BuildScript DownloadDotNet(IBuildActions actions, ILogger logger,
169172

170173
if (versions.Count > 0)
171174
{
172-
return DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, versions);
175+
return
176+
DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, versions) |
177+
// if neither of the versions succeed, try the latest version
178+
DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, [LatestDotNetSdkVersion], needExactVersion: false);
173179
}
174180

175181
if (ensureDotNetAvailable)
@@ -269,6 +275,14 @@ BuildScript GetInstall(string pwsh) =>
269275
Argument(path).Script;
270276
}
271277

278+
var dotnetInfo = new CommandBuilder(actions).
279+
RunCommand(actions.PathCombine(path, "dotnet")).
280+
Argument("--info").Script;
281+
282+
Func<string, BuildScript> getInstallAndVerify = version =>
283+
// run `dotnet --info` after install, to check that it executes successfully
284+
getInstall(version) & dotnetInfo;
285+
272286
var installScript = prelude & BuildScript.Failure;
273287

274288
var attempted = new HashSet<string>();
@@ -283,7 +297,7 @@ BuildScript GetInstall(string pwsh) =>
283297

284298
// When there are multiple versions requested, we want to try to fetch them all, reporting
285299
// a successful exit code when at least one of them succeeds
286-
return combinedExit != 0 ? getInstall(version) : BuildScript.Bind(getInstall(version), _ => BuildScript.Success);
300+
return combinedExit != 0 ? getInstallAndVerify(version) : BuildScript.Bind(getInstallAndVerify(version), _ => BuildScript.Success);
287301
});
288302
}
289303

csharp/extractor/Semmle.Extraction.Tests/DotNet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public bool RunCommand(string args, string? workingDirectory, out IList<string>
4545
public class DotNetTests
4646
{
4747
private static IDotNet MakeDotnet(IDotNetCliInvoker dotnetCliInvoker) =>
48-
DotNet.Make(dotnetCliInvoker, new LoggerStub());
48+
DotNet.Make(dotnetCliInvoker, new LoggerStub(), true);
4949

5050
private static IList<string> MakeDotnetRestoreOutput() =>
5151
new List<string> {

0 commit comments

Comments
 (0)