diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj
index 75d4b173c8..b08c27c41b 100644
--- a/src/ImageSharp/ImageSharp.csproj
+++ b/src/ImageSharp/ImageSharp.csproj
@@ -22,8 +22,8 @@
-
- 3.0
+
+ 3.1
diff --git a/src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs
index 798edf9b22..0bae193632 100644
--- a/src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs
+++ b/src/ImageSharp/Memory/Allocators/UniformUnmanagedMemoryPoolMemoryAllocator.cs
@@ -117,6 +117,11 @@ internal override MemoryGroup AllocateGroup(
AllocationOptions options = AllocationOptions.None)
{
long totalLengthInBytes = totalLength * Unsafe.SizeOf();
+ if (totalLengthInBytes < 0)
+ {
+ throw new InvalidMemoryOperationException("Attempted to allocate a MemoryGroup of a size that is not representable.");
+ }
+
if (totalLengthInBytes <= this.sharedArrayPoolThresholdInBytes)
{
var buffer = new SharedArrayPoolBuffer((int)totalLength);
diff --git a/tests/ImageSharp.Tests/Image/ImageTests.cs b/tests/ImageSharp.Tests/Image/ImageTests.cs
index 1dec14ee16..ca51f7f5cb 100644
--- a/tests/ImageSharp.Tests/Image/ImageTests.cs
+++ b/tests/ImageSharp.Tests/Image/ImageTests.cs
@@ -6,6 +6,7 @@
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Formats.Png;
+using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests.Memory;
@@ -35,6 +36,10 @@ public void Width_Height()
}
}
+ [Fact]
+ public void Width_Height_SizeNotRepresentable_ThrowsInvalidImageOperationException()
+ => Assert.Throws(() => new Image(int.MaxValue, int.MaxValue));
+
[Fact]
public void Configuration_Width_Height()
{
diff --git a/tests/ImageSharp.Tests/Memory/Allocators/UniformUnmanagedPoolMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Allocators/UniformUnmanagedPoolMemoryAllocatorTests.cs
index 3403e3f17e..7e7c136635 100644
--- a/tests/ImageSharp.Tests/Memory/Allocators/UniformUnmanagedPoolMemoryAllocatorTests.cs
+++ b/tests/ImageSharp.Tests/Memory/Allocators/UniformUnmanagedPoolMemoryAllocatorTests.cs
@@ -107,6 +107,13 @@ public void AllocateGroup_MultipleTimes_ExceedPoolLimit()
}
}
+ [Fact]
+ public void AllocateGroup_SizeInBytesOverLongMaxValue_ThrowsInvalidMemoryOperationException()
+ {
+ var allocator = new UniformUnmanagedMemoryPoolMemoryAllocator(null);
+ Assert.Throws(() => allocator.AllocateGroup(int.MaxValue * (long)int.MaxValue, int.MaxValue));
+ }
+
[Fact]
public unsafe void Allocate_MemoryIsPinnableMultipleTimes()
{