From 80302f45bf04ba1646a22fb843ced22accee2b93 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:51:46 +0000 Subject: [PATCH 1/2] Initial plan From 6e589e5601de8c8e1d542844e403b78c1cdafe39 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:49:35 +0000 Subject: [PATCH 2/2] Preserve invalid friend assembly diagnostics by removing lossy HRESULT roundtrip Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/406c2ee2-d0ea-4ba1-a45b-52ac7d68918e Co-authored-by: elinor-fung <47805090+elinor-fung@users.noreply.github.com> --- src/coreclr/vm/assembly.cpp | 8 ++---- .../InvalidFriendAssemblyName.cs | 25 +++++++++++++++++++ .../InvalidFriendAssemblyName.csproj | 6 +++++ 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 src/tests/Loader/classloader/regressions/InvalidFriendAssemblyName/InvalidFriendAssemblyName.cs create mode 100644 src/tests/Loader/classloader/regressions/InvalidFriendAssemblyName/InvalidFriendAssemblyName.csproj diff --git a/src/coreclr/vm/assembly.cpp b/src/coreclr/vm/assembly.cpp index 36c0084ef376fc..8c495ec2bde880 100644 --- a/src/coreclr/vm/assembly.cpp +++ b/src/coreclr/vm/assembly.cpp @@ -2590,12 +2590,8 @@ ReleaseHolder FriendAssemblyDescriptor::CreateFriendAs // Create an AssemblyNameObject from the string. FriendAssemblyNameHolder pFriendAssemblyName; pFriendAssemblyName = new FriendAssemblyName_t; - hr = pFriendAssemblyName->InitNoThrow(displayName); - - if (SUCCEEDED(hr)) - { - hr = pFriendAssemblyName->CheckFriendAssemblyName(); - } + pFriendAssemblyName->Init(displayName); + hr = pFriendAssemblyName->CheckFriendAssemblyName(); if (FAILED(hr)) { diff --git a/src/tests/Loader/classloader/regressions/InvalidFriendAssemblyName/InvalidFriendAssemblyName.cs b/src/tests/Loader/classloader/regressions/InvalidFriendAssemblyName/InvalidFriendAssemblyName.cs new file mode 100644 index 00000000000000..4a682118d1e5a7 --- /dev/null +++ b/src/tests/Loader/classloader/regressions/InvalidFriendAssemblyName/InvalidFriendAssemblyName.cs @@ -0,0 +1,25 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.IO; +using System.Runtime.CompilerServices; +using Xunit; + +[assembly: InternalsVisibleTo("Broken,PublicKey=00240000048000009400000006020000002400005253413100040000010001002d07581667cbf8caf9786ac8d5257eb2c77eb2643a1af1bb89d4286e27a3ff5d805408c9f1a0a392d2f478ca2b9c68e43cdcdcea2d7cf0618dd8ba48858bf5fc74c7fc2af7a29f936398c0f61a2165d08ac4fcc8e8ad04e24633b7ca31a7c13f750ae75e53cea55ced97d3289fd100dbe2661a802bf8bd2acb0b6893ef3fb79c,PublicKeyToken=282361b99ded7e8e")] + +public class InvalidFriendAssemblyName +{ + private const string InvalidAssemblyName = "Broken,PublicKey=00240000048000009400000006020000002400005253413100040000010001002d07581667cbf8caf9786ac8d5257eb2c77eb2643a1af1bb89d4286e27a3ff5d805408c9f1a0a392d2f478ca2b9c68e43cdcdcea2d7cf0618dd8ba48858bf5fc74c7fc2af7a29f936398c0f61a2165d08ac4fcc8e8ad04e24633b7ca31a7c13f750ae75e53cea55ced97d3289fd100dbe2661a802bf8bd2acb0b6893ef3fb79c,PublicKeyToken=282361b99ded7e8e"; + + [Fact] + public static void TestEntryPoint() + { + FileLoadException exception = Assert.Throws(() => new InvalidFriendAssemblyName().GetCopy()); + + Assert.Equal(InvalidAssemblyName, exception.FileName); + Assert.Contains("assembly name was invalid", exception.Message, StringComparison.OrdinalIgnoreCase); + } + + public object GetCopy() => MemberwiseClone(); +} diff --git a/src/tests/Loader/classloader/regressions/InvalidFriendAssemblyName/InvalidFriendAssemblyName.csproj b/src/tests/Loader/classloader/regressions/InvalidFriendAssemblyName/InvalidFriendAssemblyName.csproj new file mode 100644 index 00000000000000..17cf9dbad70f50 --- /dev/null +++ b/src/tests/Loader/classloader/regressions/InvalidFriendAssemblyName/InvalidFriendAssemblyName.csproj @@ -0,0 +1,6 @@ + + + + + +