From c81c00251397cb7747fe36a7ccf9efa665e6d8ec Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Wed, 7 May 2008 14:00:30 +0000 Subject: [PATCH] In System: 2008-05-07 Robert Jordan * RuntimeFieldHandle.cs, RuntimeTypeHandle.cs, RuntimeMethodHandle.cs: Don't try to serialize uninitialized handles. Fixes #386641. In .: 2008-05-07 Robert Jordan * corlib_test.dll.sources: Add System/Runtime*HandleTest.cs In Test/System: 2008-05-07 Robert Jordan * Runtime*Handle.cs: Add serialization tests. svn path=/trunk/mcs/; revision=102727 --- mcs/class/corlib/ChangeLog | 4 ++ mcs/class/corlib/System/ChangeLog | 5 ++ mcs/class/corlib/System/RuntimeFieldHandle.cs | 3 + .../corlib/System/RuntimeMethodHandle.cs | 3 + mcs/class/corlib/System/RuntimeTypeHandle.cs | 12 +++- mcs/class/corlib/Test/System/ChangeLog | 4 ++ .../Test/System/RuntimeFieldHandleTest.cs | 49 +++++++++++++++ .../Test/System/RuntimeMethodHandleTest.cs | 11 ++++ .../Test/System/RuntimeTypeHandleTest.cs | 60 +++++++++++++++++++ mcs/class/corlib/corlib_test.dll.sources | 2 + 10 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 mcs/class/corlib/Test/System/RuntimeFieldHandleTest.cs create mode 100644 mcs/class/corlib/Test/System/RuntimeTypeHandleTest.cs diff --git a/mcs/class/corlib/ChangeLog b/mcs/class/corlib/ChangeLog index 7f741a578da..bae6a9f6992 100644 --- a/mcs/class/corlib/ChangeLog +++ b/mcs/class/corlib/ChangeLog @@ -1,3 +1,7 @@ +2008-05-07 Robert Jordan + + * corlib_test.dll.sources: Add System/Runtime*HandleTest.cs + 2008-05-07 Sebastien Pouliot * corlib.dll.sources: Remove System.IO/Check[Argument|Permission].cs diff --git a/mcs/class/corlib/System/ChangeLog b/mcs/class/corlib/System/ChangeLog index a4752dc61ea..9dc99713c88 100644 --- a/mcs/class/corlib/System/ChangeLog +++ b/mcs/class/corlib/System/ChangeLog @@ -1,3 +1,8 @@ +2008-05-07 Robert Jordan + + * RuntimeFieldHandle.cs, RuntimeTypeHandle.cs, RuntimeMethodHandle.cs: + Don't try to serialize uninitialized handles. Fixes #386641. + 2008-05-06 Marek Safar * IntPtr.cs (eplicit long, GetObjectData): Use ToInt64. diff --git a/mcs/class/corlib/System/RuntimeFieldHandle.cs b/mcs/class/corlib/System/RuntimeFieldHandle.cs index c796f588f41..c2e88355d81 100644 --- a/mcs/class/corlib/System/RuntimeFieldHandle.cs +++ b/mcs/class/corlib/System/RuntimeFieldHandle.cs @@ -77,6 +77,9 @@ namespace System if (info == null) throw new ArgumentNullException ("info"); + if (value == IntPtr.Zero) + throw new SerializationException ("Object fields may not be properly initialized"); + info.AddValue ("FieldObj", (MonoField) FieldInfo.GetFieldFromHandle (this), typeof (MonoField)); } diff --git a/mcs/class/corlib/System/RuntimeMethodHandle.cs b/mcs/class/corlib/System/RuntimeMethodHandle.cs index bff94af25a8..8f2266cfe36 100644 --- a/mcs/class/corlib/System/RuntimeMethodHandle.cs +++ b/mcs/class/corlib/System/RuntimeMethodHandle.cs @@ -77,6 +77,9 @@ namespace System if (info == null) throw new ArgumentNullException ("info"); + if (value == IntPtr.Zero) + throw new SerializationException ("Object fields may not be properly initialized"); + info.AddValue ("MethodObj", (MonoMethod) MethodBase.GetMethodFromHandle (this), typeof (MonoMethod)); } diff --git a/mcs/class/corlib/System/RuntimeTypeHandle.cs b/mcs/class/corlib/System/RuntimeTypeHandle.cs index f4f8721541d..20c0cf9b448 100644 --- a/mcs/class/corlib/System/RuntimeTypeHandle.cs +++ b/mcs/class/corlib/System/RuntimeTypeHandle.cs @@ -76,6 +76,9 @@ namespace System if (info == null) throw new ArgumentNullException ("info"); + if (value == IntPtr.Zero) + throw new SerializationException ("Object fields may not be properly initialized"); + info.AddValue ("TypeObj", Type.GetTypeHandle (this), typeof (MonoType)); } @@ -122,7 +125,14 @@ namespace System [CLSCompliant (false)] [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)] - public ModuleHandle GetModuleHandle () { + public ModuleHandle GetModuleHandle () + { + // Although MS' runtime is crashing here, we prefer throwing an exception. + // The check is needed because Type.GetTypeFromHandle returns null + // for zero handles. + if (value == IntPtr.Zero) + throw new InvalidOperationException ("Object fields may not be properly initialized"); + return Type.GetTypeFromHandle (this).Module.ModuleHandle; } #endif diff --git a/mcs/class/corlib/Test/System/ChangeLog b/mcs/class/corlib/Test/System/ChangeLog index 61e3b505172..7bc42dbad69 100644 --- a/mcs/class/corlib/Test/System/ChangeLog +++ b/mcs/class/corlib/Test/System/ChangeLog @@ -1,3 +1,7 @@ +2008-05-07 Robert Jordan + + * Runtime*Handle.cs: Add serialization tests. + 2008-05-02 Atsushi Enomoto * ConvertTest.cs : added test for Convert.FromBase64String() diff --git a/mcs/class/corlib/Test/System/RuntimeFieldHandleTest.cs b/mcs/class/corlib/Test/System/RuntimeFieldHandleTest.cs new file mode 100644 index 00000000000..f28a0b0bf0c --- /dev/null +++ b/mcs/class/corlib/Test/System/RuntimeFieldHandleTest.cs @@ -0,0 +1,49 @@ +// +// RuntimeFieldHandleTest.cs - Unit tests for System.RuntimeFieldHandle +// +// Author: +// Robert Jordan +// +// Copyright (C) 2008 Novell, Inc. (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; + +using NUnit.Framework; + +namespace MonoTests.System +{ + [TestFixture] + public class RuntimeFieldHandleTest + { + [Test] + [ExpectedException (typeof (SerializationException))] + public void Serialization_Of_Empty_Handle () + { + RuntimeFieldHandle handle = new RuntimeFieldHandle (); + new BinaryFormatter ().Serialize (Stream.Null, handle); + } + } +} diff --git a/mcs/class/corlib/Test/System/RuntimeMethodHandleTest.cs b/mcs/class/corlib/Test/System/RuntimeMethodHandleTest.cs index 124f9422e0a..e7c1f70badf 100644 --- a/mcs/class/corlib/Test/System/RuntimeMethodHandleTest.cs +++ b/mcs/class/corlib/Test/System/RuntimeMethodHandleTest.cs @@ -27,6 +27,9 @@ // using System; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; using NUnit.Framework; @@ -98,5 +101,13 @@ namespace MonoTests.System Assert.IsTrue (rmhB1 != rmhA1, "#B6"); } #endif + + [Test] + [ExpectedException (typeof (SerializationException))] + public void Serialization_Of_Empty_Handle () + { + RuntimeMethodHandle handle = new RuntimeMethodHandle (); + new BinaryFormatter ().Serialize (Stream.Null, handle); + } } } diff --git a/mcs/class/corlib/Test/System/RuntimeTypeHandleTest.cs b/mcs/class/corlib/Test/System/RuntimeTypeHandleTest.cs new file mode 100644 index 00000000000..0405b752619 --- /dev/null +++ b/mcs/class/corlib/Test/System/RuntimeTypeHandleTest.cs @@ -0,0 +1,60 @@ +// +// RuntimeTypeHandleTest.cs - Unit tests for System.RuntimeTypeHandle +// +// Author: +// Robert Jordan +// +// Copyright (C) 2008 Novell, Inc. (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; + +using NUnit.Framework; + +namespace MonoTests.System +{ + [TestFixture] + public class RuntimeTypeHandleTest + { + [Test] + [ExpectedException (typeof (SerializationException))] + public void Serialization_Of_Empty_Handle () + { + RuntimeTypeHandle handle = new RuntimeTypeHandle (); + new BinaryFormatter ().Serialize (Stream.Null, handle); + } + +#if NET_2_0 + [Test] + [ExpectedException (typeof (InvalidOperationException))] + [Category ("NotDotNet")] // it crashes the runtime on MS.NET + public void GetModuleHandle_Of_Empty_Handle () + { + RuntimeTypeHandle handle = new RuntimeTypeHandle (); + handle.GetModuleHandle (); + } +#endif + } +} diff --git a/mcs/class/corlib/corlib_test.dll.sources b/mcs/class/corlib/corlib_test.dll.sources index 7861565ee3e..44d2b6ba860 100644 --- a/mcs/class/corlib/corlib_test.dll.sources +++ b/mcs/class/corlib/corlib_test.dll.sources @@ -358,8 +358,10 @@ System/ConsoleCas.cs System/EnvironmentCas.cs System/ExceptionCas.cs System/MarshalByRefObjectCas.cs +System/RuntimeFieldHandleTest.cs System/RuntimeMethodHandleCas.cs System/RuntimeMethodHandleTest.cs +System/RuntimeTypeHandleTest.cs System/TypedReferenceCas.cs System.Diagnostics/StackFrameCas.cs System.Diagnostics/StackTraceCas.cs -- 2.25.1