@ -9,6 +9,7 @@
# include "jpgimage.hpp"
# include "makernote_int.hpp"
# include "photoshop.hpp"
# include "safe_op.hpp"
# include "sonymn_int.hpp"
# include "tiffcomposite_int.hpp" // Do not change the order of these 2 includes,
# include "tiffimage_int.hpp"
@ -1232,6 +1233,7 @@ void TiffReader::visitIfdMakernoteEnd(TiffIfdMakernote* /*object*/) {
} // TiffReader::visitIfdMakernoteEnd
void TiffReader : : readTiffEntry ( TiffEntryBase * object ) {
try {
byte * p = object - > start ( ) ;
if ( p + 12 > pLast_ ) {
@ -1273,7 +1275,7 @@ void TiffReader::readTiffEntry(TiffEntryBase* object) {
size_t size = typeSize * count ;
uint32_t offset = getULong ( p , byteOrder ( ) ) ;
byte * pData = p ;
if ( size > 4 & & ( baseOffset ( ) + offset > = size_ | | baseOffset ( ) + offset < = 0 ) ) {
if ( size > 4 & & Safe : : add < size_t > ( baseOffset ( ) , offset ) > = size_ ) {
// #1143
if ( object - > tag ( ) = = 0x2001 & & std : : string ( groupName ( object - > group ( ) ) ) = = " Sony1 " ) {
// This tag is Exif.Sony1.PreviewImage, which refers to a preview image which is
@ -1302,13 +1304,7 @@ void TiffReader::readTiffEntry(TiffEntryBase* object) {
if ( size > 4 ) {
// setting pData to pData_ + baseOffset() + offset can result in pData pointing to invalid memory,
// as offset can be arbitrarily large
if ( ( static_cast < uintptr_t > ( baseOffset ( ) ) >
std : : numeric_limits < uintptr_t > : : max ( ) - static_cast < uintptr_t > ( offset ) ) | |
( static_cast < uintptr_t > ( baseOffset ( ) + offset ) >
std : : numeric_limits < uintptr_t > : : max ( ) - reinterpret_cast < uintptr_t > ( pData_ ) ) ) {
throw Error ( ErrorCode : : kerCorruptedMetadata ) ; // #562 don't throw kerArithmeticOverflow
}
if ( pData_ + static_cast < uintptr_t > ( baseOffset ( ) ) + static_cast < uintptr_t > ( offset ) > pLast_ ) {
if ( Safe : : add < size_t > ( baseOffset ( ) , offset ) > static_cast < size_t > ( pLast_ - pData_ ) ) {
throw Error ( ErrorCode : : kerCorruptedMetadata ) ;
}
pData = const_cast < byte * > ( pData_ ) + baseOffset ( ) + offset ;
@ -1336,7 +1332,9 @@ void TiffReader::readTiffEntry(TiffEntryBase* object) {
object - > setData ( pData , size , std : : make_shared < DataBuf > ( ) ) ;
object - > setOffset ( offset ) ;
object - > setIdx ( nextIdx ( object - > group ( ) ) ) ;
} catch ( std : : overflow_error & ) {
throw Error ( ErrorCode : : kerCorruptedMetadata ) ; // #562 don't throw std::overflow_error
}
} // TiffReader::readTiffEntry
void TiffReader : : visitBinaryArray ( TiffBinaryArray * object ) {