diff --git a/modules/imgcodecs/src/jpeg_exif.cpp b/modules/imgcodecs/src/jpeg_exif.cpp index caade4803..af4b7a990 100644 --- a/modules/imgcodecs/src/jpeg_exif.cpp +++ b/modules/imgcodecs/src/jpeg_exif.cpp @@ -42,6 +42,13 @@ #include "jpeg_exif.hpp" +namespace { + + class ExifParsingError { + }; +} + + namespace cv { @@ -66,12 +73,16 @@ ExifReader::~ExifReader() */ bool ExifReader::parse() { - m_exif = getExif(); - if( !m_exif.empty() ) - { - return true; + try { + m_exif = getExif(); + if( !m_exif.empty() ) + { + return true; + } + return false; + } catch (ExifParsingError&) { + return false; } - return false; } @@ -147,6 +158,9 @@ std::map ExifReader::getExif() case APP1: //actual Exif Marker exifSize = getFieldSize(f); + if (exifSize <= offsetToTiffHeader) { + throw ExifParsingError(); + } m_data.resize( exifSize - offsetToTiffHeader ); fseek(f, static_cast( offsetToTiffHeader ), SEEK_CUR); count = fread( &m_data[0], sizeof( unsigned char ), exifSize - offsetToTiffHeader, f ); @@ -401,6 +415,9 @@ std::string ExifReader::getString(const size_t offset) const */ uint16_t ExifReader::getU16(const size_t offset) const { + if (offset + 1 >= m_data.size()) + throw ExifParsingError(); + if( m_format == INTEL ) { return m_data[offset] + ( m_data[offset + 1] << 8 ); @@ -416,6 +433,9 @@ uint16_t ExifReader::getU16(const size_t offset) const */ uint32_t ExifReader::getU32(const size_t offset) const { + if (offset + 3 >= m_data.size()) + throw ExifParsingError(); + if( m_format == INTEL ) { return m_data[offset] +