diff options
author | Zoltan Varga <vargaz@gmail.com> | 2010-04-08 02:53:16 +0400 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2010-04-08 02:53:16 +0400 |
commit | 6b28cc8c14cf00b9a21c6468a1ab1c6315bd549a (patch) | |
tree | c7a04e6d9ed6768e6520c92d9c3c71b63eb22a14 | |
parent | d3fd72552f0eeb975503879bf020e7f7e7b52011 (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/ChangeLog | 5 | ||||
-rw-r--r-- | mono/metadata/icall.c | 8 |
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; } |