From: Vlad Brezae Date: Fri, 10 Jan 2020 07:32:04 +0000 (+0200) Subject: [interp] Add gc unsafe transition during pinvokes (mono/mono#18399) X-Git-Tag: submit/tizen/20210909.063632~10331^2~5^2~31 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dd840e03bb4427e2307882ae16146acb7b756609;p=platform%2Fupstream%2Fdotnet%2Fruntime.git [interp] Add gc unsafe transition during pinvokes (mono/mono#18399) Native methods can be run in gc safe mode, meaning we can be in gc safe mode while setting/getting the arguments for a native transition. Call context computation requires us to be in unsafe mode. Fixes https://github.com/mono/mono/issues/16969 Commit migrated from https://github.com/mono/mono/commit/d33a1009619531b41ed884380aab9abbbf317509 --- diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 49594a9..641b67be 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -1548,7 +1548,9 @@ ves_pinvoke_method (InterpFrame *frame, MonoMethodSignature *sig, MonoFuncV addr #ifdef MONO_ARCH_HAVE_INTERP_PINVOKE_TRAMP CallContext ccontext; + MONO_ENTER_GC_UNSAFE; mono_arch_set_native_call_context_args (&ccontext, frame, sig); + MONO_EXIT_GC_UNSAFE; args = &ccontext; #else InterpMethodArguments *margs = build_args_from_sig (sig, frame); @@ -1562,8 +1564,11 @@ ves_pinvoke_method (InterpFrame *frame, MonoMethodSignature *sig, MonoFuncV addr interp_pop_lmf (&ext); #ifdef MONO_ARCH_HAVE_INTERP_PINVOKE_TRAMP - if (!context->has_resume_state) + if (!context->has_resume_state) { + MONO_ENTER_GC_UNSAFE; mono_arch_get_native_call_context_ret (&ccontext, frame, sig); + MONO_EXIT_GC_UNSAFE; + } if (ccontext.stack != NULL) g_free (ccontext.stack);