Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions eng/pipelines/libraries/helix-queues-setup.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,6 @@ jobs:
# Limiting interp runs as we don't need as much coverage.
- (Debian.12.Amd64.Open)Ubuntu.2204.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-helix-amd64

# Linux s390x
- ${{ if eq(parameters.platform, 'linux_s390x') }}:
- Ubuntu.2004.S390X.Experimental.Open

# Linux PPC64le
- ${{ if eq(parameters.platform, 'linux_ppc64le') }}:
- Ubuntu.2204.PPC64le.Experimental.Open

# OSX arm64
- ${{ if eq(parameters.platform, 'osx_arm64') }}:
- OSX.1200.ARM64.Open
Expand Down
11 changes: 0 additions & 11 deletions eng/pipelines/runtime-community.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,17 +71,6 @@ extends:
eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_libraries.containsChange'], true),
eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_mono_excluding_wasm.containsChange'], true),
eq(variables['isRollingBuild'], true))
# extra steps, run tests
postBuildSteps:
- template: /eng/pipelines/libraries/helix.yml
parameters:
creator: dotnet-bot
testRunNamePrefixSuffix: Mono_$(_BuildConfig)
condition: >-
or(
eq(variables['librariesContainsChange'], true),
eq(variables['monoContainsChange'], true),
eq(variables['isRollingBuild'], true))

#
# Build the whole product using Mono
Expand Down
29 changes: 29 additions & 0 deletions src/installer/tests/HostActivation.Tests/NativeHosting/Comhost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,35 @@ public void ActivateClass_IgnoreAppLocalHostFxr()
}
}

[Fact]
public void ActivateClass_IgnoreWorkingDirectory()
{
using (TestArtifact cwd = TestArtifact.Create("cwd"))
{
// Validate that hosting components in the working directory will not be used
File.Copy(Binaries.CoreClr.MockPath, Path.Combine(cwd.Location, Binaries.CoreClr.FileName));
File.Copy(Binaries.HostFxr.MockPath_5_0, Path.Combine(cwd.Location, Binaries.HostFxr.FileName));
File.Copy(Binaries.HostPolicy.MockPath, Path.Combine(cwd.Location, Binaries.HostPolicy.FileName));

string[] args = {
"comhost",
"synchronous",
"1",
sharedState.ComHostPath,
sharedState.ClsidString
};
sharedState.CreateNativeHostCommand(args, TestContext.BuiltDotNet.BinPath)
.WorkingDirectory(cwd.Location)
.Execute()
.Should().Pass()
.And.HaveStdOutContaining("New instance of Server created")
.And.HaveStdOutContaining($"Activation of {sharedState.ClsidString} succeeded.")
.And.ResolveHostFxr(TestContext.BuiltDotNet)
.And.ResolveHostPolicy(TestContext.BuiltDotNet)
.And.ResolveCoreClr(TestContext.BuiltDotNet);
}
}

[Fact]
public void ActivateClass_ValidateIErrorInfoResult()
{
Expand Down
26 changes: 26 additions & 0 deletions src/installer/tests/HostActivation.Tests/NativeHosting/Ijwhost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,32 @@ public void LoadLibrary_ContextConfig(bool load_isolated)
}
}

[Fact]
public void LoadLibrary_IgnoreWorkingDirectory()
{
using (TestArtifact cwd = TestArtifact.Create("cwd"))
{
// Validate that hosting components in the working directory will not be used
File.Copy(Binaries.CoreClr.MockPath, Path.Combine(cwd.Location, Binaries.CoreClr.FileName));
File.Copy(Binaries.HostFxr.MockPath_5_0, Path.Combine(cwd.Location, Binaries.HostFxr.FileName));
File.Copy(Binaries.HostPolicy.MockPath, Path.Combine(cwd.Location, Binaries.HostPolicy.FileName));

string [] args = {
"ijwhost",
sharedState.IjwApp.AppDll,
"NativeEntryPoint"
};
sharedState.CreateNativeHostCommand(args, TestContext.BuiltDotNet.BinPath)
.WorkingDirectory(cwd.Location)
.Execute()
.Should().Pass()
.And.HaveStdOutContaining("[C++/CLI] NativeEntryPoint: calling managed class")
.And.HaveStdOutContaining("[C++/CLI] ManagedClass: AssemblyLoadContext = \"Default\" System.Runtime.Loader.DefaultAssemblyLoadContext")
.And.ResolveHostFxr(TestContext.BuiltDotNet)
.And.ResolveHostPolicy(TestContext.BuiltDotNet)
.And.ResolveCoreClr(TestContext.BuiltDotNet);
}
}

[Fact]
public void LoadLibraryWithoutRuntimeConfigButActiveRuntime()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Generic;
using System.IO;
using System.Linq;

using Microsoft.DotNet.Cli.Build.Framework;
Expand Down Expand Up @@ -231,6 +232,37 @@ public void CallDelegateOnComponentContext_UnhandledException()
.And.ExecuteFunctionPointerWithException(entryPoint, 1);
}

[Fact]
public void CallDelegateOnComponentContext_IgnoreWorkingDirectory()
{
using (TestArtifact cwd = TestArtifact.Create("cwd"))
{
// Validate that hosting components in the working directory will not be used
File.Copy(Binaries.CoreClr.MockPath, Path.Combine(cwd.Location, Binaries.CoreClr.FileName));
File.Copy(Binaries.HostPolicy.MockPath, Path.Combine(cwd.Location, Binaries.HostPolicy.FileName));

var component = sharedState.Component;
string[] args =
{
ComponentLoadAssemblyAndGetFunctionPointerArg,
sharedState.HostFxrPath,
component.RuntimeConfigJson,
component.AppDll,
sharedState.ComponentTypeName,
sharedState.ComponentEntryPoint1,
};

sharedState.CreateNativeHostCommand(args, sharedState.DotNetRoot)
.WorkingDirectory(cwd.Location)
.Execute()
.Should().Pass()
.And.InitializeContextForConfig(component.RuntimeConfigJson)
.And.ExecuteFunctionPointer(sharedState.ComponentEntryPoint1, 1, 1)
.And.ResolveHostPolicy(TestContext.BuiltDotNet)
.And.ResolveCoreClr(TestContext.BuiltDotNet);
}
}

public class SharedTestState : SharedTestStateBase
{
public string HostFxrPath { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.IO;

namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.NativeHosting
{
internal static class FunctionPointerResultExtensions
internal static class NativeHostingResultExtensions
{
public static FluentAssertions.AndConstraint<CommandResultAssertions> ExecuteFunctionPointer(this CommandResultAssertions assertion, string methodName, int callCount, int returnValue)
{
Expand Down Expand Up @@ -47,5 +48,21 @@ public static FluentAssertions.AndConstraint<CommandResultAssertions> ExecuteWit
{
return assertion.HaveStdOutContaining($"{assemblyName}: Location = '{location}'");
}

public static FluentAssertions.AndConstraint<CommandResultAssertions> ResolveHostFxr(this CommandResultAssertions assertion, Microsoft.DotNet.Cli.Build.DotNetCli dotnet)
{
return assertion.HaveStdErrContaining($"Resolved fxr [{dotnet.GreatestVersionHostFxrFilePath}]");
}

public static FluentAssertions.AndConstraint<CommandResultAssertions> ResolveHostPolicy(this CommandResultAssertions assertion, Microsoft.DotNet.Cli.Build.DotNetCli dotnet)
{
return assertion.HaveStdErrContaining($"{Binaries.HostPolicy.FileName} directory is [{dotnet.GreatestVersionSharedFxPath}]");
}

public static FluentAssertions.AndConstraint<CommandResultAssertions> ResolveCoreClr(this CommandResultAssertions assertion, Microsoft.DotNet.Cli.Build.DotNetCli dotnet)
{
return assertion.HaveStdErrContaining($"CoreCLR path = '{Path.Combine(dotnet.GreatestVersionSharedFxPath, Binaries.CoreClr.FileName)}'")
.And.HaveStdErrContaining($"CoreCLR dir = '{dotnet.GreatestVersionSharedFxPath}{Path.DirectorySeparatorChar}'");
}
}
}
5 changes: 5 additions & 0 deletions src/native/corehost/apphost/standalone/hostfxr_resolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,11 @@ hostfxr_resolver_t::hostfxr_resolver_t(const pal::string_t& app_root)
{
m_status_code = StatusCode::CoreHostLibMissingFailure;
}
else if (!pal::is_path_rooted(m_fxr_path))
{
// We should always be loading hostfxr from an absolute path
m_status_code = StatusCode::CoreHostLibMissingFailure;
}
else if (pal::load_library(&m_fxr_path, &m_hostfxr_dll))
{
m_status_code = StatusCode::Success;
Expand Down
4 changes: 4 additions & 0 deletions src/native/corehost/fxr/standalone/hostpolicy_resolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,10 @@ int hostpolicy_resolver::load(
return StatusCode::CoreHostLibMissingFailure;
}

// We should always be loading hostpolicy from an absolute path
if (!pal::is_path_rooted(host_path))
return StatusCode::CoreHostLibMissingFailure;

// Load library
// We expect to leak hostpolicy - just as we do not unload coreclr, we do not unload hostpolicy
if (!pal::load_library(&host_path, &g_hostpolicy))
Expand Down
4 changes: 4 additions & 0 deletions src/native/corehost/fxr_resolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ int load_fxr_and_get_delegate(hostfxr_delegate_type type, THostPathToConfigCallb
return StatusCode::CoreHostLibMissingFailure;
}

// We should always be loading hostfxr from an absolute path
if (!pal::is_path_rooted(fxr_path))
return StatusCode::CoreHostLibMissingFailure;

// Load library
if (!pal::load_library(&fxr_path, &fxr))
{
Expand Down
16 changes: 11 additions & 5 deletions src/native/corehost/hostpolicy/deps_resolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -830,15 +830,21 @@ bool deps_resolver_t::resolve_probe_dirs(
}
}

// If the deps file is missing add known locations.
if (!get_app_deps().exists())
// If the deps file is missing for the app, add known locations.
// For libhost scenarios, there is no app or app path
if (m_host_mode != host_mode_t::libhost && !get_app_deps().exists())
{
assert(!m_app_dir.empty());

// App local path
add_unique_path(asset_type, m_app_dir, &items, output, &non_serviced, core_servicing);

// deps_resolver treats being able to get the coreclr path as optional, so we ignore the return value here.
// The caller is responsible for checking whether coreclr path is set and handling as appropriate.
(void) file_exists_in_dir(m_app_dir, LIBCORECLR_NAME, &m_coreclr_path);
if (m_coreclr_path.empty())
{
// deps_resolver treats being able to get the coreclr path as optional, so we ignore the return value here.
// The caller is responsible for checking whether coreclr path is set and handling as appropriate.
(void) file_exists_in_dir(m_app_dir, LIBCORECLR_NAME, &m_coreclr_path);
}
}

// Handle any additional deps.json that were specified.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ bool coreclr_resolver_t::resolve_coreclr(const pal::string_t& libcoreclr_path, c
pal::string_t coreclr_dll_path(libcoreclr_path);
append_path(&coreclr_dll_path, LIBCORECLR_NAME);

// We should always be loading coreclr from an absolute path
if (!pal::is_path_rooted(coreclr_dll_path))
return false;

if (!pal::load_library(&coreclr_dll_path, &coreclr_resolver_contract.coreclr))
{
return false;
Expand Down
Loading