rawTherapee/rtengine/libraw/RawSpeed3/patches/02.Makernotes-processing.patch

37 lines
1.7 KiB
Diff

diff --git a/src/librawspeed/tiff/TiffIFD.cpp b/src/librawspeed/tiff/TiffIFD.cpp
index e732eae2..05251dd9 100644
--- a/src/librawspeed/tiff/TiffIFD.cpp
+++ b/src/librawspeed/tiff/TiffIFD.cpp
@@ -143,6 +143,7 @@ TiffRootIFDOwner TiffIFD::parseMakerNote(NORangesSet<Buffer>* ifds,
string make = makeEntry != nullptr ? trimSpaces(makeEntry->getString()) : "";
ByteStream bs = t->getData();
+ auto bufbegin = bs.begin() + bs.getPosition();
// helper function for easy setup of ByteStream buffer for the different maker note types
// 'rebase' means position 0 of new stream equals current position
@@ -159,7 +160,9 @@ TiffRootIFDOwner TiffIFD::parseMakerNote(NORangesSet<Buffer>* ifds,
bs.skipBytes(newPosition);
};
- if (bs.hasPrefix("AOC\0", 4)) {
+ if (bs.hasPrefix("LSI1\0", 5)) { // Skip LSI1 makernotes
+ return std::make_unique<TiffRootIFD>(this, ifds, bs, UINT32_MAX); // UINT32_MAX offset => special handling, empty IFD
+ } else if (bs.hasPrefix("AOC\0", 4)) {
setup(false, 6, 4, "Pentax makernote");
} else if (bs.hasPrefix("PENTAX", 6)) {
setup(true, 10, 8, "Pentax makernote");
@@ -197,6 +200,12 @@ TiffRootIFDOwner TiffIFD::parseMakerNote(NORangesSet<Buffer>* ifds,
}
}
+ auto readed = bs.begin() - bufbegin + bs.getPosition();
+ ByteStream bscheck(bs);
+ const auto IFDSize = 6 + 12 * bscheck.getU16();
+
+ if(IFDSize > t->count - readed) // IFDSize too big, probably binary Makernotes dir, not TIFF-like, could not be handled by TiffRootIFD reader
+ return std::make_unique<TiffRootIFD>(this, ifds, bs, UINT32_MAX); // // UINT32_MAX offset => special handling, empty IFD
// Attempt to parse the rest as an IFD
return std::make_unique<TiffRootIFD>(this, ifds, bs, bs.getPosition());
}