Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Safar <marek.safar@gmail.com>2016-09-23 16:22:30 +0300
committerMarek Safar <marek.safar@gmail.com>2016-09-23 16:22:30 +0300
commit8c9e34069f63e516038cd12a237d648079789622 (patch)
tree3ed5c780d049c050e35287d7c665a70e743c92c6
parent2d42ab4efda44e3bb6489acfc43ae95c3788d208 (diff)
Revert "Merge pull request #3495 from lambdageek/c8-bug-42584"
This reverts commit bdce6068d50f0db1a69687cc883bf1bf519f25fa, reversing changes made to acdffe0309ad98536e6349f999954748d8339e4b.
-rw-r--r--mono/metadata/appdomain.c93
-rw-r--r--mono/metadata/assembly.c49
-rw-r--r--mono/metadata/class.c1
-rw-r--r--mono/metadata/domain-internals.h4
-rw-r--r--mono/metadata/domain.c10
-rw-r--r--mono/tests/Makefile.am20
-rw-r--r--mono/tests/TestingReferenceAssembly.cs7
-rw-r--r--mono/tests/TestingReferenceReferenceAssembly.cs7
-rw-r--r--mono/tests/reference-loader.cs111
9 files changed, 39 insertions, 263 deletions
diff --git a/mono/metadata/appdomain.c b/mono/metadata/appdomain.c
index 9b73ccd2bbd..579b93afc11 100644
--- a/mono/metadata/appdomain.c
+++ b/mono/metadata/appdomain.c
@@ -1927,20 +1927,6 @@ mono_domain_assembly_search (MonoAssemblyName *aname,
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)
{
@@ -1949,40 +1935,37 @@ ves_icall_System_Reflection_Assembly_LoadFrom (MonoString *fname, MonoBoolean re
MonoDomain *domain = mono_domain_get ();
char *name, *filename;
MonoImageOpenStatus status = MONO_IMAGE_OK;
- MonoAssembly *ass = NULL;
-
- name = NULL;
- result = NULL;
-
- mono_error_init (&error);
+ MonoAssembly *ass;
if (fname == NULL) {
- mono_error_set_argument_null (&error, "assemblyFile", "");
- goto leave;
+ MonoException *exc = mono_get_exception_argument_null ("assemblyFile");
+ mono_set_pending_exception (exc);
+ return NULL;
}
name = filename = mono_string_to_utf8_checked (fname, &error);
- if (!is_ok (&error))
- goto leave;
+ if (mono_error_set_pending_exception (&error))
+ return NULL;
ass = mono_assembly_open_full (filename, &status, refOnly);
if (!ass) {
+ MonoException *exc;
+
if (status == MONO_IMAGE_IMAGE_INVALID)
- mono_error_set_bad_image_name (&error, name, "");
+ exc = mono_get_exception_bad_image_format2 (NULL, fname);
else
- mono_error_set_exception_instance (&error, mono_get_exception_file_not_found2 (NULL, fname));
- goto leave;
+ exc = mono_get_exception_file_not_found2 (NULL, fname);
+ g_free (name);
+ mono_set_pending_exception (exc);
+ return NULL;
}
- if (!refOnly && prevent_running_reference_assembly (ass, &error))
- goto leave;
+ g_free (name);
result = mono_assembly_get_object_checked (domain, ass, &error);
-
-leave:
- mono_error_set_pending_exception (&error);
- g_free (name);
+ if (!result)
+ mono_error_set_pending_exception (&error);
return result;
}
@@ -2017,11 +2000,6 @@ ves_icall_System_AppDomain_LoadAssemblyRaw (MonoAppDomain *ad,
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);
@@ -2039,7 +2017,7 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad, MonoString *assRef,
MonoAssembly *ass;
MonoAssemblyName aname;
MonoReflectionAssembly *refass = NULL;
- gchar *name = NULL;
+ gchar *name;
gboolean parsed;
g_assert (assRef);
@@ -2048,13 +2026,16 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad, MonoString *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 (!is_ok (&error))
- goto leave;
+ if (!mono_error_ok (&error)) {
+ mono_error_set_pending_exception (&error);
+ return NULL;
+ }
}
return refass;
}
@@ -2066,31 +2047,25 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad, MonoString *assRef,
/* 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 (!is_ok (&error))
- goto leave;
+ if (!mono_error_ok (&error)) {
+ mono_error_set_pending_exception (&error);
+ return NULL;
+ }
}
else
refass = NULL;
- if (!refass)
- goto leave;
- ass = refass->assembly;
+ if (!refass) {
+ return NULL;
+ }
}
- if (!refOnly && prevent_running_reference_assembly (ass, &error))
- goto leave;
-
- g_assert (ass);
- if (refass == NULL) {
+ if (refass == NULL)
refass = mono_assembly_get_object_checked (domain, ass, &error);
- if (!is_ok (&error))
- goto leave;
- }
-
- MONO_OBJECT_SETREF (refass, evidence, evidence);
-leave:
- g_free (name);
- mono_error_set_pending_exception (&error);
+ if (refass == NULL)
+ mono_error_set_pending_exception (&error);
+ else
+ MONO_OBJECT_SETREF (refass, evidence, evidence);
return refass;
}
diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c
index 7bd02ff37ee..57ce86ba71f 100644
--- a/mono/metadata/assembly.c
+++ b/mono/metadata/assembly.c
@@ -203,7 +203,6 @@ static GSList *loaded_assembly_bindings = NULL;
/* Class lazy loading functions */
static GENERATE_TRY_GET_CLASS_WITH_CACHE (internals_visible, System.Runtime.CompilerServices, InternalsVisibleToAttribute)
-static GENERATE_TRY_GET_CLASS_WITH_CACHE (reference_assembly, System.Runtime.CompilerServices, ReferenceAssemblyAttribute)
static MonoAssembly*
mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, MonoAssembly *requesting, gboolean refonly, gboolean postload);
@@ -1176,23 +1175,6 @@ mono_assembly_load_reference (MonoImage *image, int index)
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 ();
@@ -1806,37 +1788,6 @@ mono_assembly_load_friends (MonoAssembly* ass)
mono_assemblies_unlock ();
}
-
-/**
- * mono_assembly_get_reference_assembly_attribute:
- * @assembly: a MonoAssembly
- * @error: set on error.
- *
- * Returns TRUE if @assembly has the System.Runtime.CompilerServices.ReferenceAssemblyAttribute set.
- * On error returns FALSE and sets @error.
- */
-gboolean
-mono_assembly_get_reference_assembly_attribute (MonoAssembly *assembly, MonoError *error)
-{
- mono_error_init (error);
-
- MonoCustomAttrInfo *attrs = mono_custom_attrs_from_assembly_checked (assembly, error);
- return_val_if_nok (error, FALSE);
- if (!attrs)
- return FALSE;
- MonoClass *ref_asm_class = mono_class_try_get_reference_assembly_class ();
- gboolean result = FALSE;
- for (int i = 0; i < attrs->num_attrs; ++i) {
- MonoCustomAttrEntry *attr = &attrs->attrs [i];
- if (attr->ctor && attr->ctor->klass && attr->ctor->klass == ref_asm_class) {
- result = TRUE;
- break;
- }
- }
- mono_custom_attrs_free (attrs);
- return result;
-}
-
/**
* mono_assembly_open:
* @filename: Opens the assembly pointed out by this name
diff --git a/mono/metadata/class.c b/mono/metadata/class.c
index 56e12ad673e..17da478b5e9 100644
--- a/mono/metadata/class.c
+++ b/mono/metadata/class.c
@@ -5544,7 +5544,6 @@ mono_class_setup_parent (MonoClass *klass, MonoClass *parent)
/* set the parent to something useful and safe, but mark the type as broken */
parent = mono_defaults.object_class;
mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, NULL);
- g_assert (parent);
}
klass->parent = parent;
diff --git a/mono/metadata/domain-internals.h b/mono/metadata/domain-internals.h
index 5a4269b6d8f..a3989ab74aa 100644
--- a/mono/metadata/domain-internals.h
+++ b/mono/metadata/domain-internals.h
@@ -697,8 +697,4 @@ mono_runtime_init_checked (MonoDomain *domain, MonoThreadStartCB start_cb, MonoT
void
mono_context_init_checked (MonoDomain *domain, MonoError *error);
-gboolean
-mono_assembly_get_reference_assembly_attribute (MonoAssembly *assembly, MonoError *error);
-
-
#endif /* __MONO_METADATA_DOMAIN_INTERNALS_H__ */
diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c
index 93aced664f9..a3ba4a76e04 100644
--- a/mono/metadata/domain.c
+++ b/mono/metadata/domain.c
@@ -807,16 +807,6 @@ mono_init_internal (const char *filename, const char *exe_filename, const char *
mono_profiler_appdomain_name (domain, domain->friendly_name);
- /* Have to do this quite late so that we at least have System.Object */
- MonoError custom_attr_error;
- if (mono_assembly_get_reference_assembly_attribute (ass, &custom_attr_error)) {
- char *corlib_file = g_build_filename (mono_assembly_getrootdir (), "mono", current_runtime->framework_version, "mscorlib.dll", NULL);
- g_print ("Could not load file or assembly %s. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context.", corlib_file);
- g_free (corlib_file);
- exit (1);
- }
- mono_error_assert_ok (&custom_attr_error);
-
return domain;
}
diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am
index f0f7def44b8..cf5eada2f40 100644
--- a/mono/tests/Makefile.am
+++ b/mono/tests/Makefile.am
@@ -436,8 +436,7 @@ BASE_TEST_CS_SRC= \
pinvoke_ppci.cs \
pinvoke_ppcf.cs \
pinvoke_ppcd.cs \
- bug-29585.cs \
- reference-loader.cs
+ bug-29585.cs
TEST_CS_SRC_DIST= \
$(BASE_TEST_CS_SRC) \
@@ -701,13 +700,11 @@ TEST_IL_SRC= \
# but that need to be compiled
PREREQ_IL_SRC=event-il.il module-cctor.il
PREREQ_CS_SRC=
-PREREQ_IL_DLL_SRC=
-PREREQ_CS_DLL_SRC=TestingReferenceAssembly.cs TestingReferenceReferenceAssembly.cs
+PREREQ_IL_DLL_SRC=event-il.il module-cctor.il
+PREREQ_CS_DLL_SRC=
-PREREQSI_IL=$(PREREQ_IL_SRC:.il=.exe) \
- $(PREREQ_IL_DLL_SRC:.il=.dll)
-PREREQSI_CS=$(PREREQ_CS_SRC:.cs=.exe) \
- $(PREREQ_CS_DLL_SRC:.cs=.dll)
+PREREQSI_IL=$(PREREQ_IL_SRC:.il=.exe)
+PREREQSI_CS=$(PREREQ_CS_SRC:.cs=.exe)
TESTSI_CS=$(TEST_CS_SRC:.cs=.exe)
TESTSI_IL=$(TEST_IL_SRC:.il=.exe)
TESTBS=$(BENCHSRC:.cs=.exe)
@@ -722,13 +719,6 @@ EXTRA_DIST=test-driver test-runner.cs $(TEST_CS_SRC_DIST) $(TEST_IL_SRC) \
%.exe: %.cs TestDriver.dll
$(MCS) -r:System.dll -r:System.Xml.dll -r:System.Core.dll -r:TestDriver.dll -r:Mono.Posix.dll -out:$@ $<
-%.dll: %.cs
- $(MCS) -r:System.dll -target:library -out:$@ $<
-
-TestingReferenceReferenceAssembly.dll: TestingReferenceReferenceAssembly.cs TestingReferenceAssembly.dll
- $(MCS) -r:TestingReferenceAssembly.dll -target:library -out:$@ $<
-
-
# mkbundle works on ppc, but the pkg-config POC doesn't when run with make test
if POWERPC
test_platform:
diff --git a/mono/tests/TestingReferenceAssembly.cs b/mono/tests/TestingReferenceAssembly.cs
deleted file mode 100644
index e68a2c8dd13..00000000000
--- a/mono/tests/TestingReferenceAssembly.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using System.Runtime.CompilerServices;
-
-[assembly: ReferenceAssemblyAttribute]
-
-public class X {
- public int Y;
-}
diff --git a/mono/tests/TestingReferenceReferenceAssembly.cs b/mono/tests/TestingReferenceReferenceAssembly.cs
deleted file mode 100644
index 0acb6f1b415..00000000000
--- a/mono/tests/TestingReferenceReferenceAssembly.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-// An assembly that refereces the TestingReferenceAssembly
-
-class Z : X {
- public Z () {
- Y = 1;
- }
-}
diff --git a/mono/tests/reference-loader.cs b/mono/tests/reference-loader.cs
deleted file mode 100644
index 9cdda7a719c..00000000000
--- a/mono/tests/reference-loader.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// reference-loader.cs:
-//
-// Test for reference assembly loading
-
-using System;
-using System.IO;
-using System.Reflection;
-
-public class Tests {
- public static int Main (string[] args)
- {
- return TestDriver.RunTests (typeof (Tests), args);
- }
-
- public static int test_0_loadFrom_reference ()
- {
- // Check that loading a reference assembly by filename for execution is an error
- try {
- var a = Assembly.LoadFrom ("./TestingReferenceAssembly.dll");
- } catch (BadImageFormatException exn) {
- // Console.Error.WriteLine ("exn was {0}", exn);
- return 0;
- }
- return 1;
- }
-
- public static int test_0_load_reference ()
- {
- // Check that loading a reference assembly for execution is an error
- try {
- var an = new AssemblyName ("TestingReferenceAssembly");
- var a = Assembly.Load (an);
- } catch (BadImageFormatException exn) {
- //Console.Error.WriteLine ("exn was {0}", exn);
- return 0;
- } catch (FileNotFoundException exn) {
- Console.Error.WriteLine ("incorrect exn was {0}", exn);
- return 2;
- }
- return 1;
- }
-
- public static int test_0_reflection_load_reference ()
- {
- // Check that reflection-only loading a reference assembly is okay
- var an = new AssemblyName ("TestingReferenceAssembly");
- var a = Assembly.ReflectionOnlyLoad (an.FullName);
- var t = a.GetType ("X");
- var f = t.GetField ("Y");
- if (f.FieldType.Equals (typeof (Int32)))
- return 0;
- return 1;
- }
-
- public static int test_0_load_reference_asm_via_reference ()
- {
- // Check that loading an assembly that references a reference assembly doesn't succeed.
- var an = new AssemblyName ("TestingReferenceReferenceAssembly");
- try {
- var a = Assembly.Load (an);
- var t = a.GetType ("Z");
- } catch (FileNotFoundException){
- return 0;
- }
- return 1;
- }
-
- public static int test_0_reflection_load_reference_asm_via_reference ()
- {
- // Check that reflection-only loading an assembly that
- // references a reference assembly is okay.
- var an = new AssemblyName ("TestingReferenceReferenceAssembly");
- var a = Assembly.ReflectionOnlyLoad (an.FullName);
- var t = a.GetType ("Z");
- var f = t.GetField ("Y");
- if (f.FieldType.Equals (typeof (Int32)))
- return 0;
- return 1;
- }
-
-
- public static int test_0_load_reference_bytes ()
- {
- // Check that loading a reference assembly from a byte array for execution is an error
- byte[] bs = File.ReadAllBytes ("./TestingReferenceAssembly.dll");
- try {
- var a = Assembly.Load (bs);
- } catch (BadImageFormatException) {
- return 0;
- } catch (FileNotFoundException exn) {
- Console.Error.WriteLine ("incorrect exn was {0}", exn);
- return 2;
- }
- return 1;
- }
-
- public static int test_0_reflection_load_reference_bytes ()
- {
- // Check that loading a reference assembly from a byte
- // array for reflection only is okay.
- byte[] bs = File.ReadAllBytes ("./TestingReferenceAssembly.dll");
- var a = Assembly.ReflectionOnlyLoad (bs);
- var t = a.GetType ("X");
- var f = t.GetField ("Y");
- if (f.FieldType.Equals (typeof (Int32)))
- return 0;
- return 1;
- }
-
-}