[loader] Don't try to look for ReferenceAssemblyAttribute on dynamic assemblies ...
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 29 Jun 2017 22:12:34 +0000 (18:12 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Fri, 30 Jun 2017 04:36:28 +0000 (00:36 -0400)
.NETFramework seems to ignore this custom attribute and allows instantiating
types from on assembly builders.

mono/metadata/assembly.c
mono/metadata/custom-attrs.c

index 86efc2999f6562594f0503e4a60d4461edc20a28..3ecd1478ba21be51523deb0542c172ad4798c6d4 100644 (file)
@@ -2108,6 +2108,10 @@ has_reference_assembly_attribute_iterator (MonoImage *image, guint32 typeref_sco
 gboolean
 mono_assembly_has_reference_assembly_attribute (MonoAssembly *assembly, MonoError *error)
 {
+       g_assert (assembly && assembly->image);
+       /* .NET Framework appears to ignore the attribute on dynamic
+        * assemblies, so don't call this function for dynamic assemblies. */
+       g_assert (!image_is_dynamic (assembly->image));
        error_init (error);
 
        /*
@@ -3513,8 +3517,11 @@ prevent_reference_assembly_from_running (MonoAssembly* candidate, gboolean refon
 {
        MonoError refasm_error;
        error_init (&refasm_error);
-       if (candidate && !refonly && mono_assembly_has_reference_assembly_attribute (candidate, &refasm_error)) {
-               candidate = NULL;
+       if (candidate && !refonly) {
+               /* .NET Framework seems to not check for ReferenceAssemblyAttribute on dynamic assemblies */
+               if (!image_is_dynamic (candidate->image) &&
+                   mono_assembly_has_reference_assembly_attribute (candidate, &refasm_error))
+                       candidate = NULL;
        }
        mono_error_cleanup (&refasm_error);
        return candidate;
index b2dd518c3c88a3fdda80f90297deddbefd200c45..0fecdbd66ce7415846f0609e2a095928934f0d51 100644 (file)
@@ -1950,6 +1950,9 @@ mono_assembly_metadata_foreach_custom_attr (MonoAssembly *assembly, MonoAssembly
         */
 
        image = assembly->image;
+       /* Dynamic images would need to go through the AssemblyBuilder's
+        * CustomAttributeBuilder array.  Going through the tables below
+        * definitely won't work. */
        g_assert (!image_is_dynamic (image));
        idx = 1; /* there is only one assembly */
        idx <<= MONO_CUSTOM_ATTR_BITS;