Skip to content

Commit 816ba02

Browse files
authored
fix: SDK crash on conversion of double type range values to long type (#342)
1 parent d7efec6 commit 816ba02

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

Parse.Tests/JsonTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using System.Globalization;
45
using Microsoft.VisualStudio.TestTools.UnitTesting;
56
using Parse.Infrastructure.Utilities;
67

@@ -250,5 +251,29 @@ public void TestSpecialJsonNumbersAndModifiers()
250251

251252
Assert.AreEqual(123456789123456789, (JsonUtilities.Parse("{ \"mura\": 123456789123456789 }") as IDictionary)["mura"]);
252253
}
254+
255+
256+
[TestMethod]
257+
public void TestJsonNumbersAndValueRanges()
258+
{
259+
//Assert.ThrowsException<ArgumentException>(() => JsonUtilities.Parse("+123456789"));
260+
Assert.IsInstanceOfType((JsonUtilities.Parse("{ \"long\": " + long.MaxValue + " }") as IDictionary)["long"], typeof(long));
261+
Assert.IsInstanceOfType((JsonUtilities.Parse("{ \"long\": " + long.MinValue + " }") as IDictionary)["long"], typeof(long));
262+
263+
Assert.AreEqual((JsonUtilities.Parse("{ \"long\": " + long.MaxValue + " }") as IDictionary)["long"], long.MaxValue);
264+
Assert.AreEqual((JsonUtilities.Parse("{ \"long\": " + long.MinValue + " }") as IDictionary)["long"], long.MinValue);
265+
266+
267+
Assert.IsInstanceOfType((JsonUtilities.Parse("{ \"double\": " + double.MaxValue.ToString(CultureInfo.InvariantCulture) + " }") as IDictionary)["double"], typeof(double));
268+
Assert.IsInstanceOfType((JsonUtilities.Parse("{ \"double\": " + double.MinValue.ToString(CultureInfo.InvariantCulture) + " }") as IDictionary)["double"], typeof(double));
269+
270+
Assert.AreEqual((JsonUtilities.Parse("{ \"double\": " + double.MaxValue.ToString(CultureInfo.InvariantCulture) + " }") as IDictionary)["double"], double.MaxValue);
271+
Assert.AreEqual((JsonUtilities.Parse("{ \"double\": " + double.MinValue.ToString(CultureInfo.InvariantCulture) + " }") as IDictionary)["double"], double.MinValue);
272+
273+
double outOfInt64RangeValue = -9223372036854776000d;
274+
Assert.IsInstanceOfType((JsonUtilities.Parse("{ \"double\": " + outOfInt64RangeValue.ToString(CultureInfo.InvariantCulture) + " }") as IDictionary)["double"], typeof(double));
275+
Assert.AreEqual((JsonUtilities.Parse("{ \"double\": " + outOfInt64RangeValue.ToString(CultureInfo.InvariantCulture) + " }") as IDictionary)["double"], outOfInt64RangeValue);
276+
}
277+
253278
}
254279
}

Parse/Infrastructure/Utilities/JsonUtilities.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,20 @@ private bool ParseNumber(out object output)
212212
}
213213
else
214214
{
215-
output = Int64.Parse(m.Value, CultureInfo.InvariantCulture);
216-
return true;
215+
// try to parse to a long assuming it is an integer value (this might fail due to value range differences when storing as double without decimal point or exponent)
216+
if (Int64.TryParse(m.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out long longValue))
217+
{
218+
output = longValue;
219+
return true;
220+
}
221+
// try to parse as double again (most likely due to value range exceeding long type
222+
else if (Double.TryParse(m.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out double doubleValue))
223+
{
224+
output = doubleValue;
225+
return true;
226+
}
227+
else
228+
return false;
217229
}
218230
}
219231

0 commit comments

Comments
 (0)