[wasi] Work arounbd WASI's mmap implementation not returning aligned memory. (#92061)
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Thu, 14 Sep 2023 17:49:25 +0000 (10:49 -0700)
committerGitHub <noreply@github.com>
Thu, 14 Sep 2023 17:49:25 +0000 (10:49 -0700)
Some code in sgen like sgen_los_free_object () expects the return address to be aligned.

Hopefully fixes https://github.com/dotnet/runtime/issues/88501 and others.

Co-authored-by: Zoltan Varga <vargaz@gmail.com>
src/mono/mono/utils/mono-mmap-wasm.c

index 5c38aac..b2f417b 100644 (file)
@@ -90,8 +90,8 @@ mono_setmmapjit (int flag)
        /* Ignored on HOST_WASM */
 }
 
-void*
-mono_valloc (void *addr, size_t size, int flags, MonoMemAccountType type)
+static void*
+valloc_impl (void *addr, size_t size, int flags, MonoMemAccountType type)
 {
        void *ptr;
        int mflags = 0;
@@ -119,6 +119,19 @@ mono_valloc (void *addr, size_t size, int flags, MonoMemAccountType type)
        return ptr;
 }
 
+void*
+mono_valloc (void *addr, size_t size, int flags, MonoMemAccountType type)
+{
+#if HOST_WASI
+       // WASI implements mmap using malloc, so the returned address is not page aligned
+       // and our code depends on it
+       g_assert (!addr);
+       return mono_valloc_aligned (size, mono_pagesize (), flags, type);
+#else
+       return valloc_impl (addr, size, flags, type);
+#endif
+}
+
 static GHashTable *valloc_hash;
 
 typedef struct {
@@ -130,7 +143,7 @@ void*
 mono_valloc_aligned (size_t size, size_t alignment, int flags, MonoMemAccountType type)
 {
        /* Allocate twice the memory to be able to put the block on an aligned address */
-       char *mem = (char *) mono_valloc (NULL, size + alignment, flags, type);
+       char *mem = (char *) valloc_impl (NULL, size + alignment, flags, type);
        char *aligned;
 
        if (!mem)