From: Aleksey Kliger (λgeek) Date: Mon, 7 Aug 2017 15:58:50 +0000 (-0400) Subject: Merge pull request #5313 from lambdageek/corefx-sre-fixup X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=ef684b2041bfc73c16802ad017304963d7c9038a;hp=0f7389f5bbe7034e41f5e4f3321b8822ccf8bd41;p=mono.git Merge pull request #5313 from lambdageek/corefx-sre-fixup [sre] Fix some argument checks, enable xtests --- diff --git a/mcs/class/corlib/System.Reflection.Emit/ConstructorBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/ConstructorBuilder.cs index 55a392d3844..7b77a70194e 100644 --- a/mcs/class/corlib/System.Reflection.Emit/ConstructorBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/ConstructorBuilder.cs @@ -235,7 +235,10 @@ namespace System.Reflection.Emit { public ParameterBuilder DefineParameter (int iSequence, ParameterAttributes attributes, string strParamName) { - if (iSequence < 1 || iSequence > GetParametersCount ()) + // The 0th ParameterBuilder does not correspond to an + // actual parameter, but .NETFramework lets you define + // it anyway. It is not useful. + if (iSequence < 0 || iSequence > GetParametersCount ()) throw new ArgumentOutOfRangeException ("iSequence"); if (type.is_created) throw not_after_created (); diff --git a/mcs/class/corlib/System.Reflection.Emit/CustomAttributeBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/CustomAttributeBuilder.cs index f3302e02b9c..0bb724ad8c4 100644 --- a/mcs/class/corlib/System.Reflection.Emit/CustomAttributeBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/CustomAttributeBuilder.cs @@ -58,9 +58,13 @@ namespace System.Reflection.Emit { [MethodImplAttribute(MethodImplOptions.InternalCall)] static extern byte[] GetBlob(Assembly asmb, ConstructorInfo con, object[] constructorArgs, PropertyInfo[] namedProperties, object[] propertyValues, FieldInfo[] namedFields, object[] fieldValues); - internal CustomAttributeBuilder( ConstructorInfo con, byte[] cdata) { + internal CustomAttributeBuilder( ConstructorInfo con, byte[] binaryAttribute) { + if (con == null) + throw new ArgumentNullException ("con"); + if (binaryAttribute == null) + throw new ArgumentNullException ("binaryAttribute"); ctor = con; - data = (byte[])cdata.Clone (); + data = (byte[])binaryAttribute.Clone (); /* should we check that the user supplied data is correct? */ } diff --git a/mcs/class/corlib/System.Reflection.Emit/FieldBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/FieldBuilder.cs index cd6a5a76487..23f27ca17c2 100644 --- a/mcs/class/corlib/System.Reflection.Emit/FieldBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/FieldBuilder.cs @@ -156,6 +156,9 @@ namespace System.Reflection.Emit { public void SetCustomAttribute (CustomAttributeBuilder customBuilder) { RejectIfCreated (); + if (customBuilder == null) + throw new ArgumentNullException ("customBuilder"); + string attrname = customBuilder.Ctor.ReflectedType.FullName; if (attrname == "System.Runtime.InteropServices.FieldOffsetAttribute") { byte[] data = customBuilder.Data; @@ -202,6 +205,8 @@ namespace System.Reflection.Emit { public void SetOffset( int iOffset) { RejectIfCreated (); + if (iOffset < 0) + throw new ArgumentException ("Negative field offset is not allowed"); offset = iOffset; } diff --git a/mcs/class/corlib/System.Reflection.Emit/MethodBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/MethodBuilder.cs index 8748f20aba2..8f09f0262b4 100644 --- a/mcs/class/corlib/System.Reflection.Emit/MethodBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/MethodBuilder.cs @@ -342,7 +342,7 @@ namespace System.Reflection.Emit // // Extension: Mono allows position == 0 for the return attribute // - if ((position < 0) || (position > parameters.Length)) + if ((position < 0) || parameters == null || (position > parameters.Length)) throw new ArgumentOutOfRangeException ("position"); ParameterBuilder pb = new ParameterBuilder (this, position, attributes, strParamName); diff --git a/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs index 57064be3027..f629f8a3861 100644 --- a/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs @@ -159,21 +159,28 @@ namespace System.Reflection.Emit { if (data == null) throw new ArgumentNullException ("data"); - FieldBuilder fb = DefineUninitializedData (name, data.Length, - attributes | FieldAttributes.HasFieldRVA); + var maskedAttributes = attributes & ~FieldAttributes.ReservedMask; + FieldBuilder fb = DefineDataImpl (name, data.Length, maskedAttributes | FieldAttributes.HasFieldRVA); fb.SetRVAData (data); return fb; } public FieldBuilder DefineUninitializedData (string name, int size, FieldAttributes attributes) + { + return DefineDataImpl (name, size, attributes & ~FieldAttributes.ReservedMask); + } + + private FieldBuilder DefineDataImpl (string name, int size, FieldAttributes attributes) { if (name == null) throw new ArgumentNullException ("name"); + if (name == String.Empty) + throw new ArgumentException ("name cannot be empty", "name"); if (global_type_created != null) throw new InvalidOperationException ("global fields already created"); - if ((size <= 0) || (size > 0x3f0000)) - throw new ArgumentException ("size", "Data size must be > 0 and < 0x3f0000"); + if ((size <= 0) || (size >= 0x3f0000)) + throw new ArgumentException ("Data size must be > 0 and < 0x3f0000", null as string); CreateGlobalType (); diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/ConstructorBuilderTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/ConstructorBuilderTest.cs index faaa55af818..57e86fa647c 100644 --- a/mcs/class/corlib/Test/System.Reflection.Emit/ConstructorBuilderTest.cs +++ b/mcs/class/corlib/Test/System.Reflection.Emit/ConstructorBuilderTest.cs @@ -195,23 +195,20 @@ public class ConstructorBuilderTest } [Test] - [Category ("NotDotNet")] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=341439 public void DefineParameter_Position_Zero () { + // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=341439 + // https://msdn.microsoft.com/en-us/library/system.reflection.emit.constructorbuilder.defineparameter(v=vs.110).aspx + // "If you specify 0 (zero) for iSequence, this method returns + // a ParameterBuilder instead of throwing an exception. There + // is nothing useful that you can do with this + // ParameterBuilder." + ConstructorBuilder cb = genClass.DefineConstructor ( 0, 0, new Type [2] { typeof (int), typeof (int) }); - try { - cb.DefineParameter (0, ParameterAttributes.In, "param1"); - Assert.Fail ("#1"); - } catch (ArgumentOutOfRangeException ex) { - // Specified argument was out of the range of valid values - Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); - Assert.IsNull (ex.ActualValue, "#3"); - Assert.IsNull (ex.InnerException, "#4"); - Assert.IsNotNull (ex.Message, "#5"); - Assert.IsNotNull (ex.ParamName, "#6"); - } + var pb = cb.DefineParameter (0, ParameterAttributes.In, "param1"); + Assert.IsNotNull (pb); } [Test] diff --git a/mcs/class/corlib/corlib_xtest.dll.sources b/mcs/class/corlib/corlib_xtest.dll.sources index 8cfedf1a9f2..88d9315ab5c 100644 --- a/mcs/class/corlib/corlib_xtest.dll.sources +++ b/mcs/class/corlib/corlib_xtest.dll.sources @@ -8,7 +8,7 @@ #../../../external/corefx/src/System.Reflection.Emit/tests/AssemblyBuilderTests.cs # ../../../external/corefx/src/System.Reflection.Emit/tests/ -#../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderDefineParameter.cs +../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderDefineParameter.cs #../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderGetILGenerator.cs ../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderInitLocals.cs ../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderSetCustomAttribute.cs @@ -26,8 +26,8 @@ ../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderGetValue.cs #../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetConstant.cs -#../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetCustomAttribute.cs -#../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetOffset.cs +../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetCustomAttribute.cs +../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetOffset.cs ../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTyepParameterBuilderSetBaseTypeConstraint.cs ../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderGUID.cs @@ -35,13 +35,13 @@ ../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderMakeByRefType.cs ../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderMakeGenericType.cs ../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderMakePointerType.cs -#../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderSetCustomAttribute.cs +../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderSetCustomAttribute.cs #../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderSetGenericParameterAttributes.cs #../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderSetInterfaceConstraints.cs ../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderContainsGenericParameters.cs #../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderDefineGenericParameters.cs -#../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderDefineParameter.cs +../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderDefineParameter.cs #../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderEquals.cs ../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderGetGenericArguments.cs ../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderGetGenericMethodDefinition.cs @@ -60,9 +60,9 @@ ../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderCreateGlobalFunctions.cs #../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineEnum.cs -#../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineInitializedData.cs +../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineInitializedData.cs #../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineType.cs -#../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineUninitializedData.cs +../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineUninitializedData.cs #../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderGetArrayMethod.cs #../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderSetCustomAttribute.cs