diff options
author | Marti Maria <info@littlecms.com> | 2014-04-16 17:54:01 +0200 |
---|---|---|
committer | Marti Maria <info@littlecms.com> | 2014-04-16 17:54:01 +0200 |
commit | 74ba39195a0cf87c43f46a2fabd9c2168692822d (patch) | |
tree | 87bffa81882a566415b13339bfdb7ad8e9013c61 | |
parent | e2940a0871c20f64a09b9dfd28409f9fe5179688 (diff) | |
download | lcms2-74ba39195a0cf87c43f46a2fabd9c2168692822d.tar.gz |
Add sanity check on profile version.
-rw-r--r-- | src/cmscnvrt.c | 2 | ||||
-rw-r--r-- | src/cmsintrp.c | 4 | ||||
-rw-r--r-- | src/cmsio0.c | 28 | ||||
-rw-r--r-- | src/cmsio1.c | 2 | ||||
-rw-r--r-- | src/cmsplugin.c | 4 | ||||
-rw-r--r-- | src/cmsvirt.c | 4 |
6 files changed, 35 insertions, 9 deletions
diff --git a/src/cmscnvrt.c b/src/cmscnvrt.c index 1a93e83..f3d43fe 100644 --- a/src/cmscnvrt.c +++ b/src/cmscnvrt.c @@ -1045,7 +1045,7 @@ cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, if (TheIntents[i] == INTENT_PERCEPTUAL || TheIntents[i] == INTENT_SATURATION) { // Force BPC for V4 profiles in perceptual and saturation - if (cmsGetProfileVersion(hProfiles[i]) >= 4.0) + if (cmsGetEncodedICCversion(hProfiles[i]) >= 0x4000000) BPC[i] = TRUE; } } diff --git a/src/cmsintrp.c b/src/cmsintrp.c index 5d5f35d..09c89c6 100644 --- a/src/cmsintrp.c +++ b/src/cmsintrp.c @@ -929,7 +929,7 @@ void Eval4Inputs(register const cmsUInt16Number Input[], Rest = c1 * rx + c2 * ry + c3 * rz; - Tmp1[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)); + Tmp1[OutChan] = (cmsUInt16Number) ( c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))); } @@ -993,7 +993,7 @@ void Eval4Inputs(register const cmsUInt16Number Input[], Rest = c1 * rx + c2 * ry + c3 * rz; - Tmp2[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)); + Tmp2[OutChan] = (cmsUInt16Number) (c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))); } diff --git a/src/cmsio0.c b/src/cmsio0.c index 4449acd..40f55d1 100644 --- a/src/cmsio0.c +++ b/src/cmsio0.c @@ -623,6 +623,32 @@ cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig) } + +// 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) 0x09; + temp1 = *(pByte+1) & 0xf0; + temp2 = *(pByte+1) & 0x0f; + if (temp1 > 0x90) temp1 = 0x90; + if (temp2 > 0x09) 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) { @@ -657,7 +683,7 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc) 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); diff --git a/src/cmsio1.c b/src/cmsio1.c index 89856e5..418417e 100644 --- a/src/cmsio1.c +++ b/src/cmsio1.c @@ -906,7 +906,7 @@ cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq) { if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, seq)) return FALSE; - if (cmsGetProfileVersion(hProfile) >= 4.0) { + if (cmsGetEncodedICCversion(hProfile) >= 0x4000000) { if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, seq)) return FALSE; } diff --git a/src/cmsplugin.c b/src/cmsplugin.c index 317e33e..ad1a7d9 100644 --- a/src/cmsplugin.c +++ b/src/cmsplugin.c @@ -932,8 +932,8 @@ void CMSEXPORT cmsDeleteContext(cmsContext ContextID) // Search for previous for (prev = _cmsContextPoolHead; - prev != NULL; - prev = prev ->Next) + prev != NULL; + prev = prev ->Next) { if (prev -> Next == ctx) { prev -> Next = ctx ->Next; diff --git a/src/cmsvirt.c b/src/cmsvirt.c index b324c99..b9764cc 100644 --- a/src/cmsvirt.c +++ b/src/cmsvirt.c @@ -642,7 +642,7 @@ cmsToneCurve* Build_sRGBGamma(cmsContext ContextID) // Create the ICC virtual profile for sRGB space cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID) { - cmsCIExyY D65; + cmsCIExyY D65 = { 0.3127, 0.3290, 1.0 }; cmsCIExyYTRIPLE Rec709Primaries = { {0.6400, 0.3300, 1.0}, {0.3000, 0.6000, 1.0}, @@ -651,7 +651,7 @@ cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID) cmsToneCurve* Gamma22[3]; cmsHPROFILE hsRGB; - cmsWhitePointFromTemp(&D65, 6504); + // cmsWhitePointFromTemp(&D65, 6504); Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma(ContextID); if (Gamma22[0] == NULL) return NULL; |