[runtime] Avoid passing gshared methods to clients of the embedding api.
authorZoltan Varga <vargaz@gmail.com>
Fri, 7 Aug 2015 20:02:28 +0000 (16:02 -0400)
committerZoltan Varga <vargaz@gmail.com>
Fri, 7 Aug 2015 20:04:28 +0000 (16:04 -0400)
mono/metadata/loader.c
mono/mini/mini-exceptions.c

index 6ebae4aa1c25049f0c48c4de55e84052532da239..3bd5d27b2a82ad169a4577f07edb438b30442009 100644 (file)
@@ -2380,7 +2380,7 @@ stack_walk_adapter (MonoStackFrameInfo *frame, MonoContext *ctx, gpointer data)
                return FALSE;
        case FRAME_TYPE_MANAGED:
                g_assert (frame->ji);
-               return d->func (mono_jit_info_get_method (frame->ji), frame->native_offset, frame->il_offset, frame->managed, d->user_data);
+               return d->func (frame->actual_method, frame->native_offset, frame->il_offset, frame->managed, d->user_data);
                break;
        default:
                g_assert_not_reached ();
@@ -2421,10 +2421,14 @@ async_stack_walk_adapter (MonoStackFrameInfo *frame, MonoContext *ctx, gpointer
        case FRAME_TYPE_MANAGED:
                if (!frame->ji)
                        return FALSE;
-               if (frame->ji->async)
+               if (frame->ji->async) {
                        return d->func (NULL, frame->domain, frame->ji->code_start, frame->native_offset, d->user_data);
-               else
+               } else if (frame->ji->has_generic_jit_info) {
+                       /* Can't pass a gshared method to embedding code */
+                       return d->func (NULL, frame->domain, frame->ji->code_start, frame->native_offset, d->user_data);
+               } else {
                        return d->func (frame->actual_method, frame->domain, frame->ji->code_start, frame->native_offset, d->user_data);
+               }
                break;
        default:
                g_assert_not_reached ();
index b4ee4cd740075e0be1b3881106b759395e2ce1f2..c9c28b8dcbd3adce67ac346b5ed223c571d4e10f 100644 (file)
@@ -453,6 +453,9 @@ mono_find_jit_info_ext (MonoDomain *domain, MonoJitTlsData *jit_tls,
        return TRUE;
 }
 
+/*
+ * This function is async-safe.
+ */
 static gpointer
 get_generic_info_from_stack_frame (MonoJitInfo *ji, MonoContext *ctx)
 {