From 2c373a623b821cae3113aef3bba7207e2e6fb904 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 | Bin 0 -> 6582 bytes 4 files changed, 30 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 0000000000000000000000000000000000000000..3a7f29c7d1c4293f8a6734470de0ae50b3675e59 GIT binary patch literal 6582 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

AR}I~(<=*8 zoGm|4%RCdNy|NfYh{(NmQ_UEZeZWV-UZM7fG;}Ddz0-YujgB**jaVX2E}ueXgE=6- zF4wDG+l0N+x-5HuC}Uv~-_*~DD_=V{JfZf(BgwioFJ;!Xm6pCYd|urA62zl5Hyl-Y z%wa7Y2HClmNYATV+oL5Kn`#Aqcg33HSxRrGhU=TR($JYi&z`LIJmBz!d{o~(VRM^1 zVm&dnP4WvE>k*=>N)*eYzPZ2*rKBlJO&7w~O{mM0a_WObRIoJhIQ{kc6-Gr9J3Sjd zzn~}3)hFKHs>@5Rz#JAqChD}sVBIEPI!n_7yojGXMqNIkEz#+REA{1}xa4!0+cF7$ zbVc0VdP|vqw3AJsB^O09c)YU0J|ik_dOwl`u50t)xDU^|4oDL?kKUq+)8O#4n68jeB~V+WzIP9;g+TM zYo%;of_VlrnO%>&CDL1B9#{%yUVs~4R4z%)Ldbie=#4}Asa&tzD;|r}|H8nBszDtu oymR%I(k~lbp%TpWnIK~BZ1YSb5Wg*z$j~QpyCCZ4`q{hx0ked5!2kdN literal 0 HcmV?d00001