[loader] Throw exn if ResolveEventHandler returns a refonly assembly (Fixes #57850)
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 29 Jun 2017 16:52:52 +0000 (12:52 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Fri, 30 Jun 2017 04:36:27 +0000 (00:36 -0400)
(Also depends on previous commit to ensure that MonoAssembly:refonly is set
correctly for dynamic assemblies)

mono/metadata/appdomain.c

index 02ca3bbf949dcfa99b1b35c56eccea187d7bfbb3..821fd7d8e53501d145f22719113eaaa379b06dcd 100644 (file)
@@ -1176,6 +1176,13 @@ mono_try_assembly_resolve_handle (MonoDomain *domain, MonoStringHandle fname, Mo
        params [2] = &isrefonly;
        MonoReflectionAssemblyHandle result = MONO_HANDLE_NEW (MonoReflectionAssembly, mono_runtime_invoke_checked (method, domain->domain, params, error));
        ret = !MONO_HANDLE_IS_NULL (result) ? MONO_HANDLE_GETVAL (result, assembly) : NULL;
+
+       if (ret && !refonly && ret->ref_only) {
+               /* .NET Framework throws System.IO.FileNotFoundException in this case */
+               mono_error_set_file_not_found (error, "AssemblyResolveEvent handlers cannot return Assemblies loaded for reflection only");
+               ret = NULL;
+               goto leave;
+       }
 leave:
        HANDLE_FUNCTION_RETURN_VAL (ret);
 }