Merge pull request #3056 from BrzVlad/fix-multiple-binprot
[mono.git] / mono / metadata / console-unix.c
index 5a4d518c230720b5e985d3ea1d34edbb2dc5f7ab..38a82c92e957f3cb76cde6f66bd2031f6009c881 100644 (file)
@@ -5,6 +5,7 @@
  *     Gonzalo Paniagua Javier (gonzalo@ximian.com)
  *
  * Copyright (C) 2005-2009 Novell, Inc. (http://www.novell.com)
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 #if defined(__native_client__)
 #include "console-null.c"
@@ -221,6 +222,7 @@ static void
 do_console_cancel_event (void)
 {
        static MonoClassField *cancel_handler_field;
+       MonoError error;
        MonoDomain *domain = mono_domain_get ();
        MonoClass *klass;
        MonoDelegate *load_value;
@@ -231,7 +233,7 @@ do_console_cancel_event (void)
        if (!domain->domain)
                return;
 
-       klass = mono_class_from_name (mono_defaults.corlib, "System", "Console");
+       klass = mono_class_try_load_from_name (mono_defaults.corlib, "System", "Console");
        if (klass == NULL)
                return;
 
@@ -240,18 +242,26 @@ do_console_cancel_event (void)
                g_assert (cancel_handler_field);
        }
 
-       vtable = mono_class_vtable_full (domain, klass, FALSE);
-       if (vtable == NULL)
+       vtable = mono_class_vtable_full (domain, klass, &error);
+       if (vtable == NULL || !is_ok (&error)) {
+               mono_error_cleanup (&error);
                return;
-       mono_field_static_get_value (vtable, cancel_handler_field, &load_value);
-       if (load_value == NULL)
+       }
+       mono_field_static_get_value_checked (vtable, cancel_handler_field, &load_value, &error);
+       if (load_value == NULL || !is_ok (&error)) {
+               mono_error_cleanup (&error);
                return;
+       }
 
        klass = load_value->object.vtable->klass;
        method = mono_class_get_method_from_name (klass, "BeginInvoke", -1);
        g_assert (method != NULL);
 
-       mono_threadpool_ms_begin_invoke (domain, (MonoObject*) load_value, method, NULL);
+       mono_threadpool_ms_begin_invoke (domain, (MonoObject*) load_value, method, NULL, &error);
+       if (!is_ok (&error)) {
+               g_warning ("Couldn't invoke System.Console cancel handler due to %s", mono_error_get_message (&error));
+               mono_error_cleanup (&error);
+       }
 }
 
 static int need_cancel = FALSE;
@@ -437,6 +447,8 @@ set_control_chars (MonoArray *control_chars, const guchar *cc)
 MonoBoolean
 ves_icall_System_ConsoleDriver_TtySetup (MonoString *keypad, MonoString *teardown, MonoArray **control_chars, int **size)
 {
+       MonoError error;
+
        int dims;
 
        dims = terminal_get_dimensions ();
@@ -462,7 +474,10 @@ ves_icall_System_ConsoleDriver_TtySetup (MonoString *keypad, MonoString *teardow
 
        /* 17 is the number of entries set in set_control_chars() above.
         * NCCS is the total size, but, by now, we only care about those 17 values*/
-       mono_gc_wbarrier_generic_store (control_chars, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.byte_class, 17));
+       MonoArray *control_chars_arr = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, 17, &error);
+       if (mono_error_set_pending_exception (&error))
+               return FALSE;
+       mono_gc_wbarrier_generic_store (control_chars, (MonoObject*) control_chars_arr);
        if (tcgetattr (STDIN_FILENO, &initial_attr) == -1)
                return FALSE;
 
@@ -483,13 +498,21 @@ ves_icall_System_ConsoleDriver_TtySetup (MonoString *keypad, MonoString *teardow
        if (setup_finished)
                return TRUE;
 
-       keypad_xmit_str = keypad != NULL ? mono_string_to_utf8 (keypad) : NULL;
+       keypad_xmit_str = NULL;
+       if (keypad != NULL) {
+               keypad_xmit_str = mono_string_to_utf8_checked (keypad, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return FALSE;
+       }
        
        console_set_signal_handlers ();
        setup_finished = TRUE;
        if (!atexit_called) {
-               if (teardown != NULL)
-                       teardown_str = mono_string_to_utf8 (teardown);
+               if (teardown != NULL) {
+                       teardown_str = mono_string_to_utf8_checked (teardown, &error);
+                       if (mono_error_set_pending_exception (&error))
+                               return FALSE;
+               }
 
                mono_atexit (tty_teardown);
        }