From ee0600e6824de7fb162263fd0b72236ad019af53 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 26 Feb 2020 15:09:50 +1100 Subject: [PATCH] Don't backpeddle when reading chunk lengths. Fix #1127 --- src/ImageSharp/Formats/Png/PngDecoderCore.cs | 5 +---- .../Formats/Png/PngDecoderTests.cs | 17 +++++++++++++++++ tests/ImageSharp.Tests/TestImages.cs | 1 + tests/Images/Input/Png/issues/Issue_1127.png | Bin 0 -> 13855 bytes 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 tests/Images/Input/Png/issues/Issue_1127.png diff --git a/src/ImageSharp/Formats/Png/PngDecoderCore.cs b/src/ImageSharp/Formats/Png/PngDecoderCore.cs index 2701bd2a7..076230c0b 100644 --- a/src/ImageSharp/Formats/Png/PngDecoderCore.cs +++ b/src/ImageSharp/Formats/Png/PngDecoderCore.cs @@ -1101,10 +1101,7 @@ namespace SixLabors.ImageSharp.Formats.Png while (length < 0 || length > (this.currentStream.Length - this.currentStream.Position)) { - // Not a valid chunk so we skip back all but one of the four bytes we have just read. - // That lets us read one byte at a time until we reach a known chunk. - this.currentStream.Position -= 3; - + // Not a valid chunk so try again until we reach a known chunk. if (!this.TryReadChunkLength(out length)) { chunk = default; diff --git a/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs index bf767e811..7fdafafa8 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs @@ -243,6 +243,23 @@ namespace SixLabors.ImageSharp.Tests.Formats.Png Assert.Null(ex); } + [Theory] + [WithFile(TestImages.Png.Issue1127, PixelTypes.Rgba32)] + public void Issue1127(TestImageProvider provider) + where TPixel : struct, IPixel + { + System.Exception ex = Record.Exception( + () => + { + using (Image image = provider.GetImage(PngDecoder)) + { + image.DebugSave(provider); + image.CompareToOriginal(provider, ImageComparer.Exact); + } + }); + Assert.Null(ex); + } + [Theory] [WithFile(TestImages.Png.Splash, PixelTypes.Rgba32)] [WithFile(TestImages.Png.Bike, PixelTypes.Rgba32)] diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index b1cfec218..2e58ac970 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -90,6 +90,7 @@ namespace SixLabors.ImageSharp.Tests public const string Issue1014_4 = "Png/issues/Issue_1014_4.png"; public const string Issue1014_5 = "Png/issues/Issue_1014_5.png"; public const string Issue1014_6 = "Png/issues/Issue_1014_6.png"; + public const string Issue1127 = "Png/issues/Issue_1127.png"; public static class Bad { diff --git a/tests/Images/Input/Png/issues/Issue_1127.png b/tests/Images/Input/Png/issues/Issue_1127.png new file mode 100644 index 0000000000000000000000000000000000000000..52914a32bcb8e8a39ff42cd54b99ef45c935c4f2 GIT binary patch literal 13855 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 h)HBaK6SZ;Z{{sXO%W