From bead375240a5dd0abcfac4b1a2327440113b747c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Aug 2021 15:16:10 +0200 Subject: [PATCH] [mono] Support public key token in DefineDynamicAssembly (#58283) * Fixes https://github.com/dotnet/runtime/issues/58015 Co-authored-by: Ulrich Weigand --- .../tests/AssemblyBuilderTests.cs | 21 +++++++++++++++++++++ .../System/Reflection/Emit/AssemblyBuilder.Mono.cs | 2 ++ src/mono/mono/metadata/object-internals.h | 1 + src/mono/mono/metadata/sre.c | 7 +++++++ 4 files changed, 31 insertions(+) diff --git a/src/libraries/System.Reflection.Emit/tests/AssemblyBuilderTests.cs b/src/libraries/System.Reflection.Emit/tests/AssemblyBuilderTests.cs index 7c6b3c3..d968a6c 100644 --- a/src/libraries/System.Reflection.Emit/tests/AssemblyBuilderTests.cs +++ b/src/libraries/System.Reflection.Emit/tests/AssemblyBuilderTests.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Runtime.InteropServices; using Xunit; @@ -24,6 +25,21 @@ namespace System.Reflection.Emit.Tests public class AssemblyTests { + // The ECMA replacement key for the Microsoft implementation of the CLR. + private static readonly byte[] TheKey = + { + 0x00,0x24,0x00,0x00,0x04,0x80,0x00,0x00,0x94,0x00,0x00,0x00,0x06,0x02,0x00,0x00, + 0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x31,0x00,0x04,0x00,0x00,0x01,0x00,0x01,0x00, + 0x07,0xd1,0xfa,0x57,0xc4,0xae,0xd9,0xf0,0xa3,0x2e,0x84,0xaa,0x0f,0xae,0xfd,0x0d, + 0xe9,0xe8,0xfd,0x6a,0xec,0x8f,0x87,0xfb,0x03,0x76,0x6c,0x83,0x4c,0x99,0x92,0x1e, + 0xb2,0x3b,0xe7,0x9a,0xd9,0xd5,0xdc,0xc1,0xdd,0x9a,0xd2,0x36,0x13,0x21,0x02,0x90, + 0x0b,0x72,0x3c,0xf9,0x80,0x95,0x7f,0xc4,0xe1,0x77,0x10,0x8f,0xc6,0x07,0x77,0x4f, + 0x29,0xe8,0x32,0x0e,0x92,0xea,0x05,0xec,0xe4,0xe8,0x21,0xc0,0xa5,0xef,0xe8,0xf1, + 0x64,0x5c,0x4c,0x0c,0x93,0xc1,0xab,0x99,0x28,0x5d,0x62,0x2c,0xaa,0x65,0x2c,0x1d, + 0xfa,0xd6,0x3d,0x74,0x5d,0x6f,0x2d,0xe5,0xf1,0x7e,0x5e,0xaf,0x0f,0xc4,0x96,0x3d, + 0x26,0x1c,0x8a,0x12,0x43,0x65,0x18,0x20,0x6d,0xc0,0x93,0x34,0x4d,0x5a,0xd2,0x93 + }; + public static IEnumerable DefineDynamicAssembly_TestData() { foreach (AssemblyBuilderAccess access in new AssemblyBuilderAccess[] { AssemblyBuilderAccess.Run, AssemblyBuilderAccess.RunAndCollect }) @@ -32,6 +48,11 @@ namespace System.Reflection.Emit.Tests yield return new object[] { new AssemblyName("testname") { Version = new Version(1, 2, 3, 4) }, access }; yield return new object[] { new AssemblyName("class") { Version = new Version(0, 0, 0, 0) }, access }; yield return new object[] { new AssemblyName("\uD800\uDC00") { Version = new Version(0, 0, 0, 0) }, access }; + + AssemblyName testPublicKey = new AssemblyName("TestPublicKey") { Version = new Version(0, 0, 0, 0) }; + testPublicKey.CultureInfo = CultureInfo.InvariantCulture; + testPublicKey.SetPublicKey(TheKey); + yield return new object[] { testPublicKey, access }; } } diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs index 9e9d0d9..919015e 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs @@ -185,6 +185,7 @@ namespace System.Reflection.Emit private CustomAttributeBuilder[]? cattrs; private string? version; private string? culture; + private byte[]? public_key_token; private Module[]? loaded_modules; private uint access; #endregion @@ -221,6 +222,7 @@ namespace System.Reflection.Emit { version = v.ToString(); } + public_key_token = n.GetPublicKeyToken(); basic_init(this); diff --git a/src/mono/mono/metadata/object-internals.h b/src/mono/mono/metadata/object-internals.h index 9702920..8f47c92 100644 --- a/src/mono/mono/metadata/object-internals.h +++ b/src/mono/mono/metadata/object-internals.h @@ -1068,6 +1068,7 @@ typedef struct { MonoArray *cattrs; MonoString *version; MonoString *culture; + MonoArray *public_key_token; MonoArray *loaded_modules; guint32 access; } MonoReflectionAssemblyBuilder; diff --git a/src/mono/mono/metadata/sre.c b/src/mono/mono/metadata/sre.c index 17e4923..c2c599d 100644 --- a/src/mono/mono/metadata/sre.c +++ b/src/mono/mono/metadata/sre.c @@ -1263,6 +1263,13 @@ mono_reflection_dynimage_basic_init (MonoReflectionAssemblyBuilder *assemblyb, M assembly->assembly.aname.revision = 0; } + if (assemblyb->public_key_token) { + for (int i = 0; i < 8 && i < mono_array_length_internal (assemblyb->public_key_token); i++) { + guint8 byte = mono_array_get_internal (assemblyb->public_key_token, guint8, i); + sprintf ((char*)(assembly->assembly.aname.public_key_token + 2 * i), "%02x", byte); + } + } + /* SRE assemblies are loaded into the individual loading context, ie, * they only fire AssemblyResolve events, they don't cause probing for * referenced assemblies to happen. */ -- 2.7.4