Author: zoltan
Date: 2007-07-05 16:14:13 -0400 (Thu, 05 Jul 2007)
New Revision: 81433

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/marshal.c
Log:
2007-07-05  Zoltan Varga  <[EMAIL PROTECTED]>

        * marshal.c (emit_marshal_string): When returning a string from managed 
code,
        allways make a copy even for unicode strings. Fixes #81990.


Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-07-05 20:02:04 UTC (rev 81432)
+++ trunk/mono/mono/metadata/ChangeLog  2007-07-05 20:14:13 UTC (rev 81433)
@@ -1,4 +1,8 @@
+2007-07-05  Zoltan Varga  <[EMAIL PROTECTED]>
 
+       * marshal.c (emit_marshal_string): When returning a string from managed 
code,
+       allways make a copy even for unicode strings. Fixes #81990.
+
 Wed Jul 4 11:53:57 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>
 
        * object.c: cleaned up mono_runtime_invoke_array () and fixed handling

Modified: trunk/mono/mono/metadata/marshal.c
===================================================================
--- trunk/mono/mono/metadata/marshal.c  2007-07-05 20:02:04 UTC (rev 81432)
+++ trunk/mono/mono/metadata/marshal.c  2007-07-05 20:14:13 UTC (rev 81433)
@@ -116,6 +116,9 @@
 void *
 mono_marshal_string_to_utf16 (MonoString *s);
 
+static void *
+mono_marshal_string_to_utf16_copy (MonoString *s);
+
 static gpointer
 mono_string_to_lpstr (MonoString *string_obj);
 
@@ -569,6 +572,7 @@
                load_type_info_tls_id = TlsAlloc ();
 
                register_icall (mono_marshal_string_to_utf16, 
"mono_marshal_string_to_utf16", "ptr obj", FALSE);
+               register_icall (mono_marshal_string_to_utf16_copy, 
"mono_marshal_string_to_utf16_copy", "ptr obj", FALSE);
                register_icall (mono_string_to_utf16, "mono_string_to_utf16", 
"ptr obj", FALSE);
                register_icall (mono_string_from_utf16, 
"mono_string_from_utf16", "obj ptr", FALSE);
                register_icall (mono_string_new_wrapper, 
"mono_string_new_wrapper", "obj ptr", FALSE);
@@ -6391,7 +6395,11 @@
                break;  
 
        case MARSHAL_ACTION_MANAGED_CONV_RESULT:
-               mono_mb_emit_icall (mb, conv_to_icall (conv));
+               if (conv_to_icall (conv) == mono_marshal_string_to_utf16)
+                       /* We need to make a copy so the caller is able to free 
it */
+                       mono_mb_emit_icall (mb, 
mono_marshal_string_to_utf16_copy);
+               else
+                       mono_mb_emit_icall (mb, conv_to_icall (conv));
                mono_mb_emit_stloc (mb, 3);
                break;
 
@@ -9878,6 +9886,18 @@
        return s ? mono_string_chars (s) : NULL;
 }
 
+static void *
+mono_marshal_string_to_utf16_copy (MonoString *s)
+{
+       if (s == NULL) {
+               return NULL;
+       } else {
+               gunichar2 *res = mono_marshal_alloc (mono_string_length (s) * 
2);
+               memcpy (res, mono_string_chars (s), mono_string_length (s) * 2);
+               return res;
+       }
+}
+
 /**
  * mono_marshal_set_last_error:
  *

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to