[mono] Enter GC Unsafe mode in some string allocation functions (#33754)
authorAleksey Kliger (λgeek) <alklig@microsoft.com>
Thu, 19 Mar 2020 23:00:09 +0000 (19:00 -0400)
committerGitHub <noreply@github.com>
Thu, 19 Mar 2020 23:00:09 +0000 (19:00 -0400)
All these functions are MONO_RT_EXTERNAL_ONLY and they all allocate managed
objects.

Fixes a coop state machine assertion if an embedder calls the function and it needs to take the GC
lock to do a collection.

src/mono/mono/metadata/object.c

index 5fbaeaf..8d28bb6 100644 (file)
@@ -6607,13 +6607,12 @@ mono_string_empty_handle (MonoDomain *domain)
 MonoString *
 mono_string_new_utf16 (MonoDomain *domain, const mono_unichar2 *text, gint32 len)
 {
-       MONO_REQ_GC_UNSAFE_MODE;
-
-       ERROR_DECL (error);
        MonoString *res = NULL;
+       MONO_ENTER_GC_UNSAFE;
+       ERROR_DECL (error);
        res = mono_string_new_utf16_checked (domain, text, len, error);
        mono_error_cleanup (error);
-
+       MONO_EXIT_GC_UNSAFE;
        return res;
 }
 
@@ -6710,10 +6709,12 @@ mono_string_new_utf32 (MonoDomain *domain, const mono_unichar4 *text, gint32 len
 MonoString *
 mono_string_new_size (MonoDomain *domain, gint32 len)
 {
+       MonoString *str;
+       MONO_ENTER_GC_UNSAFE;
        ERROR_DECL (error);
-       MonoString *str = mono_string_new_size_checked (domain, len, error);
+       str = mono_string_new_size_checked (domain, len, error);
        mono_error_cleanup (error);
-
+       MONO_EXIT_GC_UNSAFE;
        return str;
 }
 
@@ -7546,9 +7547,12 @@ mono_string_intern (MonoString *str_raw)
 MonoString*
 mono_ldstr (MonoDomain *domain, MonoImage *image, guint32 idx)
 {
+       MonoString *result;
+       MONO_ENTER_GC_UNSAFE;
        ERROR_DECL (error);
-       MonoString *result = mono_ldstr_checked (domain, image, idx, error);
+       result = mono_ldstr_checked (domain, image, idx, error);
        mono_error_cleanup (error);
+       MONO_EXIT_GC_UNSAFE;
        return result;
 }