From: Bernhard Urban Date: Tue, 7 Mar 2017 09:47:00 +0000 (+0100) Subject: [interp] throw overflow exception on ulong to long cast where ulong is too large... X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=52c9310997eb5afe0229ae81693c65a38a132401;p=mono.git [interp] throw overflow exception on ulong to long cast where ulong is too large to fit in long --- diff --git a/mono/mini/exceptions.cs b/mono/mini/exceptions.cs index 805253bf6e8..86cec08c3eb 100644 --- a/mono/mini/exceptions.cs +++ b/mono/mini/exceptions.cs @@ -1800,7 +1800,6 @@ class Tests return 0; } - [Category ("!INTERPRETER")] public static int test_3_checked_cast_un () { ulong i = 0x8000000034000000; long j; diff --git a/mono/mini/interp/interp.c b/mono/mini/interp/interp.c index 7c4761ad15a..3b5307f13e4 100644 --- a/mono/mini/interp/interp.c +++ b/mono/mini/interp/interp.c @@ -3168,9 +3168,14 @@ array_constructed: sp [-1].data.l = sp [-1].data.i; ++ip; MINT_IN_BREAK; + MINT_IN_CASE(MINT_CONV_OVF_I8_U8) + if ((guint64) sp [-1].data.l > MYGINT64_MAX) + THROW_EX (mono_get_exception_overflow (), ip); + ++ip; + MINT_IN_BREAK; MINT_IN_CASE(MINT_CONV_OVF_U8_R8) MINT_IN_CASE(MINT_CONV_OVF_I8_UN_R8) - if (sp [-1].data.f < 0 || sp [-1].data.f > 9223372036854775807LL) + if (sp [-1].data.f < 0 || sp [-1].data.f > MYGINT64_MAX) THROW_EX (mono_get_exception_overflow (), ip); sp [-1].data.l = (guint64)sp [-1].data.f; ++ip; diff --git a/mono/mini/interp/mintops.def b/mono/mini/interp/mintops.def index d876f07056e..21ad893d07f 100644 --- a/mono/mini/interp/mintops.def +++ b/mono/mini/interp/mintops.def @@ -455,6 +455,7 @@ OPDEF(MINT_CONV_OVF_U4_I4, "conv.ovf.u4.i4", 1, MintOpNoArgs) OPDEF(MINT_CONV_OVF_U4_I8, "conv.ovf.u4.i8", 1, MintOpNoArgs) OPDEF(MINT_CONV_OVF_U4_R8, "conv.ovf.u4.r8", 1, MintOpNoArgs) +OPDEF(MINT_CONV_OVF_I8_U8, "conv.ovf.i8.u8", 1, MintOpNoArgs) OPDEF(MINT_CONV_OVF_I8_R8, "conv.ovf.i8.r8", 1, MintOpNoArgs) OPDEF(MINT_CONV_OVF_I8_UN_R8, "conv.ovf.i8.un.r8", 1, MintOpNoArgs) diff --git a/mono/mini/interp/transform.c b/mono/mini/interp/transform.c index 2e5b3df7376..434e2cdb0c4 100644 --- a/mono/mini/interp/transform.c +++ b/mono/mini/interp/transform.c @@ -2175,6 +2175,8 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo ADD_CODE(&td, MINT_CONV_OVF_I8_UN_R8); break; case STACK_TYPE_I8: + if (*td.ip == CEE_CONV_OVF_I8_UN) + ADD_CODE (&td, MINT_CONV_OVF_I8_U8); break; case STACK_TYPE_I4: ADD_CODE(&td, MINT_CONV_I8_U4);