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:
authorZoltan Varga <vargaz@gmail.com>2010-04-08 02:53:16 +0400
committerZoltan Varga <vargaz@gmail.com>2010-04-08 02:53:16 +0400
commit6b28cc8c14cf00b9a21c6468a1ab1c6315bd549a (patch)
treec7a04e6d9ed6768e6520c92d9c3c71b63eb22a14
parentd3fd72552f0eeb975503879bf020e7f7e7b52011 (diff)
2010-04-08 Zoltan Varga <vargaz@gmail.com>
* icall.c (ves_icall_System_Enum_ToObject): Avoid a crash for unfinished type builders. Fixes #594464. svn path=/branches/mono-2-6/mono/; revision=155011
-rw-r--r--mono/metadata/ChangeLog5
-rw-r--r--mono/metadata/icall.c8
2 files changed, 12 insertions, 1 deletions
diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog
index bfee1f86790..fdb0fe5bf5c 100644
--- a/mono/metadata/ChangeLog
+++ b/mono/metadata/ChangeLog
@@ -1,5 +1,10 @@
2010-04-08 Zoltan Varga <vargaz@gmail.com>
+ * icall.c (ves_icall_System_Enum_ToObject): Avoid a crash for unfinished type
+ builders. Fixes #594464.
+
+2010-04-08 Zoltan Varga <vargaz@gmail.com>
+
* icall.c (ves_icall_System_Environment_Exit): Shutdown the threadpool before
waiting for all threads to suspend, as those threads can't be suspended.
diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c
index 56016fd0316..a77d2ef28b4 100644
--- a/mono/metadata/icall.c
+++ b/mono/metadata/icall.c
@@ -3040,6 +3040,7 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value)
MonoDomain *domain;
MonoClass *enumc, *objc;
MonoObject *res;
+ MonoType *etype;
guint64 val;
MONO_ARCH_SAVE_REGS;
@@ -3056,9 +3057,14 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value)
if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8)))
mono_raise_exception (mono_get_exception_argument ("value", "The value passed in must be an enum base or an underlying type for an enum, such as an Int32."));
+ etype = mono_class_enum_basetype (enumc);
+ if (!etype)
+ /* MS throws this for typebuilders */
+ mono_raise_exception (mono_get_exception_argument ("Type must be a type provided by the runtime.", "enumType"));
+
res = mono_object_new (domain, enumc);
val = read_enum_value ((char *)value + sizeof (MonoObject), objc->enumtype? mono_class_enum_basetype (objc)->type: objc->byval_arg.type);
- write_enum_value ((char *)res + sizeof (MonoObject), mono_class_enum_basetype (enumc)->type, val);
+ write_enum_value ((char *)res + sizeof (MonoObject), etype->type, val);
return res;
}