Added checks to avoid writing past the end of the buffer in fbBltOne

(cherry picked from commit e5f54f122b)
This commit is contained in:
Ben Byer 2007-12-07 21:56:45 -08:00 committed by Jeremy Huddleston
parent c8161d482a
commit 24c54f53ff

View File

@ -57,6 +57,13 @@
bits = (src < srcEnd ? READ(src++) : 0); \ bits = (src < srcEnd ? READ(src++) : 0); \
} }
#define CHECK_BOUNDS(pointer, limit) \
if (dst > dstEnd) { \
ErrorF("WARNING: fbbltone tried to write over end of buffer (dst=%p dstEnd=%p)\n", \
dst, dstEnd); \
return; \
}
#ifndef FBNOPIXADDR #ifndef FBNOPIXADDR
#define LaneCases1(n,a) case n: (void)FbLaneCase(n,a); break #define LaneCases1(n,a) case n: (void)FbLaneCase(n,a); break
@ -148,7 +155,7 @@ fbBltOne (FbStip *src,
FbBits bgxor) FbBits bgxor)
{ {
const FbBits *fbBits; const FbBits *fbBits;
FbBits *srcEnd; FbBits *srcEnd, *dstEnd;
int pixelsPerDst; /* dst pixels per FbBits */ int pixelsPerDst; /* dst pixels per FbBits */
int unitsPerSrc; /* src patterns per FbStip */ int unitsPerSrc; /* src patterns per FbStip */
int leftShift, rightShift; /* align source with dest */ int leftShift, rightShift; /* align source with dest */
@ -181,9 +188,10 @@ fbBltOne (FbStip *src,
#endif #endif
/* /*
* Do not read past the end of the buffer! * Do not read or write past the end of the buffer!
*/ */
srcEnd = src + height * srcStride; srcEnd = src + height * srcStride;
dstEnd = dst + height * dstStride;
/* /*
* Number of destination units in FbBits == number of stipple pixels * Number of destination units in FbBits == number of stipple pixels
@ -296,6 +304,7 @@ fbBltOne (FbStip *src,
*/ */
if (startmask) if (startmask)
{ {
CHECK_BOUNDS(dst, dstEnd);
#if FB_UNIT > 32 #if FB_UNIT > 32
if (pixelsPerDst == 16) if (pixelsPerDst == 16)
mask = FbStipple16Bits(FbLeftStipBits(bits,16)); mask = FbStipple16Bits(FbLeftStipBits(bits,16));
@ -336,6 +345,7 @@ fbBltOne (FbStip *src,
else else
#endif #endif
mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)]; mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, FbOpaqueStipple (mask, fgxor, bgxor)); WRITE(dst, FbOpaqueStipple (mask, fgxor, bgxor));
dst++; dst++;
bits = FbStipLeft(bits, pixelsPerDst); bits = FbStipLeft(bits, pixelsPerDst);
@ -346,6 +356,7 @@ fbBltOne (FbStip *src,
#ifndef FBNOPIXADDR #ifndef FBNOPIXADDR
if (fbLane) if (fbLane)
{ {
CHECK_BOUNDS(dst, dstEnd);
while (bits && n) while (bits && n)
{ {
switch (fbLane[FbLeftStipBits(bits,pixelsPerDst)]) { switch (fbLane[FbLeftStipBits(bits,pixelsPerDst)]) {
@ -366,6 +377,7 @@ fbBltOne (FbStip *src,
if (left || !transparent) if (left || !transparent)
{ {
mask = fbBits[left]; mask = fbBits[left];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, FbStippleRRop (READ(dst), mask, WRITE(dst, FbStippleRRop (READ(dst), mask,
fgand, fgxor, bgand, bgxor)); fgand, fgxor, bgand, bgxor));
} }
@ -586,7 +598,7 @@ fbBltOne24 (FbStip *srcLine,
FbBits bgand, FbBits bgand,
FbBits bgxor) FbBits bgxor)
{ {
FbStip *src, *srcEnd; FbStip *src, *srcEnd, *dstEnd;
FbBits leftMask, rightMask, mask; FbBits leftMask, rightMask, mask;
int nlMiddle, nl; int nlMiddle, nl;
FbStip stip, bits; FbStip stip, bits;
@ -597,9 +609,10 @@ fbBltOne24 (FbStip *srcLine,
int nDst; int nDst;
/* /*
* Do not read past the end of the buffer! * Do not read or write past the end of the buffer!
*/ */
srcEnd = srcLine + height * srcStride; srcEnd = srcLine + height * srcStride;
dstEnd = dst + height * dstStride;
srcLine += srcX >> FB_STIP_SHIFT; srcLine += srcX >> FB_STIP_SHIFT;
dst += dstX >> FB_SHIFT; dst += dstX >> FB_SHIFT;
@ -629,6 +642,7 @@ fbBltOne24 (FbStip *srcLine,
if (leftMask) if (leftMask)
{ {
mask = fbStipple24Bits[rot >> 3][stip]; mask = fbStipple24Bits[rot >> 3][stip];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, (READ(dst) & ~leftMask) | WRITE(dst, (READ(dst) & ~leftMask) |
(FbOpaqueStipple (mask, (FbOpaqueStipple (mask,
FbRot24(fgxor, rot), FbRot24(fgxor, rot),
@ -641,6 +655,7 @@ fbBltOne24 (FbStip *srcLine,
while (nl--) while (nl--)
{ {
mask = fbStipple24Bits[rot>>3][stip]; mask = fbStipple24Bits[rot>>3][stip];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, FbOpaqueStipple (mask, WRITE(dst, FbOpaqueStipple (mask,
FbRot24(fgxor, rot), FbRot24(fgxor, rot),
FbRot24(bgxor, rot))); FbRot24(bgxor, rot)));
@ -650,6 +665,7 @@ fbBltOne24 (FbStip *srcLine,
if (rightMask) if (rightMask)
{ {
mask = fbStipple24Bits[rot >> 3][stip]; mask = fbStipple24Bits[rot >> 3][stip];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, (READ(dst) & ~rightMask) | WRITE(dst, (READ(dst) & ~rightMask) |
(FbOpaqueStipple (mask, (FbOpaqueStipple (mask,
FbRot24(fgxor, rot), FbRot24(fgxor, rot),
@ -674,7 +690,8 @@ fbBltOne24 (FbStip *srcLine,
if (stip) if (stip)
{ {
mask = fbStipple24Bits[rot >> 3][stip] & leftMask; mask = fbStipple24Bits[rot >> 3][stip] & leftMask;
WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask)); CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask));
} }
dst++; dst++;
fbNextStipBits (rot, stip); fbNextStipBits (rot, stip);
@ -685,6 +702,7 @@ fbBltOne24 (FbStip *srcLine,
if (stip) if (stip)
{ {
mask = fbStipple24Bits[rot>>3][stip]; mask = fbStipple24Bits[rot>>3][stip];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor,rot) & mask)); WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor,rot) & mask));
} }
dst++; dst++;
@ -695,6 +713,7 @@ fbBltOne24 (FbStip *srcLine,
if (stip) if (stip)
{ {
mask = fbStipple24Bits[rot >> 3][stip] & rightMask; mask = fbStipple24Bits[rot >> 3][stip] & rightMask;
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask)); WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask));
} }
} }
@ -712,6 +731,7 @@ fbBltOne24 (FbStip *srcLine,
if (leftMask) if (leftMask)
{ {
mask = fbStipple24Bits[rot >> 3][stip]; mask = fbStipple24Bits[rot >> 3][stip];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, FbStippleRRopMask (READ(dst), mask, WRITE(dst, FbStippleRRopMask (READ(dst), mask,
FbRot24(fgand, rot), FbRot24(fgand, rot),
FbRot24(fgxor, rot), FbRot24(fgxor, rot),
@ -725,6 +745,7 @@ fbBltOne24 (FbStip *srcLine,
while (nl--) while (nl--)
{ {
mask = fbStipple24Bits[rot >> 3][stip]; mask = fbStipple24Bits[rot >> 3][stip];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, FbStippleRRop (READ(dst), mask, WRITE(dst, FbStippleRRop (READ(dst), mask,
FbRot24(fgand, rot), FbRot24(fgand, rot),
FbRot24(fgxor, rot), FbRot24(fgxor, rot),
@ -736,6 +757,7 @@ fbBltOne24 (FbStip *srcLine,
if (rightMask) if (rightMask)
{ {
mask = fbStipple24Bits[rot >> 3][stip]; mask = fbStipple24Bits[rot >> 3][stip];
CHECK_BOUNDS(dst, dstEnd);
WRITE(dst, FbStippleRRopMask (READ(dst), mask, WRITE(dst, FbStippleRRopMask (READ(dst), mask,
FbRot24(fgand, rot), FbRot24(fgand, rot),
FbRot24(fgxor, rot), FbRot24(fgxor, rot),