Skip to content

Commit 7085a49

Browse files
committed
-Fix ReadAsBytes for empty strings
-Fix (hopefully) signing merged assemblies
1 parent 2f11d3f commit 7085a49

File tree

5 files changed

+60
-5
lines changed

5 files changed

+60
-5
lines changed

Build/build.ps1

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ function MergeAssembly($dllPrimaryAssembly, $signKey, [string[]]$mergedAssemlies
123123
$temporaryDir = $primary.DirectoryName + "\" + [Guid]::NewGuid().ToString()
124124
New-Item $temporaryDir -ItemType Directory
125125

126+
$ilMergeKeyFile = switch($signAssemblies) { $true { "/keyfile:$signKeyPath" } default { "" } }
127+
126128
try
127129
{
128130
exec { .\Tools\ILMerge\ilmerge.exe "/internalize" "/closed" "/log:$workingDir\$mergedAssemblyName.MergeLog.txt" $ilMergeKeyFile "/out:$temporaryDir\$mergedAssemblyName" $dllPrimaryAssembly $mergeAssemblyPaths } "Error executing ILMerge"

Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,6 @@ public void ReadBytesFromString()
261261

262262
TextReader textReader = new StringReader(json);
263263
JsonReader jsonReader = new JsonTextReader(textReader);
264-
//var result = (HasBytes)JsonSerializer.Create(null)
265-
// .Deserialize(jsonReader, typeof(HasBytes));
266264

267265
var jToken = JToken.ReadFrom(jsonReader);
268266

@@ -273,5 +271,24 @@ public void ReadBytesFromString()
273271

274272
Assert.AreEqual(new byte[] { 1, 2, 3, 4 }, result2.Bytes);
275273
}
274+
275+
[Test]
276+
public void ReadBytesFromEmptyString()
277+
{
278+
var bytes = new HasBytes { Bytes = new byte[0] };
279+
var json = JsonConvert.SerializeObject(bytes);
280+
281+
TextReader textReader = new StringReader(json);
282+
JsonReader jsonReader = new JsonTextReader(textReader);
283+
284+
var jToken = JToken.ReadFrom(jsonReader);
285+
286+
jsonReader = new JTokenReader(jToken);
287+
288+
var result2 = (HasBytes)JsonSerializer.Create(null)
289+
.Deserialize(jsonReader, typeof(HasBytes));
290+
291+
Assert.AreEqual(new byte[0], result2.Bytes);
292+
}
276293
}
277294
}

Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3436,5 +3436,32 @@ public void SerializeHashSet()
34363436
Assert.IsTrue(d.Contains("III"));
34373437
}
34383438
#endif
3439+
3440+
private class MyClass
3441+
{
3442+
public byte[] Prop1 { get; set; }
3443+
3444+
public MyClass()
3445+
{
3446+
Prop1 = new byte[0];
3447+
}
3448+
}
3449+
3450+
[Test]
3451+
public void DeserializeByteArray()
3452+
{
3453+
JsonSerializer serializer1 = new JsonSerializer();
3454+
serializer1.Converters.Add(new IsoDateTimeConverter());
3455+
serializer1.NullValueHandling = NullValueHandling.Ignore;
3456+
3457+
string json = @"[{""Prop1"":""""},{""Prop1"":""""}]";
3458+
3459+
JsonTextReader reader = new JsonTextReader(new StringReader(json));
3460+
3461+
MyClass[] z = (MyClass[])serializer1.Deserialize(reader, typeof(MyClass[]));
3462+
Assert.AreEqual(2, z.Length);
3463+
Assert.AreEqual(0, z[0].Prop1.Length);
3464+
Assert.AreEqual(0, z[1].Prop1.Length);
3465+
}
34393466
}
34403467
}

Src/Newtonsoft.Json/JsonTextReader.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,8 +337,16 @@ public override byte[] ReadAsBytes()
337337
case '\'':
338338
ReadStringIntoBuffer(currentChar);
339339

340-
byte[] data = Convert.FromBase64CharArray(_buffer.GetInternalBuffer(), 0, _buffer.Position);
341-
_buffer.Position = 0;
340+
byte[] data;
341+
if (_buffer.Position == 0)
342+
{
343+
data = new byte[0];
344+
}
345+
else
346+
{
347+
data = Convert.FromBase64CharArray(_buffer.GetInternalBuffer(), 0, _buffer.Position);
348+
_buffer.Position = 0;
349+
}
342350

343351
SetToken(JsonToken.Bytes, data);
344352

Src/Newtonsoft.Json/Linq/JTokenReader.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public override byte[] ReadAsBytes()
4141
// attempt to convert possible base 64 string to bytes
4242
if (TokenType == JsonToken.String)
4343
{
44-
byte[] data = Convert.FromBase64String((string)Value);
44+
string s = (string) Value;
45+
byte[] data = (s.Length == 0) ? new byte[0] : Convert.FromBase64String(s);
4546
SetToken(JsonToken.Bytes, data);
4647
}
4748

0 commit comments

Comments
 (0)