From: Piotr Pawliczek Always use tempbuffer instead of the input buffer, even if numpix equals AdjustedInputWidth, to prevent said input buffer from overflowing because AdjustedInputWidth >= InputWidth. Corresponding change in ChromeOS: https://crrev.com/c/3681814 --- a/prnt/hpcups/Halftoner.cpp +++ b/prnt/hpcups/Halftoner.cpp @@ -141,22 +141,19 @@ Halftoner::Halftoner } } - if (OutputWidth[K] > AdjustedInputWidth) // need to expand input data (easier than expanding bit-pixels after) on K row + tempBuffer = (BYTE*) new BYTE[(OutputWidth[K])]; + if (tempBuffer == NULL) { - tempBuffer = (BYTE*) new BYTE[(OutputWidth[K])]; - if (tempBuffer == NULL) + goto MemoryError; + } + if (EndPlane > Y) + { + tempBuffer2 = (BYTE*) new BYTE[(OutputWidth[K])]; + if (tempBuffer2 == NULL) { goto MemoryError; } - if (EndPlane > Y) - { - tempBuffer2 = (BYTE*) new BYTE[(OutputWidth[K])]; - if (tempBuffer2 == NULL) - { - goto MemoryError; - } - } } Restart(); // this zeroes buffers and sets nextraster counter @@ -485,21 +482,13 @@ bool Halftoner::Process for (i=StartPlane; i <= EndPlane; i++) { - if (OutputWidth[i] > AdjustedInputWidth) - { - memset(tempBuffer, 0, OutputWidth[i]); // clear it out because outwidth might be - // > factor*inwidth due to roundoff - memcpy(tempBuffer,pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],InputWidth); - int factor = NumRows[i] * ResBoost; - PixelMultiply(tempBuffer, InputWidth, factor); - input=tempBuffer; - numpix = OutputWidth[i]; - } - else - { - input=pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR]; - numpix = AdjustedInputWidth; - } + memset(tempBuffer, 0, OutputWidth[i]); // clear it out because outwidth might be + // > factor*inwidth due to roundoff + memcpy(tempBuffer,pbyInputKRGBRaster->rasterdata[COLORTYPE_COLOR],InputWidth); + int factor = NumRows[i] * ResBoost; + PixelMultiply(tempBuffer, InputWidth, factor); + input=tempBuffer; + numpix = OutputWidth[i]; fDitherParms[i].fNumPix = numpix; fDitherParms[i].fInput = input; @@ -560,33 +549,20 @@ bool Halftoner::Process if (pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK]) { int factor = 1; - if (OutputWidth[K] > AdjustedInputWidth) - { - memset(tempBuffer, 0, OutputWidth[K]); - memcpy(tempBuffer,pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK],pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK]); + memset(tempBuffer, 0, OutputWidth[K]); + memcpy(tempBuffer,pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK],pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK]); - factor = NumRows[K] * ResBoost; - PixelMultiply(tempBuffer, pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK], factor); - } + factor = NumRows[K] * ResBoost; + PixelMultiply(tempBuffer, pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK], factor); // Convert 8bit per pixel data into 1 bit per pixel data memset(originalKData, 0, (pbyInputKRGBRaster->rastersize[COLORTYPE_BLACK] * factor +7)/8); int curBit = 0x80, curByte = 0; for (int i=0; irastersize[COLORTYPE_BLACK] * factor; i++) { - if (OutputWidth[K] > AdjustedInputWidth) - { - if (tempBuffer[i]) - { - originalKData[curByte] |= curBit; - } - } - else + if (tempBuffer[i]) { - if (pbyInputKRGBRaster->rasterdata[COLORTYPE_BLACK][i]) - { - originalKData[curByte] |= curBit; - } + originalKData[curByte] |= curBit; } if (curBit == 0x01) {