diff options
Diffstat (limited to 'media-gfx/exiv2/files/exiv2-0.27.0-png-broken-icc-profile.patch')
-rw-r--r-- | media-gfx/exiv2/files/exiv2-0.27.0-png-broken-icc-profile.patch | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/media-gfx/exiv2/files/exiv2-0.27.0-png-broken-icc-profile.patch b/media-gfx/exiv2/files/exiv2-0.27.0-png-broken-icc-profile.patch new file mode 100644 index 000000000000..ae0a0ee30dce --- /dev/null +++ b/media-gfx/exiv2/files/exiv2-0.27.0-png-broken-icc-profile.patch @@ -0,0 +1,34 @@ +diff --git a/src/pngimage.cpp b/src/pngimage.cpp +index 90844d09..b5b0cd24 100644 +--- a/src/pngimage.cpp ++++ b/src/pngimage.cpp +@@ -501,7 +501,20 @@ namespace Exiv2 { + } + else if (!memcmp(cheaderBuf.pData_ + 4, "iCCP", 4)) + { +- zlibToDataBuf(cdataBuf.pData_ +12+1,dataOffset-13,iccProfile_); // +1 = 'compressed' flag ++ // The ICC profile name can vary from 1-79 characters. ++ uint32_t iccOffset = 0; ++ while (iccOffset < 80 && iccOffset < dataOffset) { ++ ++ const byte* profileName = cdataBuf.pData_ + iccOffset; ++ ++iccOffset; ++ ++ if (*profileName == 0x00) ++ break; ++ } ++ ++ ++iccOffset; // +1 = 'compressed' flag ++ ++ zlibToDataBuf(cdataBuf.pData_ +iccOffset,dataOffset-iccOffset,iccProfile_); + #ifdef DEBUG + std::cout << "Exiv2::PngImage::readMetadata: Found iCCP chunk length: " << dataOffset << std::endl; + std::cout << "Exiv2::PngImage::readMetadata: iccProfile.size_ : " << iccProfile_.size_ << std::endl; +@@ -662,6 +675,7 @@ namespace Exiv2 { + + // calculate CRC + uLong tmp = crc32(0L, Z_NULL, 0); ++ tmp = crc32(tmp, (const Bytef*)type ,typeLen); + tmp = crc32(tmp, (const Bytef*)header ,headerLen); + tmp = crc32(tmp, (const Bytef*)compressed.pData_,compressed.size_); + byte crc[4]; |