Marti,
 
I just found a bug in one of the modules in Version 1.12 of LittleCMS. In cmsio1.c, in the function ReadEmbeddedTextTag() you have a variable called "Dummy" that's typed as a icUInt8Number, but a few lines down from the declaration it's being read as a icUInt16Number, causing a stack corruption. Here's a code snippet, with correction:
 
static
int
ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name)
{
    icTagBase Base;
    Icc ->Read(&Base,
sizeof(icTagBase), 1, Icc -> stream);
    size -=
sizeof(icTagBase);
    AdjustEndianess32((LPBYTE) &Base.sig);

    switch (Base.sig) {
        case icSigTextDescriptionType: {
            icUInt32Number AsciiCount;
            icUInt32Number i, UnicodeCode, UnicodeCount;
            icUInt16Number ScriptCodeCode;
#if  0
            // @@  FOUND BUG: "Dummy" typed as 8 bit int, but being read  as 16 bit int
.
            icUInt8Number Dummy, ScriptCodeCount;
#else
            icUInt16Number Dummy;
            icUInt8Number ScriptCodeCount;
#endif

            Icc ->Read(&AsciiCount, sizeof(icUInt32Number), 1, Icc -> stream);
            size -=
sizeof(icUInt32Number);
            AdjustEndianess32((LPBYTE) &AsciiCount);

            Icc ->Read(Name, 1, AsciiCount, Icc -> stream);
            size -= AsciiCount;

            // Skip Unicode code
            Icc ->Read(&UnicodeCode, sizeof(icUInt32Number), 1, Icc -> stream);
            size -=
sizeof(icUInt32Number);

            Icc ->Read(&UnicodeCount,
sizeof(icUInt32Number), 1, Icc -> stream);
            size -=
sizeof(icUInt32Number);
            AdjustEndianess32((LPBYTE) &UnicodeCount);
            if (UnicodeCount > size) return size;

            for (i=0; i < UnicodeCount; i++)
                    Icc ->Read(&Dummy, sizeof(icUInt16Number), 1, Icc -> stream);  //  <---- RIGHT HERE: Dummy being read  as 16 bit int


Just thought you'd like to know about this bug in case you haven't encountered it already.

Bryan

Reply via email to