[Mono-bugs] [Bug 641821] New: [PATCH] version tolerant serialization fails with missing primitive typed members

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Fri Sep 24 18:48:43 EDT 2010


https://bugzilla.novell.com/show_bug.cgi?id=641821

https://bugzilla.novell.com/show_bug.cgi?id=641821#c0


           Summary: [PATCH] version tolerant serialization fails with
                    missing primitive typed members
    Classification: Mono
           Product: Mono: Class Libraries
           Version: SVN
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: CORLIB
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: ambroff at lindenlab.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


User-Agent:       Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/5343
(KHTML, like Gecko) Chrome/6.0.472.62 Safari/534.3

The attached patch includes an extension to the VTS tests that Andrés added
recently, which tests deserializing an Address object that contains a member of
type int called 'Id', as well as a fix to
System.Runtime.Serialization.Formatters.Binary.ObjectReader to make that test
pass.

It turns out that while the member was properly being ignored when the Address
type in the current domain doesn't have that member, the parser was not seeking
past the value to the next block in the stream, so it would try to read value
as the type metadata of the next block, which would normally be a
BinaryCommon.BinaryElement enum.

We tested deserializing an object serialized with Microsoft's implementation to
make sure that mono's ObjectWriter class wasn't writing bad data. The test case
works fine with Microsoft's implementation.

The patch to ObjectReader just has it read the value anyway and throw it away
if we know it's a primitive type, so that we seek to the next block of the
object stream.

Reproducible: Always

Actual Results:  
Without the patch to ObjectReader.cs, you get the following traceback when
running make -C mcs/class/corlib run-test-vts:

Unhandled Exception: System.Runtime.Serialization.SerializationException:
Unexpected binary element: 0
  at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject
(BinaryElement element, System.IO.BinaryReader reader, System.Int64& objectId,
System.Object& value, System.Runtime.Serialization.SerializationInfo& info)
[0x00000] in <filename unknown>:0 
  at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadValue
(System.IO.BinaryReader reader, System.Object parentObject, Int64
parentObjectId, System.Runtime.Serialization.SerializationInfo info,
System.Type valueType, System.String fieldName, System.Reflection.MemberInfo
memberInfo, System.Int32[] indices) [0x00000] in <filename unknown>:0

Note that the unexpected binary element "0" is from the value of the Id member
in the stream, which in the test is set to 0. If it's set to another value,
say, 9, the parser will get confused and think it's reading a
BinaryElement.ObjectReference, and then crash later.


If this patch looks safe, it can be pulled from my git repo.

-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list