From 183260b48e5bbb45c84b326105370216e9b2014a Mon Sep 17 00:00:00 2001 From: Steffen Habermehl Date: Thu, 6 Apr 2017 14:36:05 +0200 Subject: [PATCH] Issue #132: Handle undefined EXIF data type where no number of components set --- .../MetaData/Profiles/Exif/ExifReader.cs | 7 ++++++ .../Profiles/Exif/ExifProfileTests.cs | 22 +++++++++++++++++++ tests/ImageSharp.Tests/TestImages.cs | 1 + .../Formats/Jpg/baseline/ExifUndefType.jpg | 3 +++ 4 files changed, 33 insertions(+) create mode 100644 tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/ExifUndefType.jpg diff --git a/src/ImageSharp/MetaData/Profiles/Exif/ExifReader.cs b/src/ImageSharp/MetaData/Profiles/Exif/ExifReader.cs index 0b845c4914..58f32bdd83 100644 --- a/src/ImageSharp/MetaData/Profiles/Exif/ExifReader.cs +++ b/src/ImageSharp/MetaData/Profiles/Exif/ExifReader.cs @@ -319,6 +319,13 @@ namespace ImageSharp uint numberOfComponents = this.GetLong(); + // Issue #132: ExifDataType == Undefined is treated like a byte array. + // If numberOfComponents == 0 this value can only be handled as an inline value and must fallback to 4 (bytes) + if (dataType == ExifDataType.Undefined && numberOfComponents == 0) + { + numberOfComponents = 4; + } + uint size = numberOfComponents * ExifValue.GetSize(dataType); byte[] data = this.GetBytes(4); diff --git a/tests/ImageSharp.Tests/MetaData/Profiles/Exif/ExifProfileTests.cs b/tests/ImageSharp.Tests/MetaData/Profiles/Exif/ExifProfileTests.cs index 1bc31286da..2c902d3b81 100644 --- a/tests/ImageSharp.Tests/MetaData/Profiles/Exif/ExifProfileTests.cs +++ b/tests/ImageSharp.Tests/MetaData/Profiles/Exif/ExifProfileTests.cs @@ -7,9 +7,11 @@ namespace ImageSharp.Tests { using System; using System.Collections; + using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; + using ImageSharp.Processing; using Xunit; public class ExifProfileTests @@ -268,6 +270,26 @@ namespace ImageSharp.Tests } } + [Fact] + public void ExifTypeUndefined() + { + Image image = TestFile.Create(TestImages.Jpeg.Baseline.Bad.ExifUndefType).CreateImage(); + Assert.NotNull(image); + + ExifProfile profile = image.MetaData.ExifProfile; + Assert.NotNull(profile); + + IEnumerator enumerator = profile.Values.GetEnumerator(); + while (enumerator.MoveNext()) + { + ExifValue entry = enumerator.Current; + if (entry.DataType == ExifDataType.Undefined) + { + Assert.NotEqual(0, entry.NumberOfComponents); + } + } + } + private static ExifProfile GetExifProfile() { Image image = TestFile.Create(TestImages.Jpeg.Baseline.Floorplan).CreateImage(); diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index f0a0e8dd81..e9d658887e 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -61,6 +61,7 @@ namespace ImageSharp.Tests public static class Bad { public const string MissingEOF = "Jpg/baseline/badeof.jpg"; + public const string ExifUndefType = "Jpg/baseline/ExifUndefType.jpg"; } public const string Cmyk = "Jpg/baseline/cmyk.jpg"; diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/ExifUndefType.jpg b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/ExifUndefType.jpg new file mode 100644 index 0000000000..e1a8a80e23 --- /dev/null +++ b/tests/ImageSharp.Tests/TestImages/Formats/Jpg/baseline/ExifUndefType.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c8f3a1392c59bd60a71c689e04bc028a5b6dc7051edbb17cee2e48d91245f98 +size 6582