# 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);