diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 4540d1a6b55c..6b98bbe17c1c 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -6545,6 +6545,10 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8 PRINT_DEBUG_MSG (1, "[%p] Error: Interface method invoked without this argument.\n", (gpointer) (gsize) mono_native_thread_id_get ()); return ERR_INVALID_ARGUMENT; } + if (!mono_object_isinst_checked(this_arg, m->klass, error)) { + PRINT_DEBUG_MSG (1, "[%p] Error: Interface method invoked on object that doesn't implement the interface.\n", (gpointer) (gsize) mono_native_thread_id_get ()); + return ERR_INVALID_ARGUMENT; + } m = mono_object_get_virtual_method_internal (this_arg, m); /* Transform this to the format the rest of the code expects it to be */ if (m_class_is_valuetype (m->klass)) { @@ -6556,6 +6560,10 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8 PRINT_DEBUG_MSG (1, "[%p] Error: invoke with INVOKE_FLAG_VIRTUAL flag set without this argument.\n", (gpointer) (gsize) mono_native_thread_id_get ()); return ERR_INVALID_ARGUMENT; } + if (!mono_object_isinst_checked(this_arg, m->klass, error)) { + PRINT_DEBUG_MSG (1, "[%p] Error: invoke with INVOKE_FLAG_VIRTUAL flag on object that object that doesn't implement the method.\n", (gpointer) (gsize) mono_native_thread_id_get ()); + return ERR_INVALID_ARGUMENT; + } m = mono_object_get_virtual_method_internal (this_arg, m); if (m_class_is_valuetype (m->klass)) { this_buf = (guint8 *)g_alloca (mono_class_instance_size (m->klass));