From 692e244f9ab4adfd57e5c7a8636fd6fc59dc86d7 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 19 Jun 2019 11:07:36 +1000 Subject: [PATCH] Fix #937 (#938) --- .../Formats/Png/Zlib/ZlibInflateStream.cs | 6 +++--- .../Formats/Png/PngDecoderTests.cs | 7 ++++--- tests/ImageSharp.Tests/TestImages.cs | 1 + tests/Images/Input/Png/zlib-overflow2.png | Bin 0 -> 16887 bytes 4 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 tests/Images/Input/Png/zlib-overflow2.png diff --git a/src/ImageSharp/Formats/Png/Zlib/ZlibInflateStream.cs b/src/ImageSharp/Formats/Png/Zlib/ZlibInflateStream.cs index 71141a893..405eeafeb 100644 --- a/src/ImageSharp/Formats/Png/Zlib/ZlibInflateStream.cs +++ b/src/ImageSharp/Formats/Png/Zlib/ZlibInflateStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -140,7 +140,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib offset += bytesRead; - if (offset >= length) + if (offset >= length || offset >= count) { return bytesRead; } @@ -249,4 +249,4 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib this.compressedStream = new DeflateStream(this, CompressionMode.Decompress, true); } } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs index 70d191d74..5bb2db784 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. // ReSharper disable InconsistentNaming @@ -42,7 +42,8 @@ namespace SixLabors.ImageSharp.Tests.Formats.Png TestImages.Png.Rgb24BppTrans, TestImages.Png.GrayAlpha8Bit, TestImages.Png.Gray1BitTrans, - TestImages.Png.Bad.ZlibOverflow + TestImages.Png.Bad.ZlibOverflow, + TestImages.Png.Bad.ZlibOverflow2 }; public static readonly string[] TestImages48Bpp = @@ -294,4 +295,4 @@ namespace SixLabors.ImageSharp.Tests.Formats.Png } } } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 1019a5b08..3c732c32d 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -87,6 +87,7 @@ namespace SixLabors.ImageSharp.Tests public const string ChunkLength2 = "Png/chunklength2.png"; public const string CorruptedChunk = "Png/big-corrupted-chunk.png"; public const string ZlibOverflow = "Png/zlib-overflow.png"; + public const string ZlibOverflow2 = "Png/zlib-overflow2.png"; } public static readonly string[] All = diff --git a/tests/Images/Input/Png/zlib-overflow2.png b/tests/Images/Input/Png/zlib-overflow2.png new file mode 100644 index 0000000000000000000000000000000000000000..12da8ee60e369c33fc7ac51fd5dd126eb76145b3 GIT binary patch literal 16887 zcmV)tK$pLXP)z^9GRH}9L;wH~07*naRCt`#ya{hySC;2V%uEA=!8B?~BW+89L{Z=h zij*LV6u5$m2(I83;1*zPU<4x&J7Ptwh=l}6Nswe2cG`xWS&4Ky6PZpYD$|w7r3;l+ zU5&0DG-jsf15D3g&}d)=(+%_&nBRLR;_@d@UKn-&2Xtp2sZHdPs0l7 ziO}-L5iDd9P`q!_EZE1zkO=mjatK5)_#+7hzo>fA>^Fyg5Y7I8g6S5&P%ydL?9!f5Cth-UD;O2{Oj__S;wI_dnd68KRS z&HR@LX7IDa0HD^-s@}h<9EfHj8=C$0=n~CNgYfq!LBq-?2BwQNTJ|z76YN6%0D_$< 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