Sophie

Sophie

distrib > Mageia > 5 > x86_64 > media > core-release-src > by-pkgid > ab62f70d999f995cdce38f78779e1098 > files > 1

lcms2-2.6-3.mga5.src.rpm


# HG changeset patch
# User prr
# Date 1389902633 28800
# Node ID d6739b8326a4b6fc3518929ca6efbcb2e5be3f63
# Parent  82480e513a540f66a81c4a8ef1e950ead90c1f6b
8031335: Better color profiling
Reviewed-by: bae, vadim, mschoene

diff -r 82480e513a54 -r d6739b8326a4 src/cmsio0.c
--- a/src/cmsio0.c	Thu Jan 16 11:45:28 2014 -0800
+++ b/src/cmsio0.c	Thu Jan 16 12:03:53 2014 -0800
@@ -590,6 +590,31 @@ cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE h
        return _cmsSearchTag(Icc, sig, FALSE) >= 0;
 }
 
+/*
+ * Enforces that the profile version is per. spec.
+ * Operates on the big endian bytes from the profile.
+ * Called before converting to platform endianness.
+ * Byte 0 is BCD major version, so max 9.
+ * Byte 1 is 2 BCD digits, one per nibble.
+ * Reserved bytes 2 & 3 must be 0.
+ */
+static cmsUInt32Number _validatedVersion(cmsUInt32Number DWord)
+{
+    cmsUInt8Number* pByte = (cmsUInt8Number*)&DWord;
+    cmsUInt8Number temp1;
+    cmsUInt8Number temp2;
+
+    if (*pByte > 0x09) *pByte = (cmsUInt8Number)9;
+    temp1 = *(pByte+1) & 0xf0;
+    temp2 = *(pByte+1) & 0x0f;
+    if (temp1 > 0x90) temp1 = 0x90;
+    if (temp2 > 9) temp2 = 0x09;
+    *(pByte+1) = (cmsUInt8Number)(temp1 | temp2);
+    *(pByte+2) = (cmsUInt8Number)0;
+    *(pByte+3) = (cmsUInt8Number)0;
+
+    return DWord;
+}
 
 // Read profile header and validate it
 cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
@@ -625,7 +650,7 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* I
     Icc -> creator         = _cmsAdjustEndianess32(Header.creator);
     
     _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes);
-    Icc -> Version         = _cmsAdjustEndianess32(Header.version);
+    Icc -> Version         = _cmsAdjustEndianess32(_validatedVersion(Header.version));
 
     // Get size as reported in header
     HeaderSize = _cmsAdjustEndianess32(Header.size);