package ghostscript tags 531624 help thanks
[sent again - with patches attached this time] On Tue, Jun 02, 2009 at 11:06:52PM +0200, Jonas Smedegaard wrote: >On Tue, Jun 02, 2009 at 09:44:41PM +0200, Moritz Muehlenhoff wrote: >>Roland Mas (CCed) has packaged libicc as a separate >>source package, since it's nowadays also used by >>argyllcms: >>http://packages.qa.debian.org/libi/libicc.html >> >>Please build ghostscript against it, so that we only >>have to fix security issues in libicc in one place. > >Yes, I have been looking forward to the emerge of this shared library, >and noticed its arrival earlier today :-D > >Thanks for bringing it up. I shall have a look at it! I have tried, but without succes so far. Ghostscript use a complex chain of make files. I could really use some fresh eyes on this one. Attached is what I believe is an upstream-friendly "almost there", but it needs more care. I have also attached a hack that is hinting at what needs to be weeded out. Please, someone, have a look at it. Kind regards, - Jonas -- * Jonas Smedegaard - idealist og Internet-arkitekt * Tlf.: +45 40843136 Website: http://dr.jones.dk/ [x] quote me freely [ ] ask before reusing [ ] keep private
diff --git a/debian/patches/1004_CVE-2009-0792_CVE-2009-0584_CVE-2009-0583.patch b/debian/patches/1004_CVE-2009-0792_CVE-2009-0584_CVE-2009-0583.patch deleted file mode 100644 index 79231fb..0000000 --- a/debian/patches/1004_CVE-2009-0792_CVE-2009-0584_CVE-2009-0583.patch +++ /dev/null @@ -1,1154 +0,0 @@ -Description: fixing various integer overflows -Author: Nico Golde <[email protected]> -diff -urNad ghostscript-8.64~dfsg~/icclib/icc.c ghostscript-8.64~dfsg/icclib/icc.c ---- ghostscript-8.64~dfsg~/icclib/icc.c 2008-05-09 06:12:01.000000000 +0200 -+++ ghostscript-8.64~dfsg/icclib/icc.c 2009-04-22 01:44:37.000000000 +0200 -@@ -152,6 +152,8 @@ - * Various bug fixes and enhancements. - */ - -+#include <limits.h> -+#include <stdint.h> - #include <stdio.h> - #include <stdlib.h> - #include <stdarg.h> -@@ -313,8 +315,11 @@ - icmFileMem *p = (icmFileMem *)pp; - size_t len; - -+ if (count > 0 && size > SIZE_MAX / count) -+ return 0; -+ - len = size * count; -- if ((p->cur + len) >= p->end) { /* Too much */ -+ if (len > (p->end - p->cur)) { /* Too much */ - if (size > 0) - count = (p->end - p->cur)/size; - else -@@ -1634,6 +1639,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt8Array_write malloc() failed"); - return icp->errc = 2; -@@ -1698,7 +1705,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (unsigned int *) icp->al->malloc(icp->al, p->size * sizeof(unsigned int))) == NULL) { -+ if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { - sprintf(icp->err,"icmUInt8Array_alloc: malloc() of icmUInt8Array data failed"); - return icp->errc = 2; - } -@@ -1749,6 +1756,10 @@ - icmUInt16Array *p = (icmUInt16Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ -+ if (p->size > (UINT_MAX - len) / 2) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } - len += p->size * 2; /* 2 bytes for each UInt16 */ - return len; - } -@@ -1821,6 +1832,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt16Array_write malloc() failed"); - return icp->errc = 2; -@@ -1885,7 +1898,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (unsigned int *) icp->al->malloc(icp->al, p->size * sizeof(unsigned int))) == NULL) { -+ if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { - sprintf(icp->err,"icmUInt16Array_alloc: malloc() of icmUInt16Array data failed"); - return icp->errc = 2; - } -@@ -1936,6 +1949,10 @@ - icmUInt32Array *p = (icmUInt32Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ -+ if (p->size > (UINT_MAX - len) / 4) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } - len += p->size * 4; /* 4 bytes for each UInt32 */ - return len; - } -@@ -2008,6 +2025,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt32Array_write malloc() failed"); - return icp->errc = 2; -@@ -2072,7 +2091,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (unsigned int *) icp->al->malloc(icp->al, p->size * sizeof(unsigned int))) == NULL) { -+ if ((p->data = (unsigned int *) icp->al->calloc(icp->al, p->size, sizeof(unsigned int))) == NULL) { - sprintf(icp->err,"icmUInt32Array_alloc: malloc() of icmUInt32Array data failed"); - return icp->errc = 2; - } -@@ -2123,6 +2142,10 @@ - icmUInt64Array *p = (icmUInt64Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ -+ if (p->size > (UINT_MAX - len) / 8) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } - len += p->size * 8; /* 8 bytes for each UInt64 */ - return len; - } -@@ -2195,6 +2218,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUInt64Array_write malloc() failed"); - return icp->errc = 2; -@@ -2259,7 +2284,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (icmUint64 *) icp->al->malloc(icp->al, p->size * sizeof(icmUint64))) == NULL) { -+ if ((p->data = (icmUint64 *) icp->al->calloc(icp->al, p->size, sizeof(icmUint64))) == NULL) { - sprintf(icp->err,"icmUInt64Array_alloc: malloc() of icmUInt64Array data failed"); - return icp->errc = 2; - } -@@ -2310,6 +2335,10 @@ - icmU16Fixed16Array *p = (icmU16Fixed16Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ -+ if (p->size > (UINT_MAX - len) / 4) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } - len += p->size * 4; /* 4 byte for each U16Fixed16 */ - return len; - } -@@ -2382,6 +2411,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmU16Fixed16Array_write malloc() failed"); - return icp->errc = 2; -@@ -2446,7 +2477,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (double *) icp->al->malloc(icp->al, p->size * sizeof(double))) == NULL) { -+ if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { - sprintf(icp->err,"icmU16Fixed16Array_alloc: malloc() of icmU16Fixed16Array data failed"); - return icp->errc = 2; - } -@@ -2497,6 +2528,10 @@ - icmS15Fixed16Array *p = (icmS15Fixed16Array *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ -+ if (p->size > (UINT_MAX - len) / 4) { -+ p->icp->errc = 1; -+ return (unsigned int) - 1; -+ } - len += p->size * 4; /* 4 byte for each S15Fixed16 */ - return len; - } -@@ -2569,6 +2604,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmS15Fixed16Array_write malloc() failed"); - return icp->errc = 2; -@@ -2633,7 +2670,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (double *) icp->al->malloc(icp->al, p->size * sizeof(double))) == NULL) { -+ if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { - sprintf(icp->err,"icmS15Fixed16Array_alloc: malloc() of icmS15Fixed16Array data failed"); - return icp->errc = 2; - } -@@ -2726,6 +2763,10 @@ - icmXYZArray *p = (icmXYZArray *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ -+ if (p->size > (UINT_MAX - len) / 12) { -+ p->icp->errc = 1; -+ return (unsigned int) - 1; -+ } - len += p->size * 12; /* 12 bytes for each XYZ */ - return len; - } -@@ -2798,6 +2839,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmXYZArray_write malloc() failed"); - return icp->errc = 2; -@@ -2865,7 +2908,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (icmXYZNumber *) icp->al->malloc(icp->al, p->size * sizeof(icmXYZNumber))) == NULL) { -+ if ((p->data = (icmXYZNumber *) icp->al->calloc(icp->al, p->size, sizeof(icmXYZNumber))) == NULL) { - sprintf(icp->err,"icmXYZArray_alloc: malloc() of icmXYZArray data failed"); - return icp->errc = 2; - } -@@ -2939,7 +2982,7 @@ - rv |= 1; - } - ix = (int)floor(val); /* Coordinate */ -- if (ix > (p->size-2)) -+ if (ix < 0 || ix > (p->size-2)) - ix = (p->size-2); - w = val - (double)ix; /* weight */ - val = p->data[ix]; -@@ -2961,6 +3004,11 @@ - ) { - int i; - -+ if (size > INT_MAX - 2) -+ /* Although rt->size is unsigned long, the rt data -+ * structure uses int data types to store indices. */ -+ return 2; -+ - rt->size = size; /* Stash pointers to these away */ - rt->data = data; - -@@ -2979,7 +3027,7 @@ - rt->qscale = (double)rt->rsize/(rt->rmax - rt->rmin); /* Scale factor to quantize to */ - - /* Initialize the reverse lookup structures, and get overall min/max */ -- if ((rt->rlists = (int **) icp->al->calloc(icp->al, 1, rt->rsize * sizeof(int *))) == NULL) { -+ if ((rt->rlists = (int **) icp->al->calloc(icp->al, rt->rsize, sizeof(int *))) == NULL) { - return 2; - } - -@@ -2992,6 +3040,15 @@ - int t; - t = s; s = e; e = t; - } -+ /* s and e should both be in the range [0,rt->rsize] -+ * now, but let's not rely on floating point -+ * calculations -- double-check. */ -+ if (s < 0) -+ s = 0; -+ if (e < 0) -+ e = 0; -+ if (s >= rt->rsize) -+ s = rt->rsize-1; - if (e >= rt->rsize) - e = rt->rsize-1; - -@@ -3001,7 +3058,7 @@ - int nf; /* Next free slot */ - if (rt->rlists[j] == NULL) { /* No allocation */ - as = 5; /* Start with space for 5 */ -- if ((rt->rlists[j] = (int *) icp->al->malloc(icp->al, sizeof(int) * as)) == NULL) { -+ if ((rt->rlists[j] = (int *) icp->al->calloc(icp->al, sizeof(int), as)) == NULL) { - return 2; - } - rt->rlists[j][0] = as; -@@ -3010,6 +3067,9 @@ - as = rt->rlists[j][0]; /* Allocate space for this list */ - nf = rt->rlists[j][1]; /* Next free location in list */ - if (nf >= as) { /* need to expand space */ -+ if (as > INT_MAX / 2 / sizeof (int)) -+ return 2; -+ - as *= 2; - rt->rlists[j] = (int *) icp->al->realloc(icp->al,rt->rlists[j], sizeof(int) * as); - if (rt->rlists[j] == NULL) { -@@ -3061,7 +3121,7 @@ - val = rsize_1; - ix = (int)floor(val); /* Coordinate */ - -- if (ix > (rt->size-2)) -+ if (ix < 0 || ix > (rt->size-2)) - ix = (rt->size-2); - if (rt->rlists[ix] != NULL) { /* There is a list of fwd candidates */ - /* For each candidate forward range */ -@@ -3088,6 +3148,7 @@ - /* We have failed to find an exact value, so return the nearest value */ - /* (This is slow !) */ - val = fabs(ival - rt->data[0]); -+ /* rt->size is known to be < INT_MAX */ - for (k = 0, i = 1; i < rt->size; i++) { - double er; - er = fabs(ival - rt->data[i]); -@@ -3141,6 +3202,10 @@ - icmCurve *p = (icmCurve *)pp; - unsigned int len = 0; - len += 12; /* 12 bytes for tag, padding and count */ -+ if (p->size > (UINT_MAX - len) / 2) { -+ p->icp->errc = 1; -+ return (unsigned int) - 1; -+ } - len += p->size * 2; /* 2 bytes for each UInt16 */ - return len; - } -@@ -3238,6 +3303,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmCurve_write malloc() failed"); - return icp->errc = 2; -@@ -3347,7 +3414,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (double *) icp->al->malloc(icp->al, p->size * sizeof(double))) == NULL) { -+ if ((p->data = (double *) icp->al->calloc(icp->al, p->size, sizeof(double))) == NULL) { - sprintf(icp->err,"icmCurve_alloc: malloc() of icmCurve data failed"); - return icp->errc = 2; - } -@@ -3493,6 +3560,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmData_write malloc() failed"); - return icp->errc = 2; -@@ -3620,7 +3689,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (unsigned char *) icp->al->malloc(icp->al, p->size * sizeof(unsigned char))) == NULL) { -+ if ((p->data = (unsigned char *) icp->al->calloc(icp->al, p->size, sizeof(unsigned char))) == NULL) { - sprintf(icp->err,"icmData_alloc: malloc() of icmData data failed"); - return icp->errc = 2; - } -@@ -3745,6 +3814,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmText_write malloc() failed"); - return icp->errc = 2; -@@ -3834,7 +3905,7 @@ - if (p->size != p->_size) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (char *) icp->al->malloc(icp->al, p->size * sizeof(char))) == NULL) { -+ if ((p->data = (char *) icp->al->calloc(icp->al, p->size, sizeof(char))) == NULL) { - sprintf(icp->err,"icmText_alloc: malloc() of icmText data failed"); - return icp->errc = 2; - } -@@ -4038,6 +4109,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmDateTimeNumber_write malloc() failed"); - return icp->errc = 2; -@@ -4128,11 +4201,15 @@ - /* icmLut object */ - - /* Utility function - raise one integer to an integer power */ --static unsigned int uipow(unsigned int a, unsigned int b) { -+static int uipow(unsigned int a, unsigned int b, unsigned int *ret) { - unsigned int rv = 1; -- for (; b > 0; b--) -+ for (; b > 0; b--) { -+ if (a > 0 && rv > UINT_MAX / a) -+ return 1; - rv *= a; -- return rv; -+ } -+ *ret = rv; -+ return 0; - } - - /* - - - - - - - - - - - - - - - - */ -@@ -4242,7 +4319,7 @@ - rv |= 1; - } - ix = (int)floor(val); /* Grid coordinate */ -- if (ix > (p->inputEnt-2)) -+ if (ix < 0 || ix > (p->inputEnt-2)) - ix = (p->inputEnt-2); - w = val - (double)ix; /* weight */ - val = table[ix]; -@@ -4268,7 +4345,7 @@ - if (p->inputChan <= 8) { - gw = GW; /* Use stack allocation */ - } else { -- if ((gw = (double *) icp->al->malloc(icp->al, (1 << p->inputChan) * sizeof(double))) == NULL) { -+ if ((gw = (double *) icp->al->calloc(icp->al, (1 << p->inputChan), sizeof(double))) == NULL) { - sprintf(icp->err,"icmLut_lookup_clut: malloc() failed"); - return icp->errc = 2; - } -@@ -4301,7 +4378,7 @@ - rv |= 1; - } - x = (int)floor(val); /* Grid coordinate */ -- if (x > clutPoints_2) -+ if (x < 0 || x > clutPoints_2) - x = clutPoints_2; - co[e] = val - (double)x; /* 1.0 - weight */ - gp += x * p->dinc[e]; /* Add index offset for base of cube */ -@@ -4374,7 +4451,7 @@ - rv |= 1; - } - x = (int)floor(val); /* Grid coordinate */ -- if (x > clutPoints_2) -+ if (x < 0 || x > clutPoints_2) - x = clutPoints_2; - co[e] = val - (double)x; /* 1.0 - weight */ - gp += x * p->dinc[e]; /* Add index offset for base of cube */ -@@ -4447,7 +4524,7 @@ - rv |= 1; - } - ix = (int)floor(val); /* Grid coordinate */ -- if (ix > (p->outputEnt-2)) -+ if (ix < 0 || ix > (p->outputEnt-2)) - ix = (p->outputEnt-2); - w = val - (double)ix; /* weight */ - val = table[ix]; -@@ -4819,19 +4896,50 @@ - ) { - icmLut *p = (icmLut *)pp; - unsigned int len = 0; -+ unsigned int pw; - - if (p->ttype == icSigLut8Type) { - len += 48; /* tag and header */ -+ if (p->inputChan > 0 && -+ p->inputEnt > (UINT_MAX - len) / p->inputChan / 1) -+ goto overflow; -+ - len += 1 * (p->inputChan * p->inputEnt); -- len += 1 * (p->outputChan * uipow(p->clutPoints,p->inputChan)); -+ if (uipow(p->clutPoints,p->inputChan, &pw) || -+ (p->outputChan > 0 && -+ pw > (UINT_MAX - len) / p->outputChan / 1)) -+ goto overflow; -+ -+ len += 1 * (p->outputChan * pw); -+ if (p->outputChan > 0 && -+ p->outputEnt > (UINT_MAX - len) / p->outputChan / 1) -+ goto overflow; -+ - len += 1 * (p->outputChan * p->outputEnt); - } else { - len += 52; /* tag and header */ -+ if (p->inputChan > 0 && -+ p->inputEnt > (UINT_MAX - len) / p->inputChan / 2) -+ goto overflow; -+ - len += 2 * (p->inputChan * p->inputEnt); -- len += 2 * (p->outputChan * uipow(p->clutPoints,p->inputChan)); -+ if (uipow(p->clutPoints,p->inputChan, &pw) || -+ (p->outputChan > 0 && -+ pw > (UINT_MAX - len) / p->outputChan / 2)) -+ goto overflow; -+ -+ len += 2 * (p->outputChan * pw); -+ if (p->outputChan > 0 && -+ p->outputEnt > (UINT_MAX - len) / p->outputChan / 2) -+ goto overflow; -+ - len += 2 * (p->outputChan * p->outputEnt); - } - return len; -+ -+ overflow: -+ p->icp->errc = 1; -+ return (unsigned int) -1; - } - - /* read the object, return 0 on success, error code on fail */ -@@ -4844,6 +4952,7 @@ - icc *icp = p->icp; - int rv = 0; - unsigned long i, j, g, size; -+ unsigned int pw; - char *bp, *buf; - - if (len < 4) { -@@ -4904,6 +5013,11 @@ - return icp->errc = 1; - } - -+ if (p->clutPoints > 100) { -+ sprintf(icp->err,"icmLut_read: too many clutPoints"); -+ return icp->errc = 1; -+ } -+ - /* Read 3x3 transform matrix */ - for (j = 0; j < 3; j++) { /* Rows */ - for (i = 0; i < 3; i++) { /* Columns */ -@@ -4921,13 +5035,18 @@ - bp = buf+52; - } - -- if (len < icmLut_get_size((icmBase *)p)) { -+ if (len < icmLut_get_size((icmBase *)p) || icp->errc) { - sprintf(icp->err,"icmLut_read: Tag too small for contents"); - icp->al->free(icp->al, buf); - return icp->errc = 1; - } - - /* Read the input tables */ -+ if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { -+ sprintf(icp->err,"icmLut_read: overflow"); -+ icp->al->free(icp->al, buf); -+ return icp->errc = 1; -+ } - size = (p->inputChan * p->inputEnt); - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); -@@ -4942,7 +5061,14 @@ - } - - /* Read the clut table */ -- size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); -+ if (uipow(p->clutPoints,p->inputChan,&pw) || -+ (p->outputChan > 0 && -+ pw > UINT_MAX / p->outputChan)) { -+ sprintf(icp->err,"icmLut_read: overflow"); -+ icp->al->free(icp->al, buf); -+ return icp->errc = 1; -+ } -+ size = (p->outputChan * pw); - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); - return rv; -@@ -4956,6 +5082,11 @@ - } - - /* Read the output tables */ -+ if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { -+ sprintf(icp->err,"icmLut_read: overflow"); -+ icp->al->free(icp->al, buf); -+ return icp->errc = 1; -+ } - size = (p->outputChan * p->outputEnt); - if ((rv = p->allocate((icmBase *)p)) != 0) { - icp->al->free(icp->al, buf); -@@ -4995,12 +5126,14 @@ - icmLut *p = (icmLut *)pp; - icc *icp = p->icp; - unsigned long i,j; -- unsigned int len, size; -+ unsigned int len, size, pw; - char *bp, *buf; /* Buffer to write from */ - int rv = 0; - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmLut_write malloc() failed"); - return icp->errc = 2; -@@ -5066,6 +5199,11 @@ - } - - /* Write the input tables */ -+ if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { -+ sprintf(icp->err,"icmLut_write: overflow"); -+ icp->al->free(icp->al, buf); -+ return icp->errc = 1; -+ } - size = (p->inputChan * p->inputEnt); - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) { -@@ -5086,7 +5224,14 @@ - } - - /* Write the clut table */ -- size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); -+ if (uipow(p->clutPoints,p->inputChan,&pw) || -+ (p->outputChan > 0 && -+ pw > UINT_MAX / p->outputChan)) { -+ sprintf(icp->err,"icmLut_write: overflow"); -+ icp->al->free(icp->al, buf); -+ return icp->errc = 1; -+ } -+ size = (p->outputChan * pw); - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) { - if ((rv = write_DCS8Number(p->clutTable[i], bp)) != 0) { -@@ -5106,6 +5251,11 @@ - } - - /* Write the output tables */ -+ if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { -+ sprintf(icp->err,"icmLut_write: overflow"); -+ icp->al->free(icp->al, buf); -+ return icp->errc = 1; -+ } - size = (p->outputChan * p->outputEnt); - if (p->ttype == icSigLut8Type) { - for (i = 0; i < size; i++, bp += 1) { -@@ -5177,7 +5327,14 @@ - if (p->inputChan > MAX_CHAN) { - fprintf(op," !!Can't dump > %d input channel CLUT table!!\n",MAX_CHAN); - } else { -- size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); -+ unsigned int pw; -+ if (uipow(p->clutPoints,p->inputChan,&pw) || -+ (p->outputChan > 0 && -+ pw > UINT_MAX / p->outputChan)) { -+ fprintf(op,"Would overflow.\n"); -+ return; -+ } -+ size = (p->outputChan * pw); - for (j = 0; j < p->inputChan; j++) - ii[j] = 0; - for (i = 0; i < size;) { -@@ -5216,7 +5373,7 @@ - static int icmLut_allocate( - icmBase *pp - ) { -- unsigned int i, j, g, size; -+ unsigned int i, j, g, size, pw; - icmLut *p = (icmLut *)pp; - icc *icp = p->icp; - -@@ -5231,6 +5388,10 @@ - return icp->errc = 1; - } - -+ if (p->inputEnt > 0 && p->inputChan > UINT_MAX / p->inputEnt) { -+ sprintf(icp->err,"icmLut_alloc: too many entries"); -+ return icp->errc = 1; -+ } - size = (p->inputChan * p->inputEnt); - if (size != p->inputTable_size) { - if (p->inputTable != NULL) -@@ -5241,7 +5402,13 @@ - } - p->inputTable_size = size; - } -- size = (p->outputChan * uipow(p->clutPoints,p->inputChan)); -+ if (uipow(p->clutPoints,p->inputChan,&pw) || -+ (p->outputChan > 0 && -+ pw > UINT_MAX / p->outputChan)) { -+ sprintf(icp->err,"icmLut_alloc: overflow"); -+ return icp->errc = 1; -+ } -+ size = (p->outputChan * pw); - if (size != p->clutTable_size) { - if (p->clutTable != NULL) - icp->al->free(icp->al, p->clutTable); -@@ -5251,6 +5418,10 @@ - } - p->clutTable_size = size; - } -+ if (p->outputChan > 0 && p->outputEnt > UINT_MAX / p->outputChan) { -+ sprintf(icp->err,"icmLut_alloc: overflow"); -+ return icp->errc = 1; -+ } - size = (p->outputChan * p->outputEnt); - if (size != p->outputTable_size) { - if (p->outputTable != NULL) -@@ -5441,6 +5612,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmMeasurement_write malloc() failed"); - return icp->errc = 2; -@@ -5712,13 +5885,20 @@ - len += p->nDeviceCoords * 1; /* bytes for each named color */ - } - } else { /* Named Color 2 */ -+ unsigned int col; - len += 8; /* 8 bytes for tag and padding */ - len += 4; /* 4 for vendor specific flags */ - len += 4; /* 4 for count of named colors */ - len += 4; /* 4 for number of device coords */ - len += 32; /* 32 for prefix of color names */ - len += 32; /* 32 for suffix of color names */ -- len += p->count * (32 + 6 + p->nDeviceCoords * 2); /* bytes for each named color */ -+ col = 32 + 6 + p->nDeviceCoords * 2; -+ if (p->nDeviceCoords > (UINT_MAX - (32 + 6)) / 2 || -+ (p->count > 0 && col > (UINT_MAX - len) / p->count)) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } -+ len += p->count * col; /* bytes for each named color */ - } - return len; - } -@@ -5882,6 +6062,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmNamedColor_write malloc() failed"); - return icp->errc = 2; -@@ -6109,9 +6291,22 @@ - ) { - icmTextDescription *p = (icmTextDescription *)pp; - unsigned int len = 0; -+ if (p->size > UINT_MAX - (8 + 4 + 8)) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } - len += 8; /* 8 bytes for tag and padding */ - len += 4 + p->size; /* Ascii string length + ascii string */ -- len += 8 + 2 * p->ucSize; /* Unicode language code + length + string */ -+ len += 8; /* Unicode language code + length */ -+ if (p->ucSize > (UINT_MAX - len) / 2) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } -+ len += 2 * p->ucSize; /* Unicode string */ -+ if (len > (UINT_MAX - (3 + 67))) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } - len += 3 + 67; /* ScriptCode code, length string */ - return len; - } -@@ -6294,6 +6489,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmTextDescription_write malloc() failed"); - return icp->errc = 2; -@@ -6535,7 +6732,7 @@ - if (p->size != p->_size) { - if (p->desc != NULL) - icp->al->free(icp->al, p->desc); -- if ((p->desc = (char *) icp->al->malloc(icp->al, p->size * sizeof(char))) == NULL) { -+ if ((p->desc = (char *) icp->al->calloc(icp->al, p->size, sizeof(char))) == NULL) { - sprintf(icp->err,"icmTextDescription_alloc: malloc() of Ascii description failed"); - return icp->errc = 2; - } -@@ -6544,7 +6741,7 @@ - if (p->ucSize != p->uc_size) { - if (p->ucDesc != NULL) - icp->al->free(icp->al, p->ucDesc); -- if ((p->ucDesc = (ORD16 *) icp->al->malloc(icp->al, p->ucSize * sizeof(ORD16))) == NULL) { -+ if ((p->ucDesc = (ORD16 *) icp->al->calloc(icp->al, p->ucSize, sizeof(ORD16))) == NULL) { - sprintf(icp->err,"icmTextDescription_alloc: malloc() of Unicode description failed"); - return icp->errc = 2; - } -@@ -6820,6 +7017,12 @@ - bp += 8; /* Skip padding */ - - p->count = read_UInt32Number(bp); /* Number of sequence descriptions */ -+ if (p->count > 1000) { -+ sprintf(icp->err,"icmProfileSequenceDesc_read: too many sequence descriptions"); -+ icp->al->free(icp->al, buf); -+ return icp->errc = 1; -+ } -+ - bp += 4; - - /* Read all the sequence descriptions */ -@@ -6852,6 +7055,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmProfileSequenceDesc_write malloc() failed"); - return icp->errc = 2; -@@ -6922,7 +7127,7 @@ - if (p->count != p->_count) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (icmDescStruct *) icp->al->malloc(icp->al, p->count * sizeof(icmDescStruct))) == NULL) { -+ if ((p->data = (icmDescStruct *) icp->al->calloc(icp->al, p->count, sizeof(icmDescStruct))) == NULL) { - sprintf(icp->err,"icmProfileSequenceDesc_allocate Allocation of DescStruct array failed"); - return icp->errc = 2; - } -@@ -7041,6 +7246,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmSignature_write malloc() failed"); - return icp->errc = 2; -@@ -7156,6 +7363,10 @@ - icmScreening *p = (icmScreening *)pp; - unsigned int len = 0; - len += 16; /* 16 bytes for tag, padding, flag & channeles */ -+ if (p->channels > (UINT_MAX - len) / 12) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } - len += p->channels * 12; /* 12 bytes for each channel */ - return len; - } -@@ -7235,6 +7446,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmScreening_write malloc() failed"); - return icp->errc = 2; -@@ -7315,7 +7528,7 @@ - if (p->channels != p->_channels) { - if (p->data != NULL) - icp->al->free(icp->al, p->data); -- if ((p->data = (icmScreeningData *) icp->al->malloc(icp->al, p->channels * sizeof(icmScreeningData))) == NULL) { -+ if ((p->data = (icmScreeningData *) icp->al->calloc(icp->al, p->channels, sizeof(icmScreeningData))) == NULL) { - sprintf(icp->err,"icmScreening_alloc: malloc() of icmScreening data failed"); - return icp->errc = 2; - } -@@ -7366,10 +7579,20 @@ - icmUcrBg *p = (icmUcrBg *)pp; - unsigned int len = 0; - len += 8; /* 8 bytes for tag and padding */ -+ if (p->UCRcount > (UINT_MAX - len - 4) / 2) -+ goto overflow; -+ - len += 4 + p->UCRcount * 2; /* Undercolor Removal */ -+ if (p->BGcount > (UINT_MAX - len - 4 - p->size) / 2) -+ goto overflow; -+ - len += 4 + p->BGcount * 2; /* Black Generation */ - len += p->size; /* Description string */ - return len; -+ -+ overflow: -+ p->icp->errc = 1; -+ return (unsigned int) -1; - } - - /* read the object, return 0 on success, error code on fail */ -@@ -7498,6 +7721,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmUcrBg_write malloc() failed"); - return icp->errc = 2; -@@ -7663,7 +7888,7 @@ - if (p->UCRcount != p->UCR_count) { - if (p->UCRcurve != NULL) - icp->al->free(icp->al, p->UCRcurve); -- if ((p->UCRcurve = (double *) icp->al->malloc(icp->al, p->UCRcount * sizeof(double))) == NULL) { -+ if ((p->UCRcurve = (double *) icp->al->calloc(icp->al, p->UCRcount, sizeof(double))) == NULL) { - sprintf(icp->err,"icmUcrBg_allocate: malloc() of UCR curve data failed"); - return icp->errc = 2; - } -@@ -7672,7 +7897,7 @@ - if (p->BGcount != p->BG_count) { - if (p->BGcurve != NULL) - icp->al->free(icp->al, p->BGcurve); -- if ((p->BGcurve = (double *) icp->al->malloc(icp->al, p->BGcount * sizeof(double))) == NULL) { -+ if ((p->BGcurve = (double *) icp->al->calloc(icp->al, p->BGcount, sizeof(double))) == NULL) { - sprintf(icp->err,"icmUcrBg_allocate: malloc() of BG curve data failed"); - return icp->errc = 2; - } -@@ -7681,7 +7906,7 @@ - if (p->size != p->_size) { - if (p->string != NULL) - icp->al->free(icp->al, p->string); -- if ((p->string = (char *) icp->al->malloc(icp->al, p->size * sizeof(char))) == NULL) { -+ if ((p->string = (char *) icp->al->calloc(icp->al, p->size, sizeof(char))) == NULL) { - sprintf(icp->err,"icmUcrBg_allocate: malloc() of string data failed"); - return icp->errc = 2; - } -@@ -7743,6 +7968,15 @@ - len += 2; /* 2 bytes for channels */ - len += 2; /* 2 for entry count */ - len += 2; /* 2 for entry size */ -+ if (p->u.table.entryCount > 0 && -+ p->u.table.entrySize > 0 && -+ p->u.table.channels > -+ (UINT_MAX - len) / -+ p->u.table.entryCount / -+ p->u.table.entrySize) { -+ p->icp->errc = 1; -+ return (unsigned int) -1; -+ } - len += ( p->u.table.channels * /* compute table size */ - p->u.table.entryCount * - p->u.table.entrySize ); -@@ -7762,10 +7996,11 @@ - ) { - icmVideoCardGamma *p = (icmVideoCardGamma *)pp; - icc *icp = p->icp; -- int rv, c; -+ int rv; - char *bp, *buf; - unsigned char *pchar; - unsigned short *pshort; -+ unsigned long c; - - if (len < 18) { - sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); -@@ -7803,6 +8038,16 @@ - p->u.table.channels = read_UInt16Number(bp+12); - p->u.table.entryCount = read_UInt16Number(bp+14); - p->u.table.entrySize = read_UInt16Number(bp+16); -+ if (p->u.table.entrySize > 65530 || p->u.table.entrySize == 0) { -+ sprintf(icp->err,"icmVideoCardGamma_read: Too many entries (or none)"); -+ return icp->errc = 1; -+ } -+ if (p->u.table.entryCount > 0 && p->u.table.entrySize > 0 && -+ p->u.table.channels > -+ UINT_MAX / p->u.table.entryCount / p->u.table.entrySize) { -+ sprintf(icp->err,"icmVideoCardGamma_read: Overflow reading tag"); -+ return icp->errc = 1; -+ } - if (len-18 < p->u.table.channels*p->u.table.entryCount*p->u.table.entrySize) { - sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal"); - return icp->errc = 1; -@@ -7871,6 +8116,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmViewingConditions_write malloc() failed"); - return icp->errc = 2; -@@ -8049,7 +8296,7 @@ - ) { - icmVideoCardGamma *p = (icmVideoCardGamma *)pp; - icc *icp = p->icp; -- int size; -+ unsigned int size; - - /* note: allocation is only relevant for table type - * and in that case the channels, entryCount, and entrySize -@@ -8059,6 +8306,11 @@ - if (p->tagType == icmVideoCardGammaTableType) { - if (p->u.table.data != NULL) - icp->al->free(icp->al, p->u.table.data); -+ if (p->u.table.entryCount > 0 && -+ p->u.table.channels > UINT_MAX / p->u.table.entryCount) { -+ sprintf(icp->err,"icmVideoCardGamma_alloc: table too large"); -+ return icp->errc = 1; -+ } - size = (p->u.table.channels * - p->u.table.entryCount); - switch (p->u.table.entrySize) { -@@ -8066,6 +8318,10 @@ - size *= sizeof(unsigned char); - break; - case 2: -+ if (size > UINT_MAX / sizeof(unsigned short)) { -+ sprintf(icp->err,"icmVideoCardGamma_alloc: table too large"); -+ return icp->errc = 1; -+ } - size *= sizeof(unsigned short); - break; - default: -@@ -8201,6 +8457,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmViewingConditions_write malloc() failed"); - return icp->errc = 2; -@@ -8433,6 +8691,8 @@ - - /* Allocate a file write buffer */ - len = p->get_size((icmBase *)p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->malloc(icp->al, len)) == NULL) { - sprintf(icp->err,"icmCrdInfo_write malloc() failed"); - return icp->errc = 2; -@@ -8585,7 +8845,7 @@ - if (p->ppsize != p->_ppsize) { - if (p->ppname != NULL) - icp->al->free(icp->al, p->ppname); -- if ((p->ppname = (char *) icp->al->malloc(icp->al, p->ppsize * sizeof(char))) == NULL) { -+ if ((p->ppname = (char *) icp->al->calloc(icp->al, p->ppsize, sizeof(char))) == NULL) { - sprintf(icp->err,"icmCrdInfo_alloc: malloc() of string data failed"); - return icp->errc = 2; - } -@@ -8595,7 +8855,7 @@ - if (p->crdsize[t] != p->_crdsize[t]) { - if (p->crdname[t] != NULL) - icp->al->free(icp->al, p->crdname[t]); -- if ((p->crdname[t] = (char *) icp->al->malloc(icp->al, p->crdsize[t] * sizeof(char))) == NULL) { -+ if ((p->crdname[t] = (char *) icp->al->calloc(icp->al, p->crdsize[t], sizeof(char))) == NULL) { - sprintf(icp->err,"icmCrdInfo_alloc: malloc() of CRD%d name string failed",t); - return icp->errc = 2; - } -@@ -8736,6 +8996,8 @@ - int rv = 0; - - len = p->get_size(p); -+ if (icp->errc) -+ return icp->errc; - if ((buf = (char *) icp->al->calloc(icp->al,1,len)) == NULL) { /* Zero it - some CMS are fussy */ - sprintf(icp->err,"icmHeader_write calloc() failed"); - return icp->errc = 2; -@@ -9245,13 +9507,23 @@ - } - - p->count = read_UInt32Number(tcbuf); /* Tag count */ -+ if (p->count > 100) { -+ sprintf(p->err,"icc_read: too many table tags"); -+ return p->errc = 1; -+ } - if (p->count > 0) { - char *bp, *buf; -- if ((p->data = (icmTag *) p->al->malloc(p->al, p->count * sizeof(icmTag))) == NULL) { -+ if ((p->data = (icmTag *) p->al->calloc(p->al, p->count, sizeof(icmTag))) == NULL) { - sprintf(p->err,"icc_read: Tag table malloc() failed"); - return p->errc = 2; - } - -+ if (p->count > (UINT_MAX - 4) / 12) { -+ sprintf(p->err,"icc_read: overflow"); -+ p->al->free(p->al, p->data); -+ p->data = NULL; -+ return p->errc = 1; -+ } - len = 4 + p->count * 12; - if ((buf = (char *) p->al->malloc(p->al, len)) == NULL) { - sprintf(p->err,"icc_read: Tag table read buffer malloc() failed"); -@@ -9281,6 +9553,14 @@ - return p->errc = 1; - } - p->data[i].size = read_UInt32Number(bp + 8); -+ if (p->data[i].offset + p->data[i].size > -+ p->header->size) { -+ sprintf(p->err,"icc_read: tag out of bounds"); -+ p->al->free(p->al, p->data); -+ p->data = NULL; -+ p->al->free(p->al, buf); -+ return p->errc = 1; -+ } - if ( p->fp->seek(p->fp, of + p->data[i].offset) != 0 - || p->fp->read(p->fp, tcbuf, 1, 4) != 4) { - sprintf(p->err,"icc_read: fseek() or fread() failed on tag headers"); -@@ -9321,8 +9601,14 @@ - } - - size += p->header->get_size(p->header); -+ if (p->errc) -+ return (unsigned int) -1; - - size = DO_ALIGN(size); -+ if (size == 0 || p->count > (UINT_MAX - 4 - size) / 12) { -+ p->errc = 1; -+ return (unsigned int) -1; -+ } - size += 4 + p->count * 12; /* Tag table length */ - - /* Reset touched flag for each tag type */ -@@ -9337,8 +9623,13 @@ - /* Get size for each tag type, skipping links */ - for (i = 0; i < p->count; i++) { - if (p->data[i].objp->touched == 0) { /* Not alllowed for previously */ -+ unsigned int obj_size; - size = DO_ALIGN(size); -- size += p->data[i].objp->get_size(p->data[i].objp); -+ obj_size = p->data[i].objp->get_size(p->data[i].objp); -+ if (size == 0 || p->errc || -+ obj_size > UINT_MAX - size) -+ return (unsigned int) -1; -+ size += obj_size; - p->data[i].objp->touched = 1; /* Don't account for this again */ - } - } -@@ -9373,9 +9664,19 @@ - } - - size += p->header->get_size(p->header); -+ if (p->errc) -+ return p->errc; - -+ if (p->count > (UINT_MAX - 4) / 12) { -+ sprintf(p->err,"icc_write: too many tags"); -+ return p->errc = 1; -+ } - len = 4 + p->count * 12; /* Tag table length */ - size = DO_ALIGN(size); -+ if (size == 0 || size > UINT_MAX - len) { -+ sprintf(p->err,"icc_write: overflow writing tag table"); -+ return p->errc = 1; -+ } - size += len; - - /* Allocate memory buffer for tag table */ -@@ -9406,6 +9707,12 @@ - size = DO_ALIGN(size); - p->data[i].offset = size; /* Profile relative target */ - p->data[i].size = p->data[i].objp->get_size(p->data[i].objp); -+ if (size == 0 || -+ p->errc || p->data[i].size > UINT_MAX - size) { -+ sprintf(p->err,"icc_write: internal error - overflow?"); -+ p->al->free(p->al, buf); -+ return p->errc; -+ } - size += p->data[i].size; - p->data[i].objp->touched = 1; /* Allocated space for it */ - } else { /* must be linked - copy allocation */ -@@ -9529,6 +9836,11 @@ - } - - /* Make space in tag table for new tag item */ -+ if (p->count > (UINT_MAX / sizeof(icmTag)) - 1) { -+ sprintf(p->err,"icc_add_tag: overflow"); -+ p->errc = 1; -+ return NULL; -+ } - if (p->data == NULL) - tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); - else -@@ -9612,6 +9924,11 @@ - } - - /* Make space in tag table for new tag item */ -+ if (p->count > (UINT_MAX / sizeof(icmTag)) - 1) { -+ sprintf(p->err,"icc_link_tag: overflow"); -+ p->errc = 1; -+ return NULL; -+ } - if (p->data == NULL) - tp = p->al->malloc(p->al, (p->count+1) * sizeof(icmTag)); - else diff --git a/debian/patches/1004_system_icclib.patch b/debian/patches/1004_system_icclib.patch new file mode 100644 index 0000000..c0afbb7 --- /dev/null +++ b/debian/patches/1004_system_icclib.patch @@ -0,0 +1,86 @@ +Description: Support linking against system shared icclib library +Author: Jonas Smedegaard <[email protected]> +diff --ruN a/base/Makefile.in b/base/Makefile.in +--- a/base/Makefile.in ++++ b/base/Makefile.in +@@ -204,7 +204,9 @@ + # Define the directory where the icclib source are stored. + # See icclib.mak for more information + +-ICCSRCDIR=icclib ++ICCLIB_NAME=icc ++share_iccl...@share_icclib@ ++iccsrcd...@icclibdir@ + + # Define the directory where the ijs source is stored, + # and the process forking method to use for the server. +diff --ruN a/base/configure.ac b/base/configure.ac +--- a/base/configure.ac ++++ b/base/configure.ac +@@ -363,6 +363,28 @@ + [define if the libjpeg memory system prototypes aren't available]) + fi + ++AC_MSG_CHECKING([for local icclib source]) ++ICCLIBDIR=src ++if test -d icclib; then ++ AC_MSG_RESULT([yes]) ++ SHARE_ICCLIB=0 ++ ICCLIBDIR=icclib ++else ++ AC_MSG_RESULT([no]) ++ AC_CHECK_LIB(icc, new_icmFileStd_name, [ ++ AC_CHECK_HEADERS(icc.h, [SHARE_ICCLIB=1]) ++ ]) ++fi ++if test -z "$SHARE_ICCLIB"; then ++ AC_MSG_ERROR([I did not find a copy of icclib on your system. ++ Please either install it, or unpack a copy of the source in a ++ local directory named 'icclib'. See http://www.argyllcms.com/ ++ for more information. ++ ]) ++fi ++AC_SUBST(SHARE_ICCLIB) ++AC_SUBST(ICCLIBDIR) ++ + dnl these are technically optional + + AC_MSG_CHECKING([for local zlib source]) +diff --ruN a/base/icclib.mak b/base/icclib.mak +--- a/base/icclib.mak ++++ b/base/icclib.mak +@@ -17,11 +17,14 @@ + # ICCSRCDIR - the icclib source directory + # ICCGENDIR - the generated intermediate file directory + # ICCOBJDIR - the object directory ++# SHARE_ICCLIB - 0 to compile the library, 1 to share ++# ICCLIB_NAME - if SHARE_ICCLIB = 1, the name of the shared library + +-# This partial makefile compiles Graeme W. Gill's icclibfor use in Ghostscript. ++# This partial makefile compiles Graeme W. Gill's icclib for use in ++# Ghostscript. + # + # The original source for the code in this directory may be accessed via +-# http://web.access.net.au/argyll/color.html ++# http://www.argyllcms.com/ + # For information on ICC color profiles in general, see the International + # Color Consortium's web site at + # http://www.color.org +@@ -62,9 +65,15 @@ ICCDEP=$(AK) + + # Code common to compression and decompression. + ++$(ICCGEN)icclib.dev : $(ICCLIB_MAK) $(ICCGEN)icclib_$(SHARE_ICCLIB).dev ++ $(CP_) $(ICCGEN)icclib_$(SHARE_ICCLIB).dev $(ICCGEN)icclib.dev ++ ++$(ICCGEN)icclib_1.dev : $(ICCLIB_MAK) $(ECHOGS_XE) ++ $(SETMOD) $(ICCGEN)icclib_1 -lib $(ICCLIB_NAME) ++ + icclib_=$(ICCOBJ)icc.$(OBJ) +-$(ICCGEN)icclib.dev : $(ICCLIB_MAK) $(ECHOGS_XE) $(icclib_) +- $(SETMOD) $(ICCGEN)icclib $(icclib_) ++$(ICCGEN)icclib_0.dev : $(ICCLIB_MAK) $(ECHOGS_XE) $(icclib_) ++ $(SETMOD) $(ICCGEN)icclib_0 $(icclib_) + + icc_h=$(ICCSRC)$(D)icc.h $(ICCSRC)$(D)icc$(ICCPROFVER).h + diff --git a/debian/patches/series b/debian/patches/series index 07fa54a..0bd4cc4 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -8,7 +8,7 @@ 1001_install_cjk_examples.patch 1002_ps2pdf_man_fix.patch 1003_fix_autoconf_create_from_infiles.patch -1004_CVE-2009-0792_CVE-2009-0584_CVE-2009-0583.patch +1004_system_icclib.patch 1005_CVE-2009-0196.patch 1006_system-jasper.patch 1007_fix_pphs_script_not_lib.patch diff --git a/debian/rules b/debian/rules index 8ba7abc..5a983b4 100755 --- a/debian/rules +++ b/debian/rules @@ -51,7 +51,7 @@ DEB_UPSTREAM_REPACKAGE_EXCLUDE += jasper/doc/*.pdf DEB_INSTALL_DOCS_ALL = debian/changes.svn # Use system libraries -gs_opts = SHARE_ZLIB=1 SHARE_LIBPNG=1 SHARE_JPEG=1 SHARE_JPX=1 +gs_opts = SHARE_ZLIB=1 SHARE_LIBPNG=1 SHARE_JPEG=1 SHARE_JPX=1 SHARE_ICCLIB=1 ICCPROFVER=V42 gs_opts += CUPSDATA=/usr/share/ppd/ghostscript @@ -98,7 +98,7 @@ clean:: # Ensure local copies of shared libs are not accidentally used # (jpeg should be avoided too, but is used even when using system lib) -upstreamtmpdirs = zlib libpng jasper +upstreamtmpdirs = zlib libpng jasper icclib DEB_PHONY_RULES += revert-upstreamtmpstuff # autotools.mk might configure too early $(DEB_BUILDDIR)/config.status: post-patches
diff --git a/base/lib.mak b/base/lib.mak index 1fcfb5e..41a171d 100644 --- a/base/lib.mak +++ b/base/lib.mak @@ -2454,7 +2454,7 @@ $(GLD)sicclib.dev : $(LIB_MAK) $(ECHOGS_XE) $(sicclib_) $(GLD)cielib.dev\ # the compilation of icc.$(OBJ). $(GLOBJ)gsicc.$(OBJ) : $(GLSRC)gsicc.c $(GXERR) $(math__h) $(memory__h)\ $(gsstruct_h) $(stream_h) $(gxcspace_h) $(gxarith_h) $(gxcie_h)\ - $(gzstate_h) $(gsicc_h) $(ICCOBJDIR)$(D)icc.$(OBJ) + $(gzstate_h) $(gsicc_h) $(GLICCCC) $(GLO_)gsicc.$(OBJ) $(C_) $(GLSRC)gsicc.c # ---------------- Separation colors ---------------- #
signature.asc
Description: Digital signature

