Browse Source

Add test image and use constants

pull/924/head
James Jackson-South 7 years ago
parent
commit
06d0fd44f0
  1. 29
      src/ImageSharp/Formats/Jpeg/Components/ZigZag.cs
  2. 3
      tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Images.cs
  3. 3
      tests/ImageSharp.Tests/TestImages.cs
  4. BIN
      tests/Images/Input/Jpg/issues/fuzz/Issue922-AccessViolationException.jpg

29
src/ImageSharp/Formats/Jpeg/Components/ZigZag.cs

@ -17,17 +17,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
internal unsafe struct ZigZag internal unsafe struct ZigZag
{ {
/// <summary> /// <summary>
/// Copy of <see cref="Unzig"/> in a value type
/// </summary>
public fixed byte Data[64 + 16];
/// <summary>
/// <para>
/// Unzig maps from the zigzag ordering to the natural ordering. For example,
/// unzig[3] is the column and row of the fourth element in zigzag order. The
/// value is 16, which means first column (16%8 == 0) and third row (16/8 == 2).
/// </para>
/// <para>
/// When reading corrupted data, the Huffman decoders could attempt /// When reading corrupted data, the Huffman decoders could attempt
/// to reference an entry beyond the end of this array (if the decoded /// to reference an entry beyond the end of this array (if the decoded
/// zero run length reaches past the end of the block). To prevent /// zero run length reaches past the end of the block). To prevent
@ -36,9 +25,21 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
/// to be stored in location 63 of the block, not somewhere random. /// to be stored in location 63 of the block, not somewhere random.
/// The worst case would be a run-length of 15, which means we need 16 /// The worst case would be a run-length of 15, which means we need 16
/// fake entries. /// fake entries.
/// </para> /// </summary>
private const int Size = 64 + 16;
/// <summary>
/// Copy of <see cref="Unzig"/> in a value type
/// </summary>
public fixed byte Data[Size];
/// <summary>
/// Unzig maps from the zigzag ordering to the natural ordering. For example,
/// unzig[3] is the column and row of the fourth element in zigzag order. The
/// value is 16, which means first column (16%8 == 0) and third row (16/8 == 2).
/// </summary> /// </summary>
private static readonly byte[] Unzig = private static readonly byte[] Unzig =
new byte[Size]
{ {
0, 1, 8, 16, 9, 2, 3, 10, 0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5, 17, 24, 32, 25, 18, 11, 4, 5,
@ -75,7 +76,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
{ {
ZigZag result = default; ZigZag result = default;
byte* unzigPtr = result.Data; byte* unzigPtr = result.Data;
Marshal.Copy(Unzig, 0, (IntPtr)unzigPtr, 64 + 16); Marshal.Copy(Unzig, 0, (IntPtr)unzigPtr, Size);
return result; return result;
} }
@ -86,7 +87,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
{ {
Block8x8F result = default; Block8x8F result = default;
for (int i = 0; i < 64; i++) for (int i = 0; i < Block8x8F.Size; i++)
{ {
result[Unzig[i]] = qt[i]; result[Unzig[i]] = qt[i];
} }

3
tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.Images.cs

@ -17,6 +17,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
// BUG: The following image has a high difference compared to the expected output: // BUG: The following image has a high difference compared to the expected output:
// TestImages.Jpeg.Baseline.Jpeg420Small, // TestImages.Jpeg.Baseline.Jpeg420Small,
// TestImages.Jpeg.Issues.Fuzz.AccessViolationException922,
TestImages.Jpeg.Baseline.Jpeg444, TestImages.Jpeg.Baseline.Jpeg444,
TestImages.Jpeg.Baseline.Bad.BadEOF, TestImages.Jpeg.Baseline.Bad.BadEOF,
@ -106,4 +107,4 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
[TestImages.Jpeg.Progressive.Bad.ExifUndefType] = 0.011f / 100, [TestImages.Jpeg.Progressive.Bad.ExifUndefType] = 0.011f / 100,
}; };
} }
} }

3
tests/ImageSharp.Tests/TestImages.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. // Licensed under the Apache License, Version 2.0.
using System.Linq; using System.Linq;
@ -202,6 +202,7 @@ namespace SixLabors.ImageSharp.Tests
public const string ArgumentException826C = "Jpg/issues/fuzz/Issue826-ArgumentException-C.jpg"; public const string ArgumentException826C = "Jpg/issues/fuzz/Issue826-ArgumentException-C.jpg";
public const string AccessViolationException827 = "Jpg/issues/fuzz/Issue827-AccessViolationException.jpg"; public const string AccessViolationException827 = "Jpg/issues/fuzz/Issue827-AccessViolationException.jpg";
public const string ExecutionEngineException839 = "Jpg/issues/fuzz/Issue839-ExecutionEngineException.jpg"; public const string ExecutionEngineException839 = "Jpg/issues/fuzz/Issue839-ExecutionEngineException.jpg";
public const string AccessViolationException922 = "Jpg/issues/fuzz/Issue922-AccessViolationException.jpg";
} }
} }

BIN
tests/Images/Input/Jpg/issues/fuzz/Issue922-AccessViolationException.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Loading…
Cancel
Save