Hey,

The attached patch checks the validity of InternalsVisibleToAttribute,
and reports and warnings depending on the contents.

May I commit?

Carlos.

PD - Attached are some tests.
Index: typemanager.cs
===================================================================
--- typemanager.cs	(revisiĆ³n: 51640)
+++ typemanager.cs	(copia de trabajo)
@@ -107,6 +107,7 @@
 	static internal Type compiler_generated_attr_type;
 	static internal Type fixed_buffer_attr_type;
 	static internal Type default_charset_type;
+	static internal Type internals_visible_attr_type;
 
 	//
 	// An empty array of types
@@ -1143,6 +1144,7 @@
 		compiler_generated_attr_type = CoreLookupType ("System.Runtime.CompilerServices", "CompilerGeneratedAttribute");
 		fixed_buffer_attr_type = CoreLookupType ("System.Runtime.CompilerServices", "FixedBufferAttribute");
 		default_charset_type = CoreLookupType ("System.Runtime.InteropServices", "DefaultCharSetAttribute");
+		internals_visible_attr_type = CoreLookupType ("System.Runtime.CompilerServices", "InternalsVisibleToAttribute");
 		//
 		// When compiling corlib, store the "real" types here.
 		//
Index: codegen.cs
===================================================================
--- codegen.cs	(revisiĆ³n: 51690)
+++ codegen.cs	(copia de trabajo)
@@ -144,6 +144,10 @@
 				return false;
 			}
 
+			// Get the complete AssemblyName from the builder
+			// (We need to get the public key and token)
+			Assembly.Name = Assembly.Builder.GetName ();
+			
 			//
 			// Pass a path-less name to DefineDynamicModule.  Wonder how
 			// this copes with output in different directories then.
@@ -1006,6 +1010,7 @@
 	public class AssemblyClass: CommonAssemblyModulClass {
 		// TODO: make it private and move all builder based methods here
 		public AssemblyBuilder Builder;
+		public AssemblyName Name;
                     
 		bool is_cls_compliant;
 		public Attribute ClsCompliantAttribute;
@@ -1196,6 +1201,35 @@
 			Report.Error (1548, "Error during assembly signing. " + text);
 		}
 
+		bool CheckInternalsVisibleAttribute (Attribute a)
+		{
+			string assembly_name = a.GetString ();
+			if (assembly_name.Length == 0)
+				return false;
+				
+			AssemblyName aname = null;
+			try {
+				aname = new AssemblyName (assembly_name);
+			} catch (FileLoadException) {
+			} catch (ArgumentException) {
+			}
+				
+			// Bad assembly name format
+			if (aname == null)
+				Report.Warning (1700, 3, a.Location, "Assembly reference '" + assembly_name + "' is invalid and cannot be resolved");
+			// Report error if we have defined Version or Culture
+			else if (aname.Version != null || aname.CultureInfo != null)
+				throw new Exception ("Friend assembly '" + a.GetString () + 
+						"' is invalid. InternalsVisibleTo cannot have version or culture specified.");
+			else if (aname.GetPublicKeyToken () == null && Name.GetPublicKeyToken () != null) {
+				Report.Error (1726, a.Location, "Friend assembly reference '" + aname.Name + "' is invalid." +
+						" Strong named assemblies must specify a public key token in their InternalsVisibleTo declarations");
+				return false;
+			}
+
+			return true;
+		}
+
 		public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder customBuilder)
 		{
 			if (a.Type.IsSubclassOf (TypeManager.security_attr_type) && a.CheckSecurityActionValidity (true)) {
@@ -1217,6 +1251,10 @@
 				}
 			}
 
+			if (a.Type == TypeManager.internals_visible_attr_type)
+				if (!CheckInternalsVisibleAttribute (a))
+					return;
+			
 			Builder.SetCustomAttribute (customBuilder);
 		}
 

Attachment: internals-errors.tar.gz
Description: application/compressed-tar

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to