[appdomain] Catch exceptions when invoking AppDomain.DoAssemblyResolve
authorAleksey Kliger <aleksey@xamarin.com>
Fri, 8 Sep 2017 18:21:53 +0000 (14:21 -0400)
committerAleksey Kliger (λgeek) <akliger@gmail.com>
Tue, 12 Sep 2017 17:11:20 +0000 (13:11 -0400)
Otherwise we may leak a coop handle for the requesting assembly, which may
lead to an assertion when we unload the current domain.

mono/metadata/appdomain.c

index 2e02c9f8cff57d9cae8b746c28ccbe163c1ef2e4..e04b84a7253da2ddaad0d46069337cf8e7ddd81d 100644 (file)
@@ -1174,7 +1174,13 @@ mono_try_assembly_resolve_handle (MonoDomain *domain, MonoStringHandle fname, Mo
        params [0] = MONO_HANDLE_RAW (fname);
        params[1] = requesting ? MONO_HANDLE_RAW (requesting_handle) : NULL;
        params [2] = &isrefonly;
-       MonoReflectionAssemblyHandle result = MONO_HANDLE_NEW (MonoReflectionAssembly, mono_runtime_invoke_checked (method, domain->domain, params, error));
+       MonoObject *exc = NULL;
+       MonoReflectionAssemblyHandle result = MONO_HANDLE_NEW (MonoReflectionAssembly, mono_runtime_try_invoke (method, domain->domain, params, &exc, error));
+       if (!is_ok (error) || exc != NULL) {
+               if (is_ok (error))
+                       mono_error_set_exception_instance (error, (MonoException*)exc);
+               goto leave;
+       }
        ret = !MONO_HANDLE_IS_NULL (result) ? MONO_HANDLE_GETVAL (result, assembly) : NULL;
 
        if (ret && !refonly && ret->ref_only) {