-Fixed overflow when converting incomplete JSON to XML

This commit is contained in:
James Newton-King
2017-04-22 11:13:28 +12:00
parent ec8949ca40
commit 822c3f00dd
3 changed files with 21 additions and 114 deletions
@@ -916,6 +916,16 @@ namespace Newtonsoft.Json.Tests.Converters
Assert.AreEqual(doc.InnerXml, deserializedDoc.InnerXml);
}
[Test]
public void FailOnIncomplete()
{
string json = @"{'Row' : ";
ExceptionAssert.Throws<JsonSerializationException>(
() => JsonConvert.DeserializeXmlNode(json, "ROOT"),
"Unexpected end when reading JSON. Path 'Row', line 1, position 9.");
}
[Test]
public void DocumentDeserialize()
{
@@ -367,109 +367,6 @@ namespace Newtonsoft.Json.Tests.Schema
return c;
}
}
[Test]
public void GenerateSchemaForDirectoryInfo()
{
JsonSchemaGenerator generator = new JsonSchemaGenerator();
generator.UndefinedSchemaIdHandling = UndefinedSchemaIdHandling.UseTypeName;
generator.ContractResolver = new CustomDirectoryInfoMapper
{
#if !(PORTABLE || DNXCORE50)
IgnoreSerializableAttribute = true
#endif
};
JsonSchema schema = generator.Generate(typeof(DirectoryInfo), true);
string json = schema.ToString();
StringAssert.AreEqual(@"{
""id"": ""System.IO.DirectoryInfo"",
""required"": true,
""type"": [
""object"",
""null""
],
""additionalProperties"": false,
""properties"": {
""Name"": {
""required"": true,
""type"": [
""string"",
""null""
]
},
""Parent"": {
""$ref"": ""System.IO.DirectoryInfo""
},
""Exists"": {
""required"": true,
""type"": ""boolean""
},
""FullName"": {
""required"": true,
""type"": [
""string"",
""null""
]
},
""Extension"": {
""required"": true,
""type"": [
""string"",
""null""
]
},
""CreationTime"": {
""required"": true,
""type"": ""string""
},
""CreationTimeUtc"": {
""required"": true,
""type"": ""string""
},
""LastAccessTime"": {
""required"": true,
""type"": ""string""
},
""LastAccessTimeUtc"": {
""required"": true,
""type"": ""string""
},
""LastWriteTime"": {
""required"": true,
""type"": ""string""
},
""LastWriteTimeUtc"": {
""required"": true,
""type"": ""string""
},
""Attributes"": {
""required"": true,
""type"": ""integer""
}
}
}", json);
DirectoryInfo temp = new DirectoryInfo(@"c:\temp");
JTokenWriter jsonWriter = new JTokenWriter();
JsonSerializer serializer = new JsonSerializer();
serializer.Converters.Add(new IsoDateTimeConverter());
serializer.ContractResolver = new CustomDirectoryInfoMapper
{
#if !(PORTABLE || DNXCORE50)
IgnoreSerializableInterface = true
#endif
};
serializer.Serialize(jsonWriter, temp);
List<string> errors = new List<string>();
jsonWriter.Token.Validate(schema, (sender, args) => errors.Add(args.Message));
Assert.AreEqual(0, errors.Count);
}
#endif
[Test]
@@ -1667,7 +1667,7 @@ namespace Newtonsoft.Json.Converters
}
else
{
reader.Read();
reader.ReadAndAssert();
DeserializeNode(reader, document, manager, rootNode);
}
@@ -1979,7 +1979,7 @@ namespace Newtonsoft.Json.Converters
}
attributeName = attributeName.Substring(1);
reader.Read();
reader.ReadAndAssert();
attributeValue = ConvertTokenToXmlValue(reader);
attributeNameValues.Add(attributeName, attributeValue);
@@ -2027,7 +2027,7 @@ namespace Newtonsoft.Json.Converters
}
attributeName = attributeName.Substring(1);
reader.Read();
reader.ReadAndAssert();
if (!JsonTokenUtils.IsPrimitiveToken(reader.TokenType))
{
@@ -2082,15 +2082,15 @@ namespace Newtonsoft.Json.Converters
switch (reader.Value.ToString())
{
case "@version":
reader.Read();
reader.ReadAndAssert();
version = ConvertTokenToXmlValue(reader);
break;
case "@encoding":
reader.Read();
reader.ReadAndAssert();
encoding = ConvertTokenToXmlValue(reader);
break;
case "@standalone":
reader.Read();
reader.ReadAndAssert();
standalone = ConvertTokenToXmlValue(reader);
break;
default:
@@ -2120,19 +2120,19 @@ namespace Newtonsoft.Json.Converters
switch (reader.Value.ToString())
{
case "@name":
reader.Read();
reader.ReadAndAssert();
name = ConvertTokenToXmlValue(reader);
break;
case "@public":
reader.Read();
reader.ReadAndAssert();
publicId = ConvertTokenToXmlValue(reader);
break;
case "@system":
reader.Read();
reader.ReadAndAssert();
systemId = ConvertTokenToXmlValue(reader);
break;
case "@internalSubset":
reader.Read();
reader.ReadAndAssert();
internalSubset = ConvertTokenToXmlValue(reader);
break;
default:
@@ -2168,7 +2168,7 @@ namespace Newtonsoft.Json.Converters
}
string propertyName = reader.Value.ToString();
reader.Read();
reader.ReadAndAssert();
if (reader.TokenType == JsonToken.StartArray)
{