Skip to content

[Mono/WASM] Marshal.GetFunctionPointerForDelegate crashes the runtime #104391

@SingleAccretion

Description

@SingleAccretion

Reproduction:

> dotnet new wasmconsole
using System;
using System.Runtime.InteropServices;

public unsafe class Program
{
    public static void Main()
    {
        nint fptr = Marshal.GetFunctionPointerForDelegate(new Action(() => Console.WriteLine("Managed method callee")));
        ((delegate* unmanaged<void>)fptr)();
    }
}
> dotnet run

Expected result: no crash.
Actual result:

RuntimeError: memory access out of bounds
    at strlen (wasm://wasm/03d4c862:wasm-function[12385]:0x28e52f)
    at get_native_to_interp (wasm://wasm/03d4c862:wasm-function[13709]:0x2b0d0f)
    at mono_wasm_get_native_to_interp_trampoline (wasm://wasm/03d4c862:wasm-function[4997]:0x14a8bb)
    at interp_create_method_pointer (wasm://wasm/03d4c862:wasm-function[155]:0x1a9f2)
    at jit_compile_method_with_opt_cb (wasm://wasm/03d4c862:wasm-function[4749]:0x134c4e)
    at mono_llvm_cpp_catch_exception (wasm://wasm/03d4c862:wasm-function[4999]:0x14a92f)
    at mono_llvm_catch_exception (wasm://wasm/03d4c862:wasm-function[5066]:0x14f5f8)
    at jit_compile_method_with_opt (wasm://wasm/03d4c862:wasm-function[4748]:0x134b5e)
    at mono_jit_compile_method (wasm://wasm/03d4c862:wasm-function[4746]:0x134981)
    at mono_compile_method_checked (wasm://wasm/03d4c862:wasm-function[3628]:0xf908b)
    at mono_delegate_to_ftnptr_impl (wasm://wasm/03d4c862:wasm-function[3142]:0xdb697)
    at ves_icall_System_Runtime_InteropServices_Marshal_GetFunctionPointerForDelegateInternal (wasm://wasm/03d4c862:wasm-function[3268]:0xe45dc)
    at ves_icall_System_Runtime_InteropServices_Marshal_GetFunctionPointerForDelegateInternal_raw (wasm://wasm/03d4c862:wasm-function[2835]:0xcc674)
    at do_icall (wasm://wasm/03d4c862:wasm-function[206]:0x1d577)
    at do_icall_wrapper (wasm://wasm/03d4c862:wasm-function[126]:0x19979)
    at mono_interp_exec_method (wasm://wasm/03d4c862:wasm-function[117]:0xb236)
    at interp_runtime_invoke (wasm://wasm/03d4c862:wasm-function[160]:0x1aed3)
    at mono_jit_runtime_invoke (wasm://wasm/03d4c862:wasm-function[4781]:0x1387a9)
    at do_runtime_invoke (wasm://wasm/03d4c862:wasm-function[3600]:0xf6dfe)
    at mono_runtime_invoke_checked (wasm://wasm/03d4c862:wasm-function[3599]:0xf6d98)
    at mono_runtime_try_invoke_byrefs (wasm://wasm/03d4c862:wasm-function[3697]:0xfd55c)
    at ves_icall_InternalInvoke (wasm://wasm/03d4c862:wasm-function[2620]:0xc15dd)
    at ves_icall_InternalInvoke_raw (wasm://wasm/03d4c862:wasm-function[2783]:0xca1b9)
    at do_icall (wasm://wasm/03d4c862:wasm-function[206]:0x1d64c)
    at do_icall_wrapper (wasm://wasm/03d4c862:wasm-function[126]:0x19979)
    at mono_interp_exec_method (wasm://wasm/03d4c862:wasm-function[117]:0xb236)
    at interp_runtime_invoke (wasm://wasm/03d4c862:wasm-function[160]:0x1aed3)
    at mono_jit_runtime_invoke (wasm://wasm/03d4c862:wasm-function[4781]:0x1387a9)
    at do_runtime_invoke (wasm://wasm/03d4c862:wasm-function[3600]:0xf6dfe)
    at mono_runtime_try_invoke (wasm://wasm/03d4c862:wasm-function[3609]:0xf787d)
    at mono_runtime_invoke (wasm://wasm/03d4c862:wasm-function[3646]:0xfa46c)
    at mono_wasm_invoke_jsexport (wasm://wasm/03d4c862:wasm-function[13673]:0x2af762)

More context: dotnet/runtimelab#2624.

Metadata

Metadata

Assignees

Type

No type

Projects

Status

No status

Relationships

None yet

Development

No branches or pull requests

Issue actions