return NULL;
}
+static gboolean
+prevent_running_reference_assembly (MonoAssembly *ass, MonoError *error)
+{
+ mono_error_init (error);
+ gboolean refasm = mono_assembly_get_reference_assembly_attribute (ass, error);
+ if (!is_ok (error))
+ return TRUE;
+ if (refasm) {
+ mono_error_set_bad_image (error, ass->image, "Could not load file or assembly or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context.\n");
+ return TRUE;
+ }
+ return FALSE;
+}
+
MonoReflectionAssembly *
ves_icall_System_Reflection_Assembly_LoadFrom (MonoString *fname, MonoBoolean refOnly)
{
MonoDomain *domain = mono_domain_get ();
char *name, *filename;
MonoImageOpenStatus status = MONO_IMAGE_OK;
- MonoAssembly *ass;
+ MonoAssembly *ass = NULL;
+
+ name = NULL;
+ result = NULL;
+
+ mono_error_init (&error);
if (fname == NULL) {
- MonoException *exc = mono_get_exception_argument_null ("assemblyFile");
- mono_set_pending_exception (exc);
- return NULL;
+ mono_error_set_argument_null (&error, "assemblyFile", "");
+ goto leave;
}
name = filename = mono_string_to_utf8_checked (fname, &error);
- if (mono_error_set_pending_exception (&error))
- return NULL;
+ if (!is_ok (&error))
+ goto leave;
ass = mono_assembly_open_full (filename, &status, refOnly);
if (!ass) {
- MonoException *exc;
-
if (status == MONO_IMAGE_IMAGE_INVALID)
- exc = mono_get_exception_bad_image_format2 (NULL, fname);
+ mono_error_set_bad_image_name (&error, name, "");
else
- exc = mono_get_exception_file_not_found2 (NULL, fname);
- g_free (name);
- mono_set_pending_exception (exc);
- return NULL;
+ mono_error_set_exception_instance (&error, mono_get_exception_file_not_found2 (NULL, fname));
+ goto leave;
}
- g_free (name);
+ if (!refOnly && prevent_running_reference_assembly (ass, &error))
+ goto leave;
result = mono_assembly_get_object_checked (domain, ass, &error);
- if (!result)
- mono_error_set_pending_exception (&error);
+
+leave:
+ mono_error_set_pending_exception (&error);
+ g_free (name);
return result;
}
return NULL;
}
+ if (!refonly && prevent_running_reference_assembly (ass, &error)) {
+ mono_error_set_pending_exception (&error);
+ return NULL;
+ }
+
refass = mono_assembly_get_object_checked (domain, ass, &error);
if (!refass)
mono_error_set_pending_exception (&error);
MonoAssembly *ass;
MonoAssemblyName aname;
MonoReflectionAssembly *refass = NULL;
- gchar *name;
+ gchar *name = NULL;
gboolean parsed;
g_assert (assRef);
if (mono_error_set_pending_exception (&error))
return NULL;
parsed = mono_assembly_name_parse (name, &aname);
- g_free (name);
if (!parsed) {
/* This is a parse error... */
if (!refOnly) {
refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly, &error);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
- }
+ if (!is_ok (&error))
+ goto leave;
}
return refass;
}
/* MS.NET doesn't seem to call the assembly resolve handler for refonly assemblies */
if (!refOnly) {
refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly, &error);
- if (!mono_error_ok (&error)) {
- mono_error_set_pending_exception (&error);
- return NULL;
- }
+ if (!is_ok (&error))
+ goto leave;
}
else
refass = NULL;
- if (!refass) {
- return NULL;
- }
+ if (!refass)
+ goto leave;
+ ass = refass->assembly;
}
- if (refass == NULL)
+ if (!refOnly && prevent_running_reference_assembly (ass, &error))
+ goto leave;
+
+ g_assert (ass);
+ if (refass == NULL) {
refass = mono_assembly_get_object_checked (domain, ass, &error);
+ if (!is_ok (&error))
+ goto leave;
+ }
- if (refass == NULL)
- mono_error_set_pending_exception (&error);
- else
- MONO_OBJECT_SETREF (refass, evidence, evidence);
+ MONO_OBJECT_SETREF (refass, evidence, evidence);
+
+leave:
+ g_free (name);
+ mono_error_set_pending_exception (&error);
return refass;
}
aname.major, aname.minor, aname.build, aname.revision,
strlen ((char*)aname.public_key_token) == 0 ? "(none)" : (char*)aname.public_key_token, extra_msg);
g_free (extra_msg);
+
+ } else if (!image->assembly->ref_only) {
+ MonoError error;
+ if (mono_assembly_get_reference_assembly_attribute (reference, &error)) {
+ mono_trace (G_LOG_LEVEL_WARNING, MONO_TRACE_ASSEMBLY, "The following reference assembly assembly referenced from %s was not loaded. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context:\n"
+ " Assembly: %s (assemblyref_index=%d)\n"
+ " Version: %d.%d.%d.%d\n"
+ " Public Key: %s\n",
+ image->name, aname.name, index,
+ aname.major, aname.minor, aname.build, aname.revision,
+ strlen ((char*)aname.public_key_token) == 0 ? "(none)" : (char*)aname.public_key_token);
+ reference = NULL; /* don't load reference assemblies for execution */
+ }
+ if (!is_ok (&error)) {
+ reference = NULL;
+ mono_error_cleanup (&error);
+ }
}
mono_assemblies_lock ();