From 52c9310997eb5afe0229ae81693c65a38a132401 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Tue, 7 Mar 2017 10:47:00 +0100 Subject: [PATCH] [interp] throw overflow exception on ulong to long cast where ulong is too large to fit in long --- mono/mini/exceptions.cs | 1 - mono/mini/interp/interp.c | 7 ++++++- mono/mini/interp/mintops.def | 1 + mono/mini/interp/transform.c | 2 ++ 4 files changed, 9 insertions(+), 2 deletions(-) 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); -- 2.25.1