From c5ad5aedcc93ff8bf13aa81facc41858c918e2c1 Mon Sep 17 00:00:00 2001 From: Steve Molloy Date: Wed, 7 Jul 2021 23:19:42 -0700 Subject: [PATCH 1/2] Avoid nullref while trying to throw a more helpful exception. --- .../Runtime/Serialization/XmlObjectSerializerReadContext.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs index 4ba8da9b6cc303..5ec2dc5aa1f451 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs @@ -361,9 +361,9 @@ public void ReplaceDeserializedObject(string id, object? oldObj, object? newObj) // throw in such cases to allow us add fix-up support in the future if we need to. if (DeserializedObjects.IsObjectReferenced(id)) { - // https://github.com/dotnet/runtime/issues/41465 - oldObj or newObj may be null below - suppress compiler error by asserting non-null - Debug.Assert(oldObj != null && newObj != null); - throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.Format(SR.FactoryObjectContainsSelfReference, DataContract.GetClrTypeFullName(oldObj.GetType()), DataContract.GetClrTypeFullName(newObj.GetType()), id))); + var oldType = (oldObj != null) ? DataContract.GetClrTypeFullName(oldObj.GetType()) : "unknown type"; + var newType = (newObj != null) ? DataContract.GetClrTypeFullName(newObj.GetType()) : "unknown type"; + throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.Format(SR.FactoryObjectContainsSelfReference, oldType, newType, id))); } DeserializedObjects.Remove(id); DeserializedObjects.Add(id, newObj); From 7bbb50529e67cd748bdfca52fba8b65313b6328c Mon Sep 17 00:00:00 2001 From: Steve Molloy Date: Tue, 13 Jul 2021 00:39:22 -0700 Subject: [PATCH 2/2] Use resx for error string. --- .../src/Resources/Strings.resx | 3 +++ .../Runtime/Serialization/XmlObjectSerializerReadContext.cs | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Private.DataContractSerialization/src/Resources/Strings.resx b/src/libraries/System.Private.DataContractSerialization/src/Resources/Strings.resx index 2af9be2de6213a..b1fd0673389336 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/Resources/Strings.resx +++ b/src/libraries/System.Private.DataContractSerialization/src/Resources/Strings.resx @@ -1167,4 +1167,7 @@ Collection type '{0}' cannot be deserialized since it + + Unknown Type for null value + \ No newline at end of file diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs index 5ec2dc5aa1f451..0fa085b0f755c3 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs @@ -361,8 +361,8 @@ public void ReplaceDeserializedObject(string id, object? oldObj, object? newObj) // throw in such cases to allow us add fix-up support in the future if we need to. if (DeserializedObjects.IsObjectReferenced(id)) { - var oldType = (oldObj != null) ? DataContract.GetClrTypeFullName(oldObj.GetType()) : "unknown type"; - var newType = (newObj != null) ? DataContract.GetClrTypeFullName(newObj.GetType()) : "unknown type"; + string oldType = (oldObj != null) ? DataContract.GetClrTypeFullName(oldObj.GetType()) : SR.UnknownNullType; + string newType = (newObj != null) ? DataContract.GetClrTypeFullName(newObj.GetType()) : SR.UnknownNullType; throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.Format(SR.FactoryObjectContainsSelfReference, oldType, newType, id))); } DeserializedObjects.Remove(id);