diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index d211992a94..faa29865f2 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -27,6 +27,7 @@
+
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter{TPixel}.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter{TPixel}.cs
index 430adeb21d..532892e060 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter{TPixel}.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter{TPixel}.cs
@@ -95,7 +95,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
}
}
- return this.pixelBuffer;
+ var buffer = this.pixelBuffer;
+ this.pixelBuffer = null;
+ return buffer;
}
///
@@ -210,6 +212,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
this.rgbBuffer?.Dispose();
this.paddedProxyPixelRow?.Dispose();
+ this.pixelBuffer?.Dispose();
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
index ef4e3ffac2..a4b42b994d 100644
--- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
+++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
@@ -187,20 +187,27 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
where TPixel : unmanaged, IPixel
{
using var spectralConverter = new SpectralConverter(this.Configuration);
-
- var scanDecoder = new HuffmanScanDecoder(stream, spectralConverter, cancellationToken);
-
- this.ParseStream(stream, scanDecoder, cancellationToken);
- this.InitExifProfile();
- this.InitIccProfile();
- this.InitIptcProfile();
- this.InitXmpProfile();
- this.InitDerivedMetadataProperties();
-
- return new Image(
- this.Configuration,
- spectralConverter.GetPixelBuffer(cancellationToken),
- this.Metadata);
+ try
+ {
+ var scanDecoder = new HuffmanScanDecoder(stream, spectralConverter, cancellationToken);
+
+ this.ParseStream(stream, scanDecoder, cancellationToken);
+ this.InitExifProfile();
+ this.InitIccProfile();
+ this.InitIptcProfile();
+ this.InitXmpProfile();
+ this.InitDerivedMetadataProperties();
+
+ return new Image(
+ this.Configuration,
+ spectralConverter.GetPixelBuffer(cancellationToken),
+ this.Metadata);
+ }
+ catch
+ {
+ this.Frame?.Dispose();
+ throw;
+ }
}
///
diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
index 5dd99fafc1..1cd3d2c0c1 100644
--- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
+++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
@@ -157,40 +157,52 @@ namespace SixLabors.ImageSharp.Formats.Tiff
public Image Decode(BufferedReadStream stream, CancellationToken cancellationToken)
where TPixel : unmanaged, IPixel
{
- this.inputStream = stream;
- var reader = new DirectoryReader(stream, this.Configuration.MemoryAllocator);
-
- IEnumerable directories = reader.Read();
- this.byteOrder = reader.ByteOrder;
- this.isBigTiff = reader.IsBigTiff;
-
var frames = new List>();
- foreach (ExifProfile ifd in directories)
+ try
{
- cancellationToken.ThrowIfCancellationRequested();
- ImageFrame frame = this.DecodeFrame(ifd, cancellationToken);
- frames.Add(frame);
+ this.inputStream = stream;
+ var reader = new DirectoryReader(stream, this.Configuration.MemoryAllocator);
+
+ IEnumerable directories = reader.Read();
+ this.byteOrder = reader.ByteOrder;
+ this.isBigTiff = reader.IsBigTiff;
- if (this.decodingMode is FrameDecodingMode.First)
+ foreach (ExifProfile ifd in directories)
{
- break;
+ cancellationToken.ThrowIfCancellationRequested();
+ ImageFrame frame = this.DecodeFrame(ifd, cancellationToken);
+ frames.Add(frame);
+
+ if (this.decodingMode is FrameDecodingMode.First)
+ {
+ break;
+ }
}
- }
- ImageMetadata metadata = TiffDecoderMetadataCreator.Create(frames, this.ignoreMetadata, reader.ByteOrder, reader.IsBigTiff);
+ ImageMetadata metadata = TiffDecoderMetadataCreator.Create(frames, this.ignoreMetadata, reader.ByteOrder, reader.IsBigTiff);
- // TODO: Tiff frames can have different sizes.
- ImageFrame root = frames[0];
- this.Dimensions = root.Size();
- foreach (ImageFrame frame in frames)
- {
- if (frame.Size() != root.Size())
+ // TODO: Tiff frames can have different sizes.
+ ImageFrame root = frames[0];
+ this.Dimensions = root.Size();
+ foreach (ImageFrame frame in frames)
{
- TiffThrowHelper.ThrowNotSupported("Images with different sizes are not supported");
+ if (frame.Size() != root.Size())
+ {
+ TiffThrowHelper.ThrowNotSupported("Images with different sizes are not supported");
+ }
}
+
+ return new Image(this.Configuration, metadata, frames);
}
+ catch
+ {
+ foreach (ImageFrame f in frames)
+ {
+ f.Dispose();
+ }
- return new Image(this.Configuration, metadata, frames);
+ throw;
+ }
}
///