2005-12-07 Sebastien Pouliot <sebastien@ximian.com>
authorSebastien Pouliot <sebastien@ximian.com>
Wed, 7 Dec 2005 16:29:19 +0000 (16:29 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Wed, 7 Dec 2005 16:29:19 +0000 (16:29 -0000)
* BinaryFormatter.cs: Implemented UnsafeDeserialize and
UnsafeDeserializeMethodResponse methods. Fixes last TODO in this
namespace (for both 1.1 and 2.0 profiles).

svn path=/trunk/mcs/; revision=54045

mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ChangeLog

index 8a729c2a72bd74086e707e779699c87aa5a20073..8084d7cb1d17f2b61a65a159f62b43420b97fc20 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System.Reflection;
 using System.Collections;
 using System.IO;
+using System.Reflection;
+using System.Runtime.InteropServices;
 using System.Runtime.Remoting.Messaging;
 using System.Security.Permissions;
 
@@ -37,14 +38,18 @@ namespace System.Runtime.Serialization.Formatters.Binary {
 
        public sealed class BinaryFormatter : IRemotingFormatter, IFormatter 
        {
+#if NET_2_0
+               private FormatterAssemblyStyle assembly_format = FormatterAssemblyStyle.Simple;
+#else
                private FormatterAssemblyStyle assembly_format = FormatterAssemblyStyle.Full;
+#endif
                private SerializationBinder binder;
                private StreamingContext context;
                private ISurrogateSelector surrogate_selector;
                private FormatterTypeStyle type_format = FormatterTypeStyle.TypesAlways;
                
 #if NET_1_1
-               private TypeFilterLevel filter_level;
+               private TypeFilterLevel filter_level = TypeFilterLevel.Full;
 #endif
                
                public BinaryFormatter()
@@ -118,16 +123,24 @@ namespace System.Runtime.Serialization.Formatters.Binary {
                }
 #endif
 
-               public object Deserialize(Stream serializationStream)
+               [SecurityPermission (SecurityAction.Demand, SerializationFormatter = true)]
+               public object Deserialize (Stream serializationStream)
+               {
+                       return NoCheckDeserialize (serializationStream, null);
+               }
+
+               [SecurityPermission (SecurityAction.Demand, SerializationFormatter = true)]
+               public object Deserialize (Stream serializationStream, HeaderHandler handler) 
                {
-                       return Deserialize (serializationStream, null);
+                       return NoCheckDeserialize (serializationStream, handler);
                }
 
-               public object Deserialize(Stream serializationStream, HeaderHandler handler) 
+               // shared by Deserialize and UnsafeDeserialize which both involve different security checks
+               private object NoCheckDeserialize (Stream serializationStream, HeaderHandler handler)
                {
                        if(serializationStream==null) \r
                        {
-                               throw new ArgumentNullException("serializationStream is null");
+                               throw new ArgumentNullException("serializationStream");
                        }
                        if(serializationStream.CanSeek &&
                                serializationStream.Length==0) \r
@@ -162,10 +175,17 @@ namespace System.Runtime.Serialization.Formatters.Binary {
                        }
                }
                
-               public object DeserializeMethodResponse(Stream serializationStream, HeaderHandler handler, IMethodCallMessage methodCallmessage)
+               [SecurityPermission (SecurityAction.Demand, SerializationFormatter = true)]
+               public object DeserializeMethodResponse (Stream serializationStream, HeaderHandler handler, IMethodCallMessage methodCallmessage)
+               {
+                       return NoCheckDeserializeMethodResponse (serializationStream, handler, methodCallmessage);
+               }
+
+               // shared by DeserializeMethodResponse and UnsafeDeserializeMethodResponse which both involve different security checks
+               private object NoCheckDeserializeMethodResponse (Stream serializationStream, HeaderHandler handler, IMethodCallMessage methodCallmessage)
                {
                        if(serializationStream==null) {
-                               throw new ArgumentNullException("serializationStream is null");
+                               throw new ArgumentNullException("serializationStream");
                        }
                        if(serializationStream.CanSeek &&
                           serializationStream.Length==0) {
@@ -207,18 +227,22 @@ namespace System.Runtime.Serialization.Formatters.Binary {
                        writer.Flush();
                }
 \r
-               [MonoTODO]
-               [System.Runtime.InteropServices.ComVisible (false)]
-               public object UnsafeDeserialize(Stream serializationStream, HeaderHandler handler) 
+               // faster version (under CAS) as this requires a LinkDemand versus full Demand (i.e. a stack-walk)
+               // shouldn't be called unless the code is intended to be executed at full-trust
+               [ComVisible (false)]
+               [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
+               public object UnsafeDeserialize (Stream serializationStream, HeaderHandler handler) 
                {
-                       throw new NotImplementedException ();
+                       return NoCheckDeserialize (serializationStream, handler);
                }
                
-               [MonoTODO]
-               [System.Runtime.InteropServices.ComVisible (false)]
-               public object UnsafeDeserializeMethodResponse(Stream serializationStream, HeaderHandler handler, IMethodCallMessage methodCallmessage)
+               // faster version (under CAS) as this requires a LinkDemand versus full Demand (i.e. a stack-walk)
+               // shouldn't be called unless the code is intended to be executed at full-trust
+               [ComVisible (false)]
+               [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
+               public object UnsafeDeserializeMethodResponse (Stream serializationStream, HeaderHandler handler, IMethodCallMessage methodCallmessage)
                {
-                       throw new NotImplementedException ();
+                       return NoCheckDeserializeMethodResponse (serializationStream, handler, methodCallmessage);
                }
                
                private void WriteBinaryHeader (BinaryWriter writer, bool hasHeaders)\r
index 2277d006977ed97f6ca997b914473f47828e77c4..23367f4a69510cb51e5f103e0acfcf7b650ef1b9 100644 (file)
@@ -1,3 +1,9 @@
+2005-12-07  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * BinaryFormatter.cs: Implemented UnsafeDeserialize and 
+       UnsafeDeserializeMethodResponse methods. Fixes last TODO in this
+       namespace (for both 1.1 and 2.0 profiles).
+
 2005-12-07  Lluis Sanchez Gual  <lluis@ximian.com>
 
        * ObjectReader.cs: Added null check in GetDeserializationType.