diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs
index 513db0c44..8f82476e1 100644
--- a/src/ImageSharp/Common/Helpers/Numerics.cs
+++ b/src/ImageSharp/Common/Helpers/Numerics.cs
@@ -963,5 +963,14 @@ namespace SixLabors.ImageSharp
public static uint RotateRightSoftwareFallback(uint value, int offset)
=> (value >> offset) | (value << (32 - offset));
#endif
+
+ ///
+ /// Tells whether input value is outside of the given range.
+ ///
+ /// Value.
+ /// Mininum value, inclusive.
+ /// Maximum value, inclusive.
+ public static bool IsOutOfRange(int value, int min, int max)
+ => (uint)(value - min) > (uint)(max - min);
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
index 4543153de..4b68c39ea 100644
--- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
+++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
@@ -1031,13 +1031,13 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
int v = hv & 15;
// Validate: 1-4 range
- if (h is < 1 or > 4)
+ if (Numerics.IsOutOfRange(h, 1, 4))
{
JpegThrowHelper.ThrowBadSampling(h);
}
// Validate: 1-4 range
- if (v is < 1 or > 4)
+ if (Numerics.IsOutOfRange(v, 1, 4))
{
JpegThrowHelper.ThrowBadSampling(v);
}
diff --git a/tests/ImageSharp.Tests/Common/NumericsTests.cs b/tests/ImageSharp.Tests/Common/NumericsTests.cs
index 62819af49..2a43b06a9 100644
--- a/tests/ImageSharp.Tests/Common/NumericsTests.cs
+++ b/tests/ImageSharp.Tests/Common/NumericsTests.cs
@@ -97,5 +97,25 @@ namespace SixLabors.ImageSharp.Tests.Common
Assert.True(expected == actual, $"Expected: {expected}\nActual: {actual}\n{value} / {divisor} = {expected}");
}
}
+
+ private static bool IsOutOfRange_ReferenceImplementation(int value, int min, int max) => value < min || value > max;
+
+ [Theory]
+ [InlineData(1, 100)]
+ public void IsOutOfRange(int seed, int count)
+ {
+ var rng = new Random(seed);
+ for (int i = 0; i < count; i++)
+ {
+ int value = rng.Next();
+ int min = rng.Next();
+ int max = rng.Next(min, int.MaxValue);
+
+ bool expected = IsOutOfRange_ReferenceImplementation(value, min, max);
+ bool actual = Numerics.IsOutOfRange(value, min, max);
+
+ Assert.True(expected == actual, $"IsOutOfRange({value}, {min}, {max})");
+ }
+ }
}
}