return;
}
-static void
-check_core_clr_override_method (MonoClass *class, MonoMethod *override, MonoMethod *base)
-{
- MonoSecurityCoreCLRLevel base_level = mono_security_core_clr_method_level (base, FALSE);
- /* if the base method is decorated with [SecurityCritical] then the overrided method MUST be too */
- if (base_level == MONO_SECURITY_CORE_CLR_CRITICAL) {
- MonoSecurityCoreCLRLevel override_level = mono_security_core_clr_method_level (override, FALSE);
- if (override_level != MONO_SECURITY_CORE_CLR_CRITICAL)
- mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
- }
-}
-
-
#define DEBUG_INTERFACE_VTABLE_CODE 0
#define TRACE_INTERFACE_VTABLE_CODE 0
#define VERIFY_INTERFACE_VTABLE_CODE 0
}
if (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)
- check_core_clr_override_method (class, cm, im);
+ mono_security_core_clr_check_override (class, cm, im);
TRACE_INTERFACE_VTABLE (printf ("[NAME CHECK OK]"));
return TRUE;
} else {
}
if (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)
- check_core_clr_override_method (class, cm, im);
+ mono_security_core_clr_check_override (class, cm, im);
TRACE_INTERFACE_VTABLE (printf ("[INJECTED INTERFACE CHECK OK]"));
return TRUE;
g_hash_table_insert (override_map, overrides [i * 2], overrides [i * 2 + 1]);
if (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)
- check_core_clr_override_method (class, vtable [dslot], decl);
+ mono_security_core_clr_check_override (class, vtable [dslot], decl);
}
}
TRACE_INTERFACE_VTABLE (print_overrides (override_map, "AFTER OVERRIDING INTERFACE METHODS"));
}
if (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)
- check_core_clr_override_method (class, cm, m1);
+ mono_security_core_clr_check_override (class, cm, m1);
slot = mono_method_get_vtable_slot (m1);
g_assert (cm->slot < max_vtsize);
g_hash_table_insert (override_map, decl, overrides [i * 2 + 1]);
if (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)
- check_core_clr_override_method (class, vtable [decl->slot], decl);
+ mono_security_core_clr_check_override (class, vtable [decl->slot], decl);
}
}
mono_class_set_failure (class, error->exception_type, exception_data);
}
-static void
-check_core_clr_inheritance (MonoClass *class)
-{
- MonoSecurityCoreCLRLevel class_level, parent_level;
- MonoClass *parent = class->parent;
-
- if (!parent)
- return;
-
- class_level = mono_security_core_clr_class_level (class);
- parent_level = mono_security_core_clr_class_level (parent);
-
- if (class_level < parent_level)
- mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
-}
-
/**
* mono_class_init:
* @class: the class to initialize
}
if (mono_security_get_mode () == MONO_SECURITY_MODE_CORE_CLR)
- check_core_clr_inheritance (class);
+ mono_security_core_clr_check_inheritance (class);
mono_stats.initialized_class_count++;
return class;
}
+/*
+ * mono_security_core_clr_check_inheritance:
+ *
+ * Determine if the specified class can inherit from its parent using
+ * the CoreCLR inheritance rules.
+ *
+ * Base Type Allow Derived Type
+ * ------------ ------------------
+ * Transparent Transparent, SafeCritical, Critical
+ * SafeCritical SafeCritical, Critical
+ * Critical Critical
+ *
+ * Reference: http://msdn.microsoft.com/en-us/magazine/cc765416.aspx#id0190030
+ */
+void
+mono_security_core_clr_check_inheritance (MonoClass *class)
+{
+ MonoSecurityCoreCLRLevel class_level, parent_level;
+ MonoClass *parent = class->parent;
+
+ if (!parent)
+ return;
+
+ class_level = mono_security_core_clr_class_level (class);
+ parent_level = mono_security_core_clr_class_level (parent);
+
+ if (class_level < parent_level)
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
+}
+
+/*
+ * mono_security_core_clr_check_override:
+ *
+ * Determine if the specified override can "legally" override the
+ * specified base method using the CoreCLR inheritance rules.
+ *
+ * Base (virtual/interface) Allowed override
+ * ------------------------ -------------------------
+ * Transparent Transparent, SafeCritical
+ * SafeCritical Transparent, SafeCritical
+ * Critical Critical
+ *
+ * Reference: http://msdn.microsoft.com/en-us/magazine/cc765416.aspx#id0190030
+ */
+void
+mono_security_core_clr_check_override (MonoClass *class, MonoMethod *override, MonoMethod *base)
+{
+ MonoSecurityCoreCLRLevel base_level = mono_security_core_clr_method_level (base, FALSE);
+ MonoSecurityCoreCLRLevel override_level = mono_security_core_clr_method_level (override, FALSE);
+ /* if the base method is decorated with [SecurityCritical] then the overrided method MUST be too */
+ if (base_level == MONO_SECURITY_CORE_CLR_CRITICAL) {
+ if (override_level != MONO_SECURITY_CORE_CLR_CRITICAL)
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
+ } else {
+ /* base is [SecuritySafeCritical] or [SecurityTransparent], override MUST NOT be [SecurityCritical] */
+ if (override_level == MONO_SECURITY_CORE_CLR_CRITICAL)
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
+ }
+}
+
/*
* get_caller_no_reflection_related:
*