Merge pull request #1635 from alexrp/core-clr-properties
authorAlex Rønne Petersen <alex@alexrp.com>
Tue, 17 Mar 2015 22:01:50 +0000 (23:01 +0100)
committerAlex Rønne Petersen <alex@alexrp.com>
Tue, 17 Mar 2015 22:01:50 +0000 (23:01 +0100)
Implement CoreCLR security properties on reflection info types.

mcs/class/corlib/System.Reflection/FieldInfo.cs
mcs/class/corlib/System.Reflection/MethodBase.cs
mcs/class/corlib/System.Reflection/MonoField.cs
mcs/class/corlib/System.Reflection/MonoMethod.cs
mono/metadata/icall-def.h
mono/metadata/icall.c
mono/metadata/security-core-clr.c
mono/metadata/security-core-clr.h

index 5838902b2ac15ed3d48fc4e5abd570d76bc494c3..9621fac3f77074a5a9a91136c50fc734de070df9 100644 (file)
@@ -277,19 +277,19 @@ namespace System.Reflection {
                
                public virtual bool IsSecurityCritical {
                        get {
-                               throw new NotImplementedException ();
+                               throw new NotSupportedException ();
                        }
                }
                
                public virtual bool IsSecuritySafeCritical {
                        get {
-                               throw new NotImplementedException ();
+                               throw new NotSupportedException ();
                        }
                }
 
                public virtual bool IsSecurityTransparent {
                        get {
-                               throw new NotImplementedException ();
+                               throw new NotSupportedException ();
                        }
                }
 
index ff04255d41671430ed36ec602c5a23bf6f77ad54..c496030d89f2a027fe6434d8f99bcffd33103881 100644 (file)
@@ -277,19 +277,19 @@ namespace System.Reflection {
                
                public virtual bool IsSecurityCritical {
                        get {
-                               throw new NotImplementedException ();
+                               throw new NotSupportedException ();
                        }
                }
                
                public virtual bool IsSecuritySafeCritical {
                        get {
-                               throw new NotImplementedException ();
+                               throw new NotSupportedException ();
                        }
                }
 
                public virtual bool IsSecurityTransparent {
                        get {
-                               throw new NotImplementedException ();
+                               throw new NotSupportedException ();
                        }
                }
 
index 0e6b40607d4c45b584585dbcb8a76abb18976414..1afdd03b0646c6412fcd8dca4589d7fd12bbd0ee 100644 (file)
@@ -234,5 +234,21 @@ namespace System.Reflection {
                        if (DeclaringType.ContainsGenericParameters)
                                throw new InvalidOperationException ("Late bound operations cannot be performed on fields with types for which Type.ContainsGenericParameters is true.");
            }
+
+               //seclevel { transparent = 0, safe-critical = 1, critical = 2}
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               public extern int get_core_clr_security_level ();
+
+               public override bool IsSecurityTransparent {
+                       get { return get_core_clr_security_level () == 0; }
+               }
+
+               public override bool IsSecurityCritical {
+                       get { return get_core_clr_security_level () > 0; }
+               }
+
+               public override bool IsSecuritySafeCritical {
+                       get { return get_core_clr_security_level () == 1; }
+               }
        }
 }
index b8b19d873b8b3a56fccb829d586b57790e572a69..af76c6a8018cfa8f26ec0319fc41f9598f25b218 100644 (file)
@@ -481,6 +481,22 @@ namespace System.Reflection {
                public override IList<CustomAttributeData> GetCustomAttributesData () {
                        return CustomAttributeData.GetCustomAttributes (this);
                }
+
+               //seclevel { transparent = 0, safe-critical = 1, critical = 2}
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               public extern int get_core_clr_security_level ();
+
+               public override bool IsSecurityTransparent {
+                       get { return get_core_clr_security_level () == 0; }
+               }
+
+               public override bool IsSecurityCritical {
+                       get { return get_core_clr_security_level () > 0; }
+               }
+
+               public override bool IsSecuritySafeCritical {
+                       get { return get_core_clr_security_level () == 1; }
+               }
        }
        
 
index 8ffde8f34f58b2ba93e0d490639228e2586eb902..6e665f1697392085549dd6b16bf055a46d039c37 100644 (file)
@@ -588,6 +588,7 @@ ICALL(MFIELD_5, "GetRawConstantValue", ves_icall_MonoField_GetRawConstantValue)
 ICALL(MFIELD_3, "GetValueInternal", ves_icall_MonoField_GetValueInternal)
 ICALL(MFIELD_6, "ResolveType", ves_icall_MonoField_ResolveType)
 ICALL(MFIELD_4, "SetValueInternal", ves_icall_MonoField_SetValueInternal)
+ICALL(MFIELD_7, "get_core_clr_security_level", ves_icall_MonoField_get_core_clr_security_level)
 
 ICALL_TYPE(MGENCM, "System.Reflection.MonoGenericCMethod", MGENCM_1)
 ICALL(MGENCM_1, "get_ReflectedType", ves_icall_MonoGenericMethod_get_ReflectedType)
@@ -609,6 +610,7 @@ ICALL(MMETH_5, "MakeGenericMethod_impl", mono_reflection_bind_generic_method_par
 ICALL(MMETH_6, "get_IsGenericMethod", ves_icall_MonoMethod_get_IsGenericMethod)
 ICALL(MMETH_7, "get_IsGenericMethodDefinition", ves_icall_MonoMethod_get_IsGenericMethodDefinition)
 ICALL(MMETH_8, "get_base_method", ves_icall_MonoMethod_get_base_method)
+ICALL(MMETH_10, "get_core_clr_security_level", ves_icall_MonoMethod_get_core_clr_security_level)
 ICALL(MMETH_9, "get_name", ves_icall_MonoMethod_get_name)
 
 ICALL_TYPE(MMETHI, "System.Reflection.MonoMethodInfo", MMETHI_4)
index f417148ff983e0ca1dc41dbf554de784e509884a..a7a725a8d32c35459d1a1124050853c295e09720 100644 (file)
@@ -4659,6 +4659,20 @@ vell_icall_MonoType_get_core_clr_security_level (MonoReflectionType *this)
        return mono_security_core_clr_class_level (klass);
 }
 
+ICALL_EXPORT int
+ves_icall_MonoField_get_core_clr_security_level (MonoReflectionField *this)
+{
+       MonoClassField *field = this->field;
+       return mono_security_core_clr_field_level (field, TRUE);
+}
+
+ICALL_EXPORT int
+ves_icall_MonoMethod_get_core_clr_security_level (MonoReflectionMethod *this)
+{
+       MonoMethod *method = this->method;
+       return mono_security_core_clr_method_level (method, TRUE);
+}
+
 static void
 fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version, gboolean default_publickey, gboolean default_token)
 {
index 1be63ffc2240dbfcce52661320765620449a384d..43e06db574b9ab524bfb06748b7db29413d6f448 100644 (file)
@@ -960,6 +960,40 @@ mono_security_core_clr_class_level (MonoClass *class)
        return mono_security_core_clr_class_level_no_platform_check (class);
 }
 
+/*
+ * mono_security_core_clr_field_level:
+ *
+ *     Return the MonoSecurityCoreCLRLevel for the specified field.
+ *     If with_class_level is TRUE then the type (class) will also be
+ *     checked, otherwise this will only report the information about
+ *     the field itself.
+ */
+MonoSecurityCoreCLRLevel
+mono_security_core_clr_field_level (MonoClassField *field, gboolean with_class_level)
+{
+       MonoCustomAttrInfo *cinfo;
+       MonoSecurityCoreCLRLevel level = MONO_SECURITY_CORE_CLR_TRANSPARENT;
+
+       /* if get_reflection_caller returns NULL then we assume the caller has NO privilege */
+       if (!field)
+               return level;
+
+       /* non-platform code is always Transparent - whatever the attributes says */
+       if (!mono_security_core_clr_test && !mono_security_core_clr_is_platform_image (field->parent->image))
+               return level;
+
+       cinfo = mono_custom_attrs_from_field (field->parent, field);
+       if (cinfo) {
+               level = mono_security_core_clr_level_from_cinfo (cinfo, field->parent->image);
+               mono_custom_attrs_free (cinfo);
+       }
+
+       if (with_class_level && level == MONO_SECURITY_CORE_CLR_TRANSPARENT)
+               level = mono_security_core_clr_class_level (field->parent);
+
+       return level;
+}
+
 /*
  * mono_security_core_clr_method_level:
  *
@@ -1070,6 +1104,12 @@ mono_security_core_clr_class_level (MonoClass *class)
        return MONO_SECURITY_CORE_CLR_TRANSPARENT;
 }
 
+MonoSecurityCoreCLRLevel
+mono_security_core_clr_field_level (MonoClassField *field, gboolean with_class_level)
+{
+       return MONO_SECURITY_CORE_CLR_TRANSPARENT;
+}
+
 MonoSecurityCoreCLRLevel
 mono_security_core_clr_method_level (MonoMethod *method, gboolean with_class_level)
 {
index ca2039656e1a34084b06b7fb155ddf34820d8499..ec2ab01ee264bf77f4e957bae389ab924783831e 100644 (file)
@@ -53,6 +53,7 @@ extern MonoException* mono_security_core_clr_is_field_access_allowed (MonoMethod
 extern MonoException* mono_security_core_clr_is_call_allowed (MonoMethod *caller, MonoMethod *callee);
 
 extern MonoSecurityCoreCLRLevel mono_security_core_clr_class_level (MonoClass *klass);
+extern MonoSecurityCoreCLRLevel mono_security_core_clr_field_level (MonoClassField *field, gboolean with_class_level);
 extern MonoSecurityCoreCLRLevel mono_security_core_clr_method_level (MonoMethod *method, gboolean with_class_level);
 
 extern gboolean mono_security_core_clr_is_platform_image (MonoImage *image);