Merge pull request #2720 from mono/fix-39325
[mono.git] / mono / metadata / mono-security.c
index 09ab44adc9bd938fc7d14a296337eb8050e51c52..d59d624782a8d781bacbf49472ca26a457a185b8 100644 (file)
@@ -5,6 +5,7 @@
  *     Sebastien Pouliot  <sebastien@ximian.com>
  *
  * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -323,7 +324,7 @@ ves_icall_System_Security_Principal_WindowsIdentity_GetTokenName (gpointer token
        if (uniname)
                g_free (uniname);
 
-       mono_error_raise_exception (&error);
+       mono_error_set_pending_exception (&error);
        return result;
 }
 
@@ -393,6 +394,7 @@ ves_icall_System_Security_Principal_WindowsIdentity_GetRoles (gpointer token)
        MonoArray *array = NULL;
        MonoDomain *domain = mono_domain_get (); 
 #ifdef HOST_WIN32
+       MonoError error;
        gint32 size = 0;
 
        GetTokenInformation (token, TokenGroups, NULL, size, (PDWORD)&size);
@@ -409,9 +411,13 @@ ves_icall_System_Security_Principal_WindowsIdentity_GetRoles (gpointer token)
                                gunichar2 *uniname = GetSidName (NULL, tg->Groups [i].Sid, &size);
 
                                if (uniname) {
-                                       MonoError error;
                                        MonoString *str = mono_string_new_utf16_checked (domain, uniname, size, &error);
-                                       mono_error_raise_exception (&error);
+                                       if (!is_ok (&error)) {
+                                               g_free (uniname);
+                                               g_free (tg);
+                                               mono_error_set_pending_exception (&error);
+                                               return NULL;
+                                       }
                                        mono_array_setref (array, i, str);
                                        g_free (uniname);
                                }
@@ -931,20 +937,26 @@ static MonoImage *system_security_assembly = NULL;
 void
 ves_icall_System_Security_SecureString_DecryptInternal (MonoArray *data, MonoObject *scope)
 {
-       invoke_protected_memory_method (data, scope, FALSE);
+       MonoError error;
+       invoke_protected_memory_method (data, scope, FALSE, &error);
+       mono_error_set_pending_exception (&error);
 }
 void
 ves_icall_System_Security_SecureString_EncryptInternal (MonoArray* data, MonoObject *scope)
 {
-       invoke_protected_memory_method (data, scope, TRUE);
+       MonoError error;
+       invoke_protected_memory_method (data, scope, TRUE, &error);
+       mono_error_set_pending_exception (&error);
 }
 
-void invoke_protected_memory_method (MonoArray *data, MonoObject *scope, gboolean encrypt)
+void invoke_protected_memory_method (MonoArray *data, MonoObject *scope, gboolean encrypt, MonoError *error)
 {
        MonoClass *klass;
        MonoMethod *method;
        void *params [2];
 
+       mono_error_init (error);
+       
        if (system_security_assembly == NULL) {
                system_security_assembly = mono_image_loaded ("System.Security");
                if (!system_security_assembly) {
@@ -955,10 +967,11 @@ void invoke_protected_memory_method (MonoArray *data, MonoObject *scope, gboolea
                }
        }
 
-       klass = mono_class_from_name (system_security_assembly,
+       klass = mono_class_load_from_name (system_security_assembly,
                                                                  "System.Security.Cryptography", "ProtectedMemory");
        method = mono_class_get_method_from_name (klass, encrypt ? "Protect" : "Unprotect", 2);
        params [0] = data;
        params [1] = scope; /* MemoryProtectionScope.SameProcess */
-       mono_runtime_invoke (method, NULL, params, NULL);
+
+       mono_runtime_invoke_checked (method, NULL, params, error);
 }