From: Aleksey Kliger Date: Wed, 26 Apr 2017 21:46:54 +0000 (-0400) Subject: [runtime] Add --assembly-loader=[strict,legacy] runtime argument X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=5dd2290ef2738ee2e708953dcb83c1822358d184;p=mono.git [runtime] Add --assembly-loader=[strict,legacy] runtime argument If mono is compiled without DISABLE_STRICT_STRONG_NAMES, but someone passes --assembly-loader=legacy at runtime, give them the lax strong name checking behavior (a candidate assembly is good as long as the name is right, but ignoring the public key token and version). --- diff --git a/mono/metadata/appdomain.c b/mono/metadata/appdomain.c index 5d02e33b69b..dfab9b8a7dc 100644 --- a/mono/metadata/appdomain.c +++ b/mono/metadata/appdomain.c @@ -2005,8 +2005,10 @@ mono_domain_assembly_preload (MonoAssemblyName *aname, MonoAssemblyCandidatePredicate predicate = NULL; void* predicate_ud = NULL; #if !defined(DISABLE_STRICT_STRONG_NAMES) - predicate = &mono_assembly_candidate_predicate_sn_same_name; - predicate_ud = aname; + if (G_LIKELY (mono_loader_get_strict_strong_names ())) { + predicate = &mono_assembly_candidate_predicate_sn_same_name; + predicate_ud = aname; + } #endif if (domain->search_path && domain->search_path [0] != NULL) { if (mono_trace_is_traced (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY)) { diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c index dd76d79cca1..7210b012bb7 100644 --- a/mono/metadata/assembly.c +++ b/mono/metadata/assembly.c @@ -3660,8 +3660,10 @@ mono_assembly_load_full_nosearch (MonoAssemblyName *aname, MonoAssemblyCandidatePredicate predicate = NULL; void* predicate_ud = NULL; #if !defined(DISABLE_STRICT_STRONG_NAMES) - predicate = &mono_assembly_candidate_predicate_sn_same_name; - predicate_ud = aname; + if (G_LIKELY (mono_loader_get_strict_strong_names ())) { + predicate = &mono_assembly_candidate_predicate_sn_same_name; + predicate_ud = aname; + } #endif len = strlen (aname->name); diff --git a/mono/metadata/metadata-internals.h b/mono/metadata/metadata-internals.h index b1613fddc6f..a6a936758e6 100644 --- a/mono/metadata/metadata-internals.h +++ b/mono/metadata/metadata-internals.h @@ -944,5 +944,11 @@ mono_assembly_is_problematic_version (const char *name, guint16 major, guint16 m void mono_ginst_get_desc (GString *str, MonoGenericInst *ginst); +void +mono_loader_set_strict_strong_names (gboolean enabled); + +gboolean +mono_loader_get_strict_strong_names (void); + #endif /* __MONO_METADATA_INTERNALS_H__ */ diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index 54699c48ed7..78dece0b24e 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -519,6 +519,13 @@ mono_tables_names [] = { #endif +/* If TRUE (but also see DISABLE_STICT_STRONG_NAMES #define), Mono will check + * that the public key token and version of a candidate assembly matches the + * requested strong name. If FALSE, as long as the name matches, the candidate + * will be allowed. + */ +static gboolean check_strong_names_strictly = TRUE; + // Amount initially reserved in each imageset's mempool. // FIXME: This number is arbitrary, a more practical number should be found #define INITIAL_IMAGE_SET_SIZE 1024 @@ -6919,3 +6926,15 @@ mono_find_image_set_owner (void *ptr) return owner; } + +void +mono_loader_set_strict_strong_names (gboolean enabled) +{ + check_strong_names_strictly = enabled; +} + +gboolean +mono_loader_get_strict_strong_names (void) +{ + return check_strong_names_strictly; +} diff --git a/mono/mini/driver.c b/mono/mini/driver.c index 7b2d9ef53b8..35f17870933 100644 --- a/mono/mini/driver.c +++ b/mono/mini/driver.c @@ -1941,6 +1941,14 @@ mono_main (int argc, char* argv[]) } else if (strcmp (argv [i], "--nacl-null-checks-off") == 0){ nacl_null_checks_off = TRUE; #endif + } else if (strncmp (argv [i], "--assembly-loader=", strlen("--assembly-loader=")) == 0) { + gchar *arg = argv [i] + strlen ("--assembly-loader="); + if (strcmp (arg, "strict") == 0) + mono_loader_set_strict_strong_names (TRUE); + else if (strcmp (arg, "legacy") == 0) + mono_loader_set_strict_strong_names (FALSE); + else + fprintf (stderr, "Warning: unknown argument to --assembly-loader. Should be \"strict\" or \"legacy\"\n"); } else if (strncmp (argv [i], MONO_HANDLERS_ARGUMENT, MONO_HANDLERS_ARGUMENT_LEN) == 0) { //Install specific custom handlers. if (!mono_runtime_install_custom_handlers (argv[i] + MONO_HANDLERS_ARGUMENT_LEN)) {