diff --git a/src/ImageSharp/Formats/Tiff/Compression/TiffBaseDecompressor.cs b/src/ImageSharp/Formats/Tiff/Compression/TiffBaseDecompressor.cs
index d5de4937f..986d585d3 100644
--- a/src/ImageSharp/Formats/Tiff/Compression/TiffBaseDecompressor.cs
+++ b/src/ImageSharp/Formats/Tiff/Compression/TiffBaseDecompressor.cs
@@ -36,10 +36,8 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
/// The output buffer for uncompressed data.
public void Decompress(BufferedReadStream stream, ulong stripOffset, ulong stripByteCount, int stripHeight, Span buffer)
{
- if (stripOffset > long.MaxValue || stripByteCount > long.MaxValue)
- {
- TiffThrowHelper.ThrowImageFormatException("The StripOffset or StripByteCount value is too big.");
- }
+ DebugGuard.MustBeLessThanOrEqualTo(stripOffset, (ulong)long.MaxValue, nameof(stripOffset));
+ DebugGuard.MustBeLessThanOrEqualTo(stripByteCount, (ulong)long.MaxValue, nameof(stripByteCount));
stream.Seek((long)stripOffset, SeekOrigin.Begin);
this.Decompress(stream, (int)stripByteCount, stripHeight, buffer);
diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
index 98adc5183..419fbc31c 100644
--- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
+++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
@@ -473,10 +473,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
TiffThrowHelper.ThrowImageFormatException("The TIFF image frame is missing the ImageWidth");
}
- if (((ulong)width.Value) > int.MaxValue)
- {
- TiffThrowHelper.ThrowImageFormatException("Too big ImageWidth value");
- }
+ DebugGuard.MustBeLessThanOrEqualTo((ulong)width.Value, (ulong)int.MaxValue, nameof(ExifTag.ImageWidth));
return (int)width.Value;
}
diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifLong8Array.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifLong8Array.cs
index 366eb8d12..eced4e3de 100644
--- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifLong8Array.cs
+++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifLong8Array.cs
@@ -7,11 +7,6 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
{
internal sealed class ExifLong8Array : ExifArrayValue
{
- public ExifLong8Array(ExifTag tag)
- : base(tag)
- {
- }
-
public ExifLong8Array(ExifTagValue tag)
: base(tag)
{
@@ -109,7 +104,13 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
private bool SetArray(long[] values)
{
- this.Value = Unsafe.As(ref values);
+ var numbers = new ulong[values.Length];
+ for (int i = 0; i < values.Length; i++)
+ {
+ numbers[i] = (ulong)(values[i] < 0 ? 0 : values[i]);
+ }
+
+ this.Value = numbers;
return true;
}
@@ -124,7 +125,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
var numbers = new ulong[values.Length];
for (int i = 0; i < values.Length; i++)
{
- numbers[i] = (ulong)values[i];
+ numbers[i] = (ulong)Numerics.Clamp(values[i], 0, int.MaxValue);
}
this.Value = numbers;
@@ -148,7 +149,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Exif
var numbers = new ulong[values.Length];
for (int i = 0; i < values.Length; i++)
{
- numbers[i] = (ulong)values[i];
+ numbers[i] = (ulong)Numerics.Clamp(values[i], 0, short.MaxValue);
}
this.Value = numbers;
diff --git a/tests/ImageSharp.Tests/Formats/Tiff/BigTiffMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/BigTiffMetadataTests.cs
index 91cfa1efa..8e90aeea1 100644
--- a/tests/ImageSharp.Tests/Formats/Tiff/BigTiffMetadataTests.cs
+++ b/tests/ImageSharp.Tests/Formats/Tiff/BigTiffMetadataTests.cs
@@ -43,9 +43,11 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
Assert.True(long8.TrySetValue(-100L));
Assert.Equal(-100L, long8.GetValue());
+ Assert.Equal(ExifDataType.SignedLong8, long8.DataType);
- Assert.True(long8.TrySetValue(100L));
- Assert.Equal(100L, long8.GetValue());
+ Assert.True(long8.TrySetValue(long.MaxValue));
+ Assert.Equal(long.MaxValue, long8.GetValue());
+ Assert.Equal(ExifDataType.SignedLong8, long8.DataType);
}
[Fact]
@@ -65,14 +67,25 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
Assert.True(long8.TrySetValue(123));
Assert.Equal(new[] { 123UL }, long8.GetValue());
+ Assert.True(long8.TrySetValue(123u));
+ Assert.Equal(new[] { 123UL }, long8.GetValue());
+
Assert.True(long8.TrySetValue(123L));
Assert.Equal(new[] { 123UL }, long8.GetValue());
Assert.True(long8.TrySetValue(123UL));
Assert.Equal(new[] { 123UL }, long8.GetValue());
+ Assert.True(long8.TrySetValue(new short[] { -1, 2, -3, 4 }));
+ Assert.Equal(new ulong[] { 0, 2UL, 0, 4UL }, long8.GetValue());
+
Assert.True(long8.TrySetValue(new[] { 1, 2, 3, 4 }));
Assert.Equal(new[] { 1UL, 2UL, 3UL, 4UL }, long8.GetValue());
+ Assert.Equal(ExifDataType.Long, long8.DataType);
+
+ Assert.True(long8.TrySetValue(new[] { 1, 2, 3, 4, long.MaxValue }));
+ Assert.Equal(new[] { 1UL, 2UL, 3UL, 4UL, (ulong)long.MaxValue }, long8.GetValue());
+ Assert.Equal(ExifDataType.Long8, long8.DataType);
}
[Fact]
@@ -82,9 +95,11 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff
Assert.True(long8.TrySetValue(new[] { 0L }));
Assert.Equal(new[] { 0L }, long8.GetValue());
+ Assert.Equal(ExifDataType.SignedLong8, long8.DataType);
- Assert.True(long8.TrySetValue(new[] { -1L, 2L, -3L, 4L }));
- Assert.Equal(new[] { -1L, 2L, -3L, 4L }, long8.GetValue());
+ Assert.True(long8.TrySetValue(new[] { -1L, 2L, long.MinValue, 4L }));
+ Assert.Equal(new[] { -1L, 2L, long.MinValue, 4L }, long8.GetValue());
+ Assert.Equal(ExifDataType.SignedLong8, long8.DataType);
}
}
}