MonoAssembly *
mono_assembly_open_full (const char *filename, MonoImageOpenStatus *status, gboolean refonly)
{
+ return mono_assembly_open_a_lot (filename, status, refonly, FALSE);
+}
+
+MonoAssembly *
+mono_assembly_open_a_lot (const char *filename, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context)
+{
+
MonoImage *image;
MonoAssembly *ass;
MonoImageOpenStatus def_status;
}
if (!image)
- image = mono_image_open_full (fname, status, refonly);
+ image = mono_image_open_a_lot (fname, status, refonly, load_from_context);
if (!image){
if (*status == MONO_IMAGE_OK)
goto invalid_image;
if (!image->ref_only && is_problematic_image (image)) {
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Denying load of problematic image %s", image->name);
- *status = MONO_IMAGE_IMAGE_INVALID;
- goto invalid_image;
+ if (image->load_from_context) {
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Loading problematic image %s", image->name);
+ } else {
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Denying load of problematic image %s", image->name);
+ *status = MONO_IMAGE_IMAGE_INVALID;
+ goto invalid_image;
+ }
}
if (image->loader == &pe_loader && !image->metadata_only && !mono_verifier_verify_table_data (image, &errors))
static MonoImage *
do_mono_image_open (const char *fname, MonoImageOpenStatus *status,
- gboolean care_about_cli, gboolean care_about_pecoff, gboolean refonly, gboolean metadata_only)
+ gboolean care_about_cli, gboolean care_about_pecoff, gboolean refonly, gboolean metadata_only, gboolean load_from_context)
{
MonoCLIImageInfo *iinfo;
MonoImage *image;
image->name = mono_path_resolve_symlinks (fname);
image->ref_only = refonly;
image->metadata_only = metadata_only;
+ image->load_from_context = load_from_context;
image->ref_count = 1;
/* if MONO_SECURITY_MODE_CORE_CLR is set then determine if this image is platform code */
image->core_clr_platform_code = mono_security_core_clr_determine_platform_image (image);
MonoImage *
mono_image_open_full (const char *fname, MonoImageOpenStatus *status, gboolean refonly)
+{
+ return mono_image_open_a_lot (fname, status, refonly, FALSE);
+}
+
+MonoImage *
+mono_image_open_a_lot (const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context)
{
MonoImage *image;
GHashTable *loaded_images = get_loaded_images_hash (refonly);
mono_images_unlock ();
// Image not loaded, load it now
- image = do_mono_image_open (fname, status, TRUE, TRUE, refonly, FALSE);
+ image = do_mono_image_open (fname, status, TRUE, TRUE, refonly, FALSE, load_from_context);
if (image == NULL)
return NULL;
{
g_return_val_if_fail (fname != NULL, NULL);
- return do_mono_image_open (fname, status, FALSE, TRUE, FALSE, FALSE);
+ return do_mono_image_open (fname, status, FALSE, TRUE, FALSE, FALSE, FALSE);
}
/**
{
g_return_val_if_fail (fname != NULL, NULL);
- return do_mono_image_open (fname, status, FALSE, FALSE, FALSE, FALSE);
+ return do_mono_image_open (fname, status, FALSE, FALSE, FALSE, FALSE, FALSE);
}
/*
MonoImage *
mono_image_open_metadata_only (const char *fname, MonoImageOpenStatus *status)
{
- return do_mono_image_open (fname, status, TRUE, TRUE, FALSE, TRUE);
+ return do_mono_image_open (fname, status, TRUE, TRUE, FALSE, TRUE, FALSE);
}
void