diff --git a/src/ImageSharp/Formats/Png/PngDecoderCore.cs b/src/ImageSharp/Formats/Png/PngDecoderCore.cs
index 28f9a989b9..4fb769fbec 100644
--- a/src/ImageSharp/Formats/Png/PngDecoderCore.cs
+++ b/src/ImageSharp/Formats/Png/PngDecoderCore.cs
@@ -195,11 +195,6 @@ internal sealed class PngDecoderCore : ImageDecoderCore
switch (chunk.Type)
{
case PngChunkType.Header:
- if (!Equals(this.header, default(PngHeader)))
- {
- PngThrowHelper.ThrowInvalidHeader();
- }
-
this.ReadHeaderChunk(pngMetadata, chunk.Data.GetSpan());
break;
case PngChunkType.AnimationControl:
@@ -1439,6 +1434,11 @@ internal sealed class PngDecoderCore : ImageDecoderCore
/// The containing data.
private void ReadHeaderChunk(PngMetadata pngMetadata, ReadOnlySpan data)
{
+ if (!Equals(this.header, default(PngHeader)))
+ {
+ PngThrowHelper.ThrowInvalidHeader();
+ }
+
this.header = PngHeader.Parse(data);
this.header.Validate();
diff --git a/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.Chunks.cs b/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.Chunks.cs
index ed33f71636..54a60f98e3 100644
--- a/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.Chunks.cs
+++ b/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.Chunks.cs
@@ -108,6 +108,19 @@ public partial class PngDecoderTests
Assert.Equal("The frame control chunk does not contain enough data!", exception.Message);
}
+ [Fact]
+ public void DecodeAndIdentify_WithDuplicateHeader_ThrowInvalidImageContentException()
+ {
+ using MemoryStream payloadStream = new();
+ payloadStream.Write(Raw1X1PngIhdrAndpHYs);
+ payloadStream.Write(Raw1X1PngIhdrAndpHYs.AsSpan(8, 25));
+ payloadStream.Write(Raw1X1PngIdatAndIend);
+ byte[] payload = payloadStream.ToArray();
+
+ Assert.Throws(() => Image.Load(payload));
+ Assert.Throws(() => Image.Identify(payload));
+ }
+
// https://github.com/SixLabors/ImageSharp/issues/3079
[Fact]
public void Decode_CompressedTxtChunk_WithTruncatedData_DoesNotThrow()