diff --git a/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs b/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs index a4935aed..00ed7700 100644 --- a/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs +++ b/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs @@ -1243,5 +1243,24 @@ namespace Newtonsoft.Json.Tests.Bson Assert.AreEqual(new byte[] { 72, 63, 62, 71, 92, 55 }, newObject.Data); } } + +#if !(WINDOWS_PHONE || SILVERLIGHT || NET20 || NET35) + public void Utf8Text() + { + string badText =System.IO.File.ReadAllText(@"PoisonText.txt"); + var j = new JObject(); + j["test"] = badText; + + var memoryStream = new MemoryStream(); + var bsonWriter = new BsonWriter(memoryStream); + j.WriteTo(bsonWriter); + bsonWriter.Flush(); + + memoryStream.Position = 0; + JObject o = JObject.Load(new BsonReader(memoryStream)); + + Assert.AreEqual(badText, (string)o["test"]); + } +#endif } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs index ff612b56..030a8fdb 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs @@ -448,5 +448,18 @@ Parameter name: index")] Assert.AreEqual(123, (int)array[0]); Assert.AreEqual(456, (int)array[1]); } + + [Test] + [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unexpected state: Finished. Line 5, position 3.")] + public void ParseAdditionalContent() + { + string json = @"[ +""Small"", +""Medium"", +""Large"" +], 987987"; + + JArray.Parse(json); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs index 587ffdb8..959daecd 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs @@ -1624,5 +1624,23 @@ Parameter name: arrayIndex")] Assert.AreEqual("9065acf3-c820-467d-be50-8d4664beaf35", v.ToString()); } + + [Test] + [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unexpected state: Finished. Line 10, position 3.")] + public void ParseAdditionalContent() + { + string json = @"{ +""Name"": ""Apple"", +""Expiry"": new Date(1230422400000), +""Price"": 3.99, +""Sizes"": [ +""Small"", +""Medium"", +""Large"" +] +}, 987987"; + + JObject o = JObject.Parse(json); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs index 5b2e05b3..a5ceea07 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs @@ -739,5 +739,18 @@ namespace Newtonsoft.Json.Tests.Linq Assert.IsTrue(v1.DeepEquals(v2)); } + + [Test] + [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unexpected state: Finished. Line 5, position 3.")] + public void ParseAdditionalContent() + { + string json = @"[ +""Small"", +""Medium"", +""Large"" +], 987987"; + + JToken.Parse(json); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj index 8b90838c..bbd38403 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj @@ -306,6 +306,9 @@ Always + + Always + diff --git a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs index 13aae919..e24a613c 100644 --- a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs @@ -66,5 +66,5 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: [assembly: AssemblyVersion("4.0.3.0")] #if !PocketPC -[assembly: AssemblyFileVersion("4.0.3.14302")] +[assembly: AssemblyFileVersion("4.0.3.14319")] #endif diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index fd1930ea..fd394f26 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -5046,6 +5046,7 @@ keyword such as type of business."" } } +#if !(SILVERLIGHT || WINDOWS_PHONE || NET20) [Test] public void DeserializeDecimalsWithCulture() { @@ -5071,6 +5072,7 @@ keyword such as type of business."" Thread.CurrentThread.CurrentUICulture = initialCulture; } } +#endif } public class DecimalTestClass diff --git a/Src/Newtonsoft.Json/Bson/BsonBinaryWriter.cs b/Src/Newtonsoft.Json/Bson/BsonBinaryWriter.cs index c9ee4bdd..fdd0abec 100644 --- a/Src/Newtonsoft.Json/Bson/BsonBinaryWriter.cs +++ b/Src/Newtonsoft.Json/Bson/BsonBinaryWriter.cs @@ -10,7 +10,7 @@ namespace Newtonsoft.Json.Bson { internal class BsonBinaryWriter { - private static readonly Encoding Encoding = Encoding.UTF8; + private static readonly Encoding Encoding = new UTF8Encoding(false); private readonly BinaryWriter _writer; @@ -169,12 +169,19 @@ namespace Newtonsoft.Json.Bson if (calculatedlengthPrefix != null) _writer.Write(calculatedlengthPrefix.Value); + WriteUtf8Bytes(s, byteCount); + + _writer.Write((byte)0); + } + + public void WriteUtf8Bytes(string s, int byteCount) + { if (s != null) { if (_largeByteBuffer == null) { _largeByteBuffer = new byte[256]; - _maxChars = 256/Encoding.GetMaxByteCount(1); + _maxChars = 256 / Encoding.GetMaxByteCount(1); } if (byteCount <= 256) { @@ -183,19 +190,10 @@ namespace Newtonsoft.Json.Bson } else { - int charCount; - int totalCharsWritten = 0; - for (int i = s.Length; i > 0; i -= charCount) - { - charCount = (i > _maxChars) ? _maxChars : i; - int count = Encoding.GetBytes(s, totalCharsWritten, charCount, _largeByteBuffer, 0); - _writer.Write(_largeByteBuffer, 0, count); - totalCharsWritten += charCount; - } + byte[] bytes = Encoding.GetBytes(s); + _writer.Write(bytes); } } - - _writer.Write((byte)0); } private int CalculateSize(int stringByteCount) diff --git a/Src/Newtonsoft.Json/Converters/StringEnumConverter.cs b/Src/Newtonsoft.Json/Converters/StringEnumConverter.cs index e463ca29..cc5d4804 100644 --- a/Src/Newtonsoft.Json/Converters/StringEnumConverter.cs +++ b/Src/Newtonsoft.Json/Converters/StringEnumConverter.cs @@ -81,7 +81,7 @@ namespace Newtonsoft.Json.Converters if (CamelCaseText) { - var names = resolvedEnumName.Split(',').Select(item => StringUtils.ToCamelCase(item.Trim())); + string[] names = resolvedEnumName.Split(',').Select(item => StringUtils.ToCamelCase(item.Trim())).ToArray(); resolvedEnumName = string.Join(", ", names); } diff --git a/Src/Newtonsoft.Json/Linq/JArray.cs b/Src/Newtonsoft.Json/Linq/JArray.cs index 1c5ff74b..19058b9c 100644 --- a/Src/Newtonsoft.Json/Linq/JArray.cs +++ b/Src/Newtonsoft.Json/Linq/JArray.cs @@ -136,7 +136,12 @@ namespace Newtonsoft.Json.Linq { JsonReader jsonReader = new JsonTextReader(new StringReader(json)); - return Load(jsonReader); + JArray a = Load(jsonReader); + + if (jsonReader.Read() && jsonReader.TokenType != JsonToken.Comment) + throw new Exception("Additional text found in JSON string after parsing content."); + + return a; } /// diff --git a/Src/Newtonsoft.Json/Linq/JObject.cs b/Src/Newtonsoft.Json/Linq/JObject.cs index 3091c0f9..a12aa221 100644 --- a/Src/Newtonsoft.Json/Linq/JObject.cs +++ b/Src/Newtonsoft.Json/Linq/JObject.cs @@ -342,7 +342,12 @@ namespace Newtonsoft.Json.Linq { JsonReader jsonReader = new JsonTextReader(new StringReader(json)); - return Load(jsonReader); + JObject o = Load(jsonReader); + + if (jsonReader.Read() && jsonReader.TokenType != JsonToken.Comment) + throw new Exception("Additional text found in JSON string after parsing content."); + + return o; } /// diff --git a/Src/Newtonsoft.Json/Linq/JToken.cs b/Src/Newtonsoft.Json/Linq/JToken.cs index 7bc84f30..4b109832 100644 --- a/Src/Newtonsoft.Json/Linq/JToken.cs +++ b/Src/Newtonsoft.Json/Linq/JToken.cs @@ -1229,7 +1229,12 @@ namespace Newtonsoft.Json.Linq { JsonReader jsonReader = new JsonTextReader(new StringReader(json)); - return Load(jsonReader); + JToken t = Load(jsonReader); + + if (jsonReader.Read() && jsonReader.TokenType != JsonToken.Comment) + throw new Exception("Additional text found in JSON string after parsing content."); + + return t; } /// diff --git a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs index 97643c93..28b5ac30 100644 --- a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs @@ -85,7 +85,7 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("4.0.3.0")] #if !PocketPC -[assembly: AssemblyFileVersion("4.0.3.14302")] +[assembly: AssemblyFileVersion("4.0.3.14319")] #endif [assembly: CLSCompliant(true)]