summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Schubert <2@0x2c.org>2012-08-12 09:40:16 -0700
committerJeremy Huddleston Sequoia <jeremyhu@apple.com>2012-08-19 08:49:28 -0700
commit3e62f48edf47a59d923ac58b6d4262b02456a556 (patch)
treefe19cfd51370a6cf6fbce57bfa0e546e02fdf592
parentf0823a057e4c80dbb18c16f066ad36e6459fcc85 (diff)
fb: reorder Bresenham error correction to avoid overshoot.
When fbBresSolid draws a line, it can happen that after the last pixel, the Bresenham error term overflows, and fbBresSolid paints another pixel before adjusting the error term. However, if this happens on the last pixel (len=0), this extra pixel might overshoot the boundary, and, in rare cases, lead to a segfault. Fix this issue by adjusting for the Bresenham error term before drawing the main pixel, not after. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=24274 Signed-off-by: Simon Schubert <2@0x2c.or> Tested-by: Mitch Davis <mjd+freedesktop.org@afork.com> Signed-off-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Keith Packard <keithp@keithp.com> (cherry picked from commit 863d528a9f76d0e8f122aebf19f8564a4c67a938)
-rw-r--r--fb/fbseg.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/fb/fbseg.c b/fb/fbseg.c
index 0e4e0a9f7..1848387f6 100644
--- a/fb/fbseg.c
+++ b/fb/fbseg.c
@@ -65,6 +65,12 @@ fbBresSolid(DrawablePtr pDrawable,
if (axis == X_AXIS) {
bits = 0;
while (len--) {
+ if (e >= 0) {
+ WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
+ bits = 0;
+ dst += dstStride;
+ e += e3;
+ }
bits |= mask;
mask = fbBresShiftMask(mask, signdx, dstBpp);
if (!mask) {
@@ -74,21 +80,12 @@ fbBresSolid(DrawablePtr pDrawable,
mask = mask0;
}
e += e1;
- if (e >= 0) {
- WRITE(dst, FbDoMaskRRop(READ(dst), and, xor, bits));
- bits = 0;
- dst += dstStride;
- e += e3;
- }
}
if (bits)
WRITE(dst, FbDoMaskRRop(READ(dst), and, xor, bits));
}
else {
while (len--) {
- WRITE(dst, FbDoMaskRRop(READ(dst), and, xor, mask));
- dst += dstStride;
- e += e1;
if (e >= 0) {
e += e3;
mask = fbBresShiftMask(mask, signdx, dstBpp);
@@ -97,6 +94,9 @@ fbBresSolid(DrawablePtr pDrawable,
mask = mask0;
}
}
+ WRITE(dst, FbDoMaskRRop(READ(dst), and, xor, mask));
+ dst += dstStride;
+ e += e1;
}
}