Fix overflow exception (#3142)
* refactor(TimestampTagStyles): replace ASCII integer values with character literals (#1) * fix: validate min/max value against OverflowException
This commit is contained in:
@@ -8,6 +8,21 @@ namespace Discord
|
||||
{
|
||||
internal static class ObjectExtensions
|
||||
{
|
||||
private const long Int53Max = (1L << 53) - 1;
|
||||
private const long Int53Min = -Int53Max;
|
||||
|
||||
public static (double Min, double Max) GetSupportedNumericalRange(this object o)
|
||||
=> Type.GetTypeCode(o.GetType()) switch
|
||||
{
|
||||
TypeCode.Byte => (byte.MinValue, byte.MaxValue),
|
||||
TypeCode.SByte => (sbyte.MinValue, sbyte.MaxValue),
|
||||
TypeCode.Int16 => (short.MinValue, short.MaxValue),
|
||||
TypeCode.UInt16 => (ushort.MinValue, ushort.MaxValue),
|
||||
TypeCode.Int32 => (int.MinValue, int.MaxValue),
|
||||
TypeCode.UInt32 => (uint.MinValue, uint.MaxValue),
|
||||
_ => (Int53Min, Int53Max)
|
||||
};
|
||||
|
||||
public static bool IsNumericType(this object o)
|
||||
{
|
||||
switch (Type.GetTypeCode(o.GetType()))
|
||||
|
||||
@@ -466,6 +466,10 @@ namespace Discord.Interactions.Builders
|
||||
builder.IsRequired = !paramInfo.IsOptional;
|
||||
builder.DefaultValue = paramInfo.DefaultValue;
|
||||
|
||||
var supportedNumericalRange = paramInfo.GetSupportedNumericalRange();
|
||||
builder.MinValue = supportedNumericalRange.Min;
|
||||
builder.MaxValue = supportedNumericalRange.Max;
|
||||
|
||||
foreach (var attribute in attributes)
|
||||
{
|
||||
switch (attribute)
|
||||
@@ -497,9 +501,15 @@ namespace Discord.Interactions.Builders
|
||||
builder.WithAutocompleteHandler(autocomplete.AutocompleteHandlerType, services);
|
||||
break;
|
||||
case MaxValueAttribute maxValue:
|
||||
if (maxValue.Value > supportedNumericalRange.Max)
|
||||
throw new ArgumentOutOfRangeException($"{nameof(maxValue)} cannot be greater than {supportedNumericalRange.Max}.");
|
||||
|
||||
builder.MaxValue = maxValue.Value;
|
||||
break;
|
||||
case MinValueAttribute minValue:
|
||||
if (minValue.Value < supportedNumericalRange.Min)
|
||||
throw new ArgumentOutOfRangeException($"{nameof(minValue)} cannot be less than {supportedNumericalRange.Min}.");
|
||||
|
||||
builder.MinValue = minValue.Value;
|
||||
break;
|
||||
case MinLengthAttribute minLength:
|
||||
|
||||
Reference in New Issue
Block a user