| From: Piotr Pawliczek <pawliczek@chromium.org> |
| |
| Always use tempbuffer instead of the input buffer, even if numpix equals |
| AdjustedInputWidth, to prevent said input buffer from overflowing because |
| AdjustedInputWidth >= InputWidth. |
| |
| --- 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; i<pbyInputKRGBRaster->rastersize[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) |
| { |