[runtime] Add --assembly-loader=[strict,legacy] runtime argument
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 26 Apr 2017 21:46:54 +0000 (17:46 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Wed, 26 Apr 2017 23:09:45 +0000 (19:09 -0400)
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).

mono/metadata/appdomain.c
mono/metadata/assembly.c
mono/metadata/metadata-internals.h
mono/metadata/metadata.c
mono/mini/driver.c

index 5d02e33b69bd6c6d7ab7ff5b343a91d91c373495..dfab9b8a7dcc3bb64ffdf4c448065b1128cfe66b 100644 (file)
@@ -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)) {
index dd76d79cca1dbdcdde559a62dbc66c2b2f3fa301..7210b012bb7dc2e517a7352277d30e80618cb1f6 100644 (file)
@@ -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);
index b1613fddc6faa72a156b6361486e9ab9d3a282a2..a6a936758e66e1794a69b848902a47c722075e89 100644 (file)
@@ -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__ */
 
index 54699c48ed7d833a7622464169ef23d2eb29489f..78dece0b24e910d5f458ca2842e47afe6d883305 100644 (file)
@@ -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;
+}
index 7b2d9ef53b81577e0c2dbb710581335ddacb275b..35f178709339b3da503bc0142de79b51b8caef7b 100644 (file)
@@ -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)) {