From 227e86bfa63a34620ffd7ef3cdfd7e2b626ee936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96zg=C3=BCr=20=C3=96z=C3=A7=C4=B1tak?= Date: Tue, 1 Dec 2020 11:00:42 +0300 Subject: [PATCH] Check identical IFD offsets. Fixes #80 --- ExifLibrary/JPEGFile.cs | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/ExifLibrary/JPEGFile.cs b/ExifLibrary/JPEGFile.cs index 0223112..5352285 100644 --- a/ExifLibrary/JPEGFile.cs +++ b/ExifLibrary/JPEGFile.cs @@ -611,17 +611,38 @@ private void ReadExifAPP1() if (currentifd == IFD.Zeroth && tag == 0x8769) { int exififdpointer = (int)conv.ToUInt32(value, 0); - ifdqueue.Add(exififdpointer, IFD.EXIF); + if (ifdqueue.ContainsKey(exififdpointer)) + { + Errors.Add(new ImageError(Severity.Warning, "IFD queue already contains an Exif IFD pointer.")); + } + else + { + ifdqueue.Add(exififdpointer, IFD.EXIF); + } } else if (currentifd == IFD.Zeroth && tag == 0x8825) { int gpsifdpointer = (int)conv.ToUInt32(value, 0); - ifdqueue.Add(gpsifdpointer, IFD.GPS); + if (ifdqueue.ContainsKey(gpsifdpointer)) + { + Errors.Add(new ImageError(Severity.Warning, "IFD queue already contains a GPS IFD pointer.")); + } + else + { + ifdqueue.Add(gpsifdpointer, IFD.GPS); + } } else if (currentifd == IFD.EXIF && tag == 0xa005) { int interopifdpointer = (int)conv.ToUInt32(value, 0); - ifdqueue.Add(interopifdpointer, IFD.Interop); + if (ifdqueue.ContainsKey(interopifdpointer)) + { + Errors.Add(new ImageError(Severity.Warning, "IFD queue already contains an Interop IFD pointer.")); + } + else + { + ifdqueue.Add(interopifdpointer, IFD.Interop); + } } // Save the offset to maker note data