X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fassembly.c;h=684a401c95919b0ccce2a70159eb022884260ffb;hb=d378fc8ede4e5ba95ec1e129ff9e1f1c74e3d187;hp=93fbd89b7cb5c63ab770f96a9113bff6d831c129;hpb=d7e3698dbc06b268c564cd3a41a50902b01012e4;p=mono.git diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c index 93fbd89b7cb..684a401c959 100644 --- a/mono/metadata/assembly.c +++ b/mono/metadata/assembly.c @@ -50,7 +50,7 @@ #include #endif -#ifdef PLATFORM_MACOSX +#ifdef HOST_DARWIN #include #endif @@ -89,7 +89,7 @@ static char **assemblies_path = NULL; /* Contains the list of directories that point to auxiliary GACs */ static char **extra_gac_paths = NULL; -#ifndef DISABLE_ASSEMBLY_REMAPPING +#ifndef DISABLE_DESKTOP_LOADER #define FACADE_ASSEMBLY(str) {str, 0, NULL, FALSE, TRUE} @@ -123,6 +123,9 @@ static const AssemblyVersionMap framework_assemblies [] = { {"Microsoft.Build.Utilities.v3.5", 2, "Microsoft.Build.Utilities.v4.0"}, {"Microsoft.VisualBasic", 1}, {"Microsoft.VisualC", 1}, + FACADE_ASSEMBLY ("Microsoft.Win32.Primitives"), + FACADE_ASSEMBLY ("Microsoft.Win32.Registry"), + FACADE_ASSEMBLY ("Microsoft.Win32.Registry.AccessControl"), {"Mono.Cairo", 0}, {"Mono.CompilerServices.SymbolWriter", 0}, {"Mono.Data", 0}, @@ -209,7 +212,6 @@ static const AssemblyVersionMap framework_assemblies [] = { {"System.Net.Http", 4}, {"System.Net.Http.Rtc", 0}, FACADE_ASSEMBLY ("System.Net.HttpListener"), - {"System.Net.NetworkInformation", 0}, FACADE_ASSEMBLY ("System.Net.Mail"), FACADE_ASSEMBLY ("System.Net.NameResolution"), FACADE_ASSEMBLY ("System.Net.NetworkInformation"), @@ -226,6 +228,7 @@ static const AssemblyVersionMap framework_assemblies [] = { {"System.Numerics.Vectors", 3}, FACADE_ASSEMBLY ("System.ObjectModel"), FACADE_ASSEMBLY ("System.Reflection"), + FACADE_ASSEMBLY ("System.Reflection.DispatchProxy"), FACADE_ASSEMBLY ("System.Reflection.Emit"), FACADE_ASSEMBLY ("System.Reflection.Emit.ILGeneration"), FACADE_ASSEMBLY ("System.Reflection.Emit.Lightweight"), @@ -239,12 +242,13 @@ static const AssemblyVersionMap framework_assemblies [] = { FACADE_ASSEMBLY ("System.Runtime.Extensions"), FACADE_ASSEMBLY ("System.Runtime.Handles"), FACADE_ASSEMBLY ("System.Runtime.InteropServices"), - {"System.Runtime.InteropServices.RuntimeInformation", 2}, + FACADE_ASSEMBLY ("System.Runtime.InteropServices.RuntimeInformation"), FACADE_ASSEMBLY ("System.Runtime.InteropServices.WindowsRuntime"), + FACADE_ASSEMBLY ("System.Runtime.Loader"), FACADE_ASSEMBLY ("System.Runtime.Numerics"), {"System.Runtime.Remoting", 0}, {"System.Runtime.Serialization", 3}, - {"System.Runtime.Serialization.Formatters", 3}, + FACADE_ASSEMBLY ("System.Runtime.Serialization.Formatters"), {"System.Runtime.Serialization.Formatters.Soap", 0}, FACADE_ASSEMBLY ("System.Runtime.Serialization.Json"), FACADE_ASSEMBLY ("System.Runtime.Serialization.Primitives"), @@ -274,11 +278,11 @@ static const AssemblyVersionMap framework_assemblies [] = { FACADE_ASSEMBLY ("System.Security.Principal.Windows"), FACADE_ASSEMBLY ("System.Security.SecureString"), {"System.ServiceModel", 3}, - {"System.ServiceModel.Duplex", 3}, - {"System.ServiceModel.Http", 3}, - {"System.ServiceModel.NetTcp", 3}, - {"System.ServiceModel.Primitives", 3}, - {"System.ServiceModel.Security", 3}, + FACADE_ASSEMBLY ("System.ServiceModel.Duplex"), + FACADE_ASSEMBLY ("System.ServiceModel.Http"), + FACADE_ASSEMBLY ("System.ServiceModel.NetTcp"), + FACADE_ASSEMBLY ("System.ServiceModel.Primitives"), + FACADE_ASSEMBLY ("System.ServiceModel.Security"), {"System.ServiceModel.Web", 2}, {"System.ServiceProcess", 0}, FACADE_ASSEMBLY ("System.ServiceProcess.ServiceController"), @@ -311,7 +315,7 @@ static const AssemblyVersionMap framework_assemblies [] = { {"System.Xml.Serialization", 0}, FACADE_ASSEMBLY ("System.Xml.XDocument"), FACADE_ASSEMBLY ("System.Xml.XPath"), - {"System.Xml.XPath.XmlDocument", 3}, + FACADE_ASSEMBLY ("System.Xml.XPath.XmlDocument"), FACADE_ASSEMBLY ("System.Xml.XPath.XDocument"), FACADE_ASSEMBLY ("System.Xml.XmlDocument"), FACADE_ASSEMBLY ("System.Xml.XmlSerializer"), @@ -328,27 +332,6 @@ static const AssemblyVersionMap framework_assemblies [] = { static GList *loaded_assemblies = NULL; static MonoAssembly *corlib; -#if defined(__native_client__) - -/* On Native Client, allow mscorlib to be loaded from memory */ -/* instead of loaded off disk. If these are not set, default */ -/* mscorlib loading will take place */ - -/* NOTE: If mscorlib data is passed to mono in this way then */ -/* it needs to remain allocated during the use of mono. */ - -static void *corlibData = NULL; -static size_t corlibSize = 0; - -void -mono_set_corlib_data (void *data, size_t size) -{ - corlibData = data; - corlibSize = size; -} - -#endif - static char* unquote (const char *str); /* This protects loaded_assemblies and image->references */ @@ -458,12 +441,6 @@ mono_set_assemblies_path (const char* path) } } -/* Native Client can't get this info from an environment variable so */ -/* it's passed in to the runtime, or set manually by embedding code. */ -#ifdef __native_client__ -char* nacl_mono_path = NULL; -#endif - static void check_path_env (void) { @@ -471,10 +448,6 @@ check_path_env (void) return; char* path = g_getenv ("MONO_PATH"); -#ifdef __native_client__ - if (!path) - path = strdup (nacl_mono_path); -#endif if (!path) return; @@ -867,7 +840,7 @@ set_dirs (char *exe) void mono_set_rootdir (void) { -#if defined(HOST_WIN32) || (defined(PLATFORM_MACOSX) && !defined(TARGET_ARM)) +#if defined(HOST_WIN32) || (defined(HOST_DARWIN) && !defined(TARGET_ARM)) gchar *bindir, *installdir, *root, *name, *resolvedname, *config; #ifdef HOST_WIN32 @@ -967,7 +940,7 @@ mono_assemblies_init (void) mono_os_mutex_init_recursive (&assemblies_mutex); mono_os_mutex_init (&assembly_binding_mutex); -#ifndef DISABLE_ASSEMBLY_REMAPPING +#ifndef DISABLE_DESKTOP_LOADER assembly_remapping_table = g_hash_table_new (g_str_hash, g_str_equal); int i; @@ -1257,7 +1230,7 @@ mono_assembly_remap_version (MonoAssemblyName *aname, MonoAssemblyName *dest_ana return dest_aname; } -#ifndef DISABLE_ASSEMBLY_REMAPPING +#ifndef DISABLE_DESKTOP_LOADER const AssemblyVersionMap *vmap = (AssemblyVersionMap *)g_hash_table_lookup (assembly_remapping_table, aname->name); if (vmap) { const AssemblyVersionSet* vset; @@ -1976,11 +1949,24 @@ mono_assembly_open_predicate (const char *filename, gboolean refonly, } if (image->assembly) { - /* Already loaded by another appdomain */ - mono_assembly_invoke_load_hook (image->assembly); - mono_image_close (image); - g_free (fname); - return image->assembly; + /* We want to return the MonoAssembly that's already loaded, + * but if we're using the strict assembly loader, we also need + * to check that the previously loaded assembly matches the + * predicate. It could be that we previously loaded a + * different version that happens to have the filename that + * we're currently probing. */ + if (mono_loader_get_strict_strong_names () && + predicate && !predicate (image->assembly, user_data)) { + mono_image_close (image); + g_free (fname); + return NULL; + } else { + /* Already loaded by another appdomain */ + mono_assembly_invoke_load_hook (image->assembly); + mono_image_close (image); + g_free (fname); + return image->assembly; + } } ass = mono_assembly_load_from_predicate (image, fname, refonly, predicate, user_data, status); @@ -2122,6 +2108,10 @@ has_reference_assembly_attribute_iterator (MonoImage *image, guint32 typeref_sco gboolean mono_assembly_has_reference_assembly_attribute (MonoAssembly *assembly, MonoError *error) { + g_assert (assembly && assembly->image); + /* .NET Framework appears to ignore the attribute on dynamic + * assemblies, so don't call this function for dynamic assemblies. */ + g_assert (!image_is_dynamic (assembly->image)); error_init (error); /* @@ -2232,7 +2222,7 @@ mono_assembly_load_from_predicate (MonoImage *image, const char *fname, ass->ref_only = refonly; ass->image = image; - mono_profiler_assembly_event (ass, MONO_PROFILE_START_LOAD); + MONO_PROFILER_RAISE (assembly_loading, (ass)); mono_assembly_fill_assembly_name (image, &ass->aname); @@ -2324,7 +2314,7 @@ mono_assembly_load_from_predicate (MonoImage *image, const char *fname, mono_assembly_invoke_load_hook (ass); - mono_profiler_assembly_loaded (ass, MONO_PROFILE_OK); + MONO_PROFILER_RAISE (assembly_loaded, (ass)); return ass; } @@ -2380,19 +2370,20 @@ static gboolean parse_public_key (const gchar *key, gchar** pubkey, gboolean *is_ecma) { const gchar *pkey; - gchar header [16], val, *arr; + gchar header [16], val, *arr, *endp; gint i, j, offset, bitlen, keylen, pkeylen; - + + //both pubkey and is_ecma are required arguments + g_assert (pubkey && is_ecma); + keylen = strlen (key) >> 1; if (keylen < 1) return FALSE; /* allow the ECMA standard key */ if (strcmp (key, "00000000000000000400000000000000") == 0) { - if (pubkey) { - *pubkey = g_strdup (key); - *is_ecma = TRUE; - } + *pubkey = NULL; + *is_ecma = TRUE; return TRUE; } *is_ecma = FALSE; @@ -2437,21 +2428,11 @@ parse_public_key (const gchar *key, gchar** pubkey, gboolean *is_ecma) bitlen = read32 (header + 12) >> 3; if ((bitlen + 16 + 4) != pkeylen) return FALSE; - - /* parsing is OK and the public key itself is not requested back */ - if (!pubkey) - return TRUE; + arr = (gchar *)g_malloc (keylen + 4); /* Encode the size of the blob */ - offset = 0; - if (keylen <= 127) { - arr = (gchar *)g_malloc (keylen + 1); - arr [offset++] = keylen; - } else { - arr = (gchar *)g_malloc (keylen + 2); - arr [offset++] = 0x80; /* 10bs */ - arr [offset++] = keylen; - } + mono_metadata_encode_value (keylen, &arr[0], &endp); + offset = (gint)(endp-arr); for (i = offset, j = 0; i < keylen + offset; i++) { arr [i] = g_ascii_xdigit_value (key [j++]) << 4; @@ -2469,7 +2450,7 @@ build_assembly_name (const char *name, const char *version, const char *culture, gint major, minor, build, revision; gint len; gint version_parts; - gchar *pkey, *pkeyptr, *encoded, tok [8]; + gchar *pkeyptr, *encoded, tok [8]; memset (aname, 0, sizeof (MonoAssemblyName)); @@ -2518,17 +2499,16 @@ build_assembly_name (const char *name, const char *version, const char *culture, } if (key) { - gboolean is_ecma; + gboolean is_ecma = FALSE; + gchar *pkey = NULL; if (strcmp (key, "null") == 0 || !parse_public_key (key, &pkey, &is_ecma)) { mono_assembly_name_free (aname); return FALSE; } if (is_ecma) { - if (save_public_key) - aname->public_key = (guint8*)pkey; - else - g_free (pkey); + g_assert (pkey == NULL); + aname->public_key = NULL; g_strlcpy ((gchar*)aname->public_key_token, "b77a5c561934e089", MONO_PUBLIC_KEY_TOKEN_LENGTH); return TRUE; } @@ -3488,23 +3468,6 @@ mono_assembly_load_corlib (const MonoRuntimeInfo *runtime, MonoImageOpenStatus * return corlib; } - // In native client, Corlib is embedded in the executable as static variable corlibData -#if defined(__native_client__) - if (corlibData != NULL && corlibSize != 0) { - int status = 0; - /* First "FALSE" instructs mono not to make a copy. */ - /* Second "FALSE" says this is not just a ref. */ - MonoImage* image = mono_image_open_from_data_full (corlibData, corlibSize, FALSE, &status, FALSE); - if (image == NULL || status != 0) - g_print("mono_image_open_from_data_full failed: %d\n", status); - corlib = mono_assembly_load_from_full (image, "mscorlib", &status, FALSE); - if (corlib == NULL || status != 0) - g_print ("mono_assembly_load_from_full failed: %d\n", status); - if (corlib) - return corlib; - } -#endif - // A nonstandard preload hook may provide a special mscorlib assembly aname = mono_assembly_name_new ("mscorlib.dll"); corlib = invoke_assembly_preload_hook (aname, assemblies_path); @@ -3533,7 +3496,7 @@ mono_assembly_load_corlib (const MonoRuntimeInfo *runtime, MonoImageOpenStatus * g_free (corlib_file); return_corlib_and_facades: - if (corlib) + if (corlib && !strcmp (runtime->framework_version, "4.5")) // FIXME: stop hardcoding 4.5 here default_path [1] = g_strdup_printf ("%s/Facades", corlib->basedir); return corlib; @@ -3544,8 +3507,11 @@ prevent_reference_assembly_from_running (MonoAssembly* candidate, gboolean refon { MonoError refasm_error; error_init (&refasm_error); - if (candidate && !refonly && mono_assembly_has_reference_assembly_attribute (candidate, &refasm_error)) { - candidate = NULL; + if (candidate && !refonly) { + /* .NET Framework seems to not check for ReferenceAssemblyAttribute on dynamic assemblies */ + if (!image_is_dynamic (candidate->image) && + mono_assembly_has_reference_assembly_attribute (candidate, &refasm_error)) + candidate = NULL; } mono_error_cleanup (&refasm_error); return candidate; @@ -3600,7 +3566,7 @@ exact_sn_match (MonoAssemblyName *wanted_name, MonoAssemblyName *candidate_name) gboolean framework_assembly_sn_match (MonoAssemblyName *wanted_name, MonoAssemblyName *candidate_name) { -#ifndef DISABLE_ASSEMBLY_REMAPPING +#ifndef DISABLE_DESKTOP_LOADER const AssemblyVersionMap *vmap = (AssemblyVersionMap *)g_hash_table_lookup (assembly_remapping_table, wanted_name->name); if (vmap) { if (!vmap->framework_facade_assembly) { @@ -3657,6 +3623,15 @@ mono_assembly_load_full_nosearch (MonoAssemblyName *aname, return mono_assembly_load_corlib (mono_get_runtime_info (), status); } + MonoAssemblyCandidatePredicate predicate = NULL; + void* predicate_ud = NULL; +#if !defined(DISABLE_DESKTOP_LOADER) + 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); for (ext_index = 0; ext_index < 2; ext_index ++) { ext = ext_index == 0 ? ".dll" : ".exe"; @@ -3676,7 +3651,7 @@ mono_assembly_load_full_nosearch (MonoAssemblyName *aname, if (basedir) { fullpath = g_build_filename (basedir, filename, NULL); - result = mono_assembly_open_predicate (fullpath, refonly, FALSE, &mono_assembly_candidate_predicate_sn_same_name, aname, status); + result = mono_assembly_open_predicate (fullpath, refonly, FALSE, predicate, predicate_ud, status); g_free (fullpath); if (result) { result->in_gac = FALSE; @@ -3685,7 +3660,7 @@ mono_assembly_load_full_nosearch (MonoAssemblyName *aname, } } - result = load_in_path (filename, default_path, status, refonly, &mono_assembly_candidate_predicate_sn_same_name, aname); + result = load_in_path (filename, default_path, status, refonly, predicate, predicate_ud); if (result) result->in_gac = FALSE; g_free (filename); @@ -3819,7 +3794,7 @@ mono_assembly_close_except_image_pools (MonoAssembly *assembly) if (InterlockedDecrement (&assembly->ref_count) > 0) return FALSE; - mono_profiler_assembly_event (assembly, MONO_PROFILE_START_UNLOAD); + MONO_PROFILER_RAISE (assembly_unloading, (assembly)); mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Unloading assembly %s [%p].", assembly->aname.name, assembly); @@ -3842,7 +3817,7 @@ mono_assembly_close_except_image_pools (MonoAssembly *assembly) g_slist_free (assembly->friend_assembly_names); g_free (assembly->basedir); - mono_profiler_assembly_event (assembly, MONO_PROFILE_END_UNLOAD); + MONO_PROFILER_RAISE (assembly_unloaded, (assembly)); return TRUE; }