--- lib/Xm/XpmAttrib.c.orig Sat Jan 1 17:44:26 2005 +++ lib/Xm/XpmAttrib.c Sat Jan 1 17:46:04 2005 @@ -58,6 +58,8 @@ XpmColor **colorTable, **color; int a; + if (ncolors > INT_MAX/sizeof(XpmColor *)) + return (XpmNoMemory); colorTable = (XpmColor **) XpmMalloc(ncolors * sizeof(XpmColor *)); if (!colorTable) { *oldct = NULL; --- lib/Xm/XpmCrDatFrI.c.orig Sat Jan 1 17:46:37 2005 +++ lib/Xm/XpmCrDatFrI.c Sat Jan 1 17:47:18 2005 @@ -134,6 +134,8 @@ */ header_nlines = 1 + image->ncolors; header_size = sizeof(char *) * header_nlines; + if (header_size > INT_MAX/sizeof(char *)) + return (XpmNoMemory); header = (char **) XpmCalloc(header_size, sizeof(char *)); if (!header) return (XpmNoMemory); --- lib/Xm/XpmI.h.orig Sat Jan 1 17:47:36 2005 +++ lib/Xm/XpmI.h Sat Jan 1 17:47:53 2005 @@ -108,6 +108,7 @@ * lets try to solve include files */ +#include #include #include /* stdio.h doesn't declare popen on a Sequent DYNIX OS */ --- lib/Xm/Xpmcreate.c.orig Sat Jan 1 17:48:09 2005 +++ lib/Xm/Xpmcreate.c Sat Jan 1 17:51:23 2005 @@ -805,6 +805,8 @@ ErrorStatus = XpmSuccess; /* malloc pixels index tables */ + if (image->ncolors > INT_MAX/sizeof(Pixel)) + return (XpmNoMemory); image_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * image->ncolors); if (!image_pixels) return (XpmNoMemory); @@ -948,6 +950,10 @@ #ifndef FOR_MSW /* now that bytes_per_line must have been set properly alloc data */ + if (height != 0 && (*image_return)->bytes_per_line > INT_MAX/height) { + XDestroyImage(*image_return); + return (XpmNoMemory); + } (*image_return)->data = (char *) XpmMalloc((*image_return)->bytes_per_line * height); @@ -1992,6 +1998,8 @@ xpmGetCmt(data, &colors_cmt); /* malloc pixels index tables */ + if (ncolors > INT_MAX/sizeof(Pixel)) + RETURN(XpmNoMemory); image_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * ncolors); if (!image_pixels) RETURN(XpmNoMemory); @@ -2247,7 +2255,7 @@ /* array of pointers malloced by need */ unsigned short *cidx[256]; - int char1; + unsigned int char1; bzero((char *)cidx, 256 * sizeof(unsigned short *)); /* init */ for (a = 0; a < ncolors; a++) { --- lib/Xm/Xpmhashtab.c.orig Sat Jan 1 17:51:59 2005 +++ lib/Xm/Xpmhashtab.c Sat Jan 1 17:56:35 2005 @@ -150,6 +150,8 @@ HASH_TABLE_GROWS table->size = size; table->limit = size / 3; + if (size > INT_MAX/sizeof(*atomTable)) + return (XpmNoMemory); atomTable = (xpmHashAtom *) XpmMalloc(size * sizeof(*atomTable)); if (!atomTable) return (XpmNoMemory); @@ -210,6 +212,8 @@ table->size = INITIAL_HASH_SIZE; table->limit = table->size / 3; table->used = 0; + if (table->size > INT_MAX/sizeof(*atomTable)) + return (XpmNoMemory); atomTable = (xpmHashAtom *) XpmMalloc(table->size * sizeof(*atomTable)); if (!atomTable) return (XpmNoMemory); --- lib/Xm/Xpmparse.c.orig Sat Jan 1 17:53:31 2005 +++ lib/Xm/Xpmparse.c Sat Jan 1 17:56:33 2005 @@ -335,6 +335,8 @@ char **defaults; int ErrorStatus; + if (ncolors > INT_MAX/sizeof(XpmColor)) + return (XpmNoMemory); colorTable = (XpmColor *) XpmCalloc(ncolors, sizeof(XpmColor)); if (!colorTable) return (XpmNoMemory); @@ -346,6 +348,8 @@ /* * read pixel value */ + if (cpp > INT_MAX-1) + return (XpmNoMemory); color->string = (char *) XpmMalloc(cpp + 1); if (!color->string) { xpmFreeColorTable(colorTable, ncolors); @@ -428,6 +432,8 @@ /* * read pixel value */ + if (cpp > INT_MAX-1) + return (XpmNoMemory); color->string = (char *) XpmMalloc(cpp + 1); if (!color->string) { xpmFreeColorTable(colorTable, ncolors); @@ -490,6 +496,8 @@ unsigned int *iptr, *iptr2; unsigned int a, x, y; + if (height != 0 && width > INT_MAX/sizeof(unsigned int)) + return (XpmNoMemory); #ifndef FOR_MSW iptr2 = (unsigned int *) XpmMalloc(sizeof(unsigned int) * width * height); #else @@ -543,7 +551,7 @@ /* array of pointers malloced by need */ unsigned short *cidx[256]; - int char1; + unsigned int char1; bzero((char *)cidx, 256 * sizeof(unsigned short *)); /* init */ for (a = 0; a < ncolors; a++) { --- lib/Xm/Xpmscan.c.orig Sat Jan 1 17:56:49 2005 +++ lib/Xm/Xpmscan.c Sat Jan 1 17:59:28 2005 @@ -225,11 +225,16 @@ else cpp = 0; + if ((height != 0 && width > INT_MAX/height) || + (width*height > INT_MAX/sizeof(unsigned int))) + RETURN(XpmNoMemory); pmap.pixelindex = (unsigned int *) XpmCalloc(width * height, sizeof(unsigned int)); if (!pmap.pixelindex) RETURN(XpmNoMemory); + if (pmap.size > INT_MAX/sizeof(Pixel)) + RETURN(XpmNoMemory); pmap.pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * pmap.size); if (!pmap.pixels) RETURN(XpmNoMemory); @@ -284,7 +289,8 @@ * get rgb values and a string of char, and possibly a name for each * color */ - + if (pmap.ncolors > INT_MAX/sizeof(XpmColor)) + RETURN(XpmNoMemory); colorTable = (XpmColor *) XpmCalloc(pmap.ncolors, sizeof(XpmColor)); if (!colorTable) RETURN(XpmNoMemory); @@ -332,6 +338,8 @@ /* first get a character string */ a = 0; + if (cpp > INT_MAX-1) + return (XpmNoMemory); if (!(s = color->string = (char *) XpmMalloc(cpp + 1))) return (XpmNoMemory); *s++ = printable[c = a % MAXPRINTABLE]; @@ -423,6 +431,8 @@ } /* first get character strings and rgb values */ + if (ncolors > INT_MAX/sizeof(XColor) || cpp > INT_MAX-1) + return (XpmNoMemory); xcolors = (XColor *) XpmMalloc(sizeof(XColor) * ncolors); if (!xcolors) return (XpmNoMemory);