[tests] ResolveEventHandler that returns an AssemblyBuilder shouldn't crash mono
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 29 Jun 2017 23:23:44 +0000 (19:23 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Fri, 30 Jun 2017 04:36:24 +0000 (00:36 -0400)
Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=57851

mono/tests/Makefile.am
mono/tests/assemblyresolve_event5.cs [new file with mode: 0644]
mono/tests/assemblyresolve_event5_helper.cs [new file with mode: 0644]
mono/tests/assemblyresolve_event5_label.cs [new file with mode: 0644]

index 5c9bec74d8d246892909960421881a75ef4bb3fc..d9c5afefee31164afd3b05a2b8434be0f7af4b08 100755 (executable)
@@ -126,6 +126,7 @@ TESTS_CS_SRC=               \
        assemblyresolve_event.cs        \
        assemblyresolve_event3.cs       \
        assemblyresolve_event4.cs       \
+       assemblyresolve_event5.cs       \
        checked.cs              \
        char-isnumber.cs        \
        field-layout.cs         \
@@ -826,7 +827,8 @@ PROFILE_DISABLED_TESTS += \
        bug-389886-3.exe        \
        constant-division.exe   \
        dynamic-method-resurrection.exe \
-       assembly_append_ordering.exe
+       assembly_append_ordering.exe \
+       assemblyresolve_event5.exe
 
 # Test which needs System.Web support
 PROFILE_DISABLED_TESTS += \
@@ -1720,6 +1722,13 @@ assemblyresolve_event3.exe: assemblyresolve_asm.dll assemblyresolve_deps/Test.dl
 assemblyresolve_event4.exe$(PLATFORM_AOT_SUFFIX): assemblyresolve_deps/Test.dll$(PLATFORM_AOT_SUFFIX) assemblyresolve_deps/TestBase.dll$(PLATFORM_AOT_SUFFIX)
 assemblyresolve_event4.exe: assemblyresolve_deps/Test.dll assemblyresolve_deps/TestBase.dll
 
+EXTRA_DIST += assemblyresolve_event5_label.cs assemblyresolve_event5_helper.cs
+assemblyresolve_deps/assemblyresolve_event5_label.dll: assemblyresolve_event5_label.cs assemblyresolve_deps 
+       $(MCS) -target:library -out:assemblyresolve_deps/assemblyresolve_event5_label.dll $(srcdir)/assemblyresolve_event5_label.cs
+assemblyresolve_event5_helper.dll: assemblyresolve_event5_helper.cs assemblyresolve_deps/assemblyresolve_event5_label.dll
+       $(MCS) -target:library -out:assemblyresolve_event5_helper.dll -r:assemblyresolve_deps/assemblyresolve_event5_label.dll $(srcdir)/assemblyresolve_event5_helper.cs
+assemblyresolve_event5.exe: assemblyresolve_event5_helper.dll
+
 # We use 'test-support-files' to handle an ordering issue between the 'mono/' and 'runtime/' directories
 bug-80307.exe: $(srcdir)/bug-80307.cs
        $(MCS) -r:$(CLASS)/System.Web.dll -out:$@ $(srcdir)/bug-80307.cs
diff --git a/mono/tests/assemblyresolve_event5.cs b/mono/tests/assemblyresolve_event5.cs
new file mode 100644 (file)
index 0000000..8fa0200
--- /dev/null
@@ -0,0 +1,63 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+
+public class TestAssemblyResolveEvent {
+       public static int Main (String[] args) {
+               // Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=57851
+
+               // If the custom attributes of an assembly trigger a
+               // ResolveEventHandler, and that handler returns an
+               // AssemblyBuilder, don't crash.
+               var h = new MockResolver ("assemblyresolve_event5_label");
+               var aName = new AssemblyName ("assemblyresolve_event5_helper");
+               var a = AppDomain.CurrentDomain.Load (aName);
+               var t = a.GetType ("MyClass");
+               h.StartHandling ();
+               var cas = t.GetCustomAttributes (true);
+               h.StopHandling ();
+               return 0;
+       }
+}
+
+
+public class MockResolver {
+       private Assembly mock;
+       private ResolveEventHandler d;
+       private string theName;
+       
+       public MockResolver (string theName) {
+               mock = CreateMock (theName);
+               d = new ResolveEventHandler (HandleResolveEvent);
+               this.theName = theName;
+       }
+
+       public void StartHandling () {
+               AppDomain.CurrentDomain.AssemblyResolve += d;
+       }
+
+       public void StopHandling () {
+               AppDomain.CurrentDomain.AssemblyResolve -= d;
+       }
+
+       public Assembly HandleResolveEvent (Object sender, ResolveEventArgs args) {
+               Console.Error.WriteLine ("handling load of {0}", args.Name);
+               if (args.Name.StartsWith (theName))
+                       return mock;
+               else
+                       return null;
+       }
+
+       private static Assembly CreateMock (string s) {
+               var an = new AssemblyName (s);
+               var ab = AssemblyBuilder.DefineDynamicAssembly (an, AssemblyBuilderAccess.Run);
+               var mb = ab.DefineDynamicModule (an.Name);
+
+               var tb = mb.DefineType ("Foo", TypeAttributes.Public);
+               tb.DefineDefaultConstructor (MethodAttributes.Public);
+               tb.CreateType ();
+
+               return ab;
+       }
+}
diff --git a/mono/tests/assemblyresolve_event5_helper.cs b/mono/tests/assemblyresolve_event5_helper.cs
new file mode 100644 (file)
index 0000000..b0944d5
--- /dev/null
@@ -0,0 +1,10 @@
+using System;
+
+public class SimpleTypedAttribute : Attribute {
+       public SimpleTypedAttribute (Type t) { }
+}
+
+[SimpleTypedAttribute(typeof(Foo))] /* Foo defined in the assemblyresolve_event5_label assembly */
+public class MyClass {
+       public MyClass () { }
+}
diff --git a/mono/tests/assemblyresolve_event5_label.cs b/mono/tests/assemblyresolve_event5_label.cs
new file mode 100644 (file)
index 0000000..2430705
--- /dev/null
@@ -0,0 +1,5 @@
+using System;
+
+public class Foo {
+       public Foo () { }
+}