summaryrefslogtreecommitdiff
path: root/media-gfx/exiv2/files/exiv2-0.27.0-png-broken-icc-profile.patch
blob: ae0a0ee30dce4bc339b8b65cb8af79331aacc406 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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];