diff --git a/src/tiffvisitor.cpp b/src/tiffvisitor.cpp index 4ab733d475..ef13542e7c 100644 --- a/src/tiffvisitor.cpp +++ b/src/tiffvisitor.cpp @@ -47,6 +47,7 @@ EXIV2_RCSID("@(#) $Id$") #include #include #include +#include // ***************************************************************************** namespace { @@ -1517,7 +1518,19 @@ namespace Exiv2 { size = 0; } 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(baseOffset()) > std::numeric_limits::max() - static_cast(offset)) + || (static_cast(baseOffset() + offset) > std::numeric_limits::max() - reinterpret_cast(pData_))) + { + throw Error(59); + } + if (pData_ + static_cast(baseOffset()) + static_cast(offset) > pLast_) { + throw Error(58); + } pData = const_cast(pData_) + baseOffset() + offset; + + // check for size being invalid if (size > static_cast(pLast_ - pData)) { #ifndef SUPPRESS_WARNINGS EXV_ERROR << "Upper boundary of data for "