aboutsummaryrefslogtreecommitdiff
path: root/lib/libvgl/simple.c
diff options
context:
space:
mode:
authorBruce Evans <bde@FreeBSD.org>2019-03-25 11:48:40 +0000
committerBruce Evans <bde@FreeBSD.org>2019-03-25 11:48:40 +0000
commitdac776fdbf62cb279966fc06c22e652fc4365343 (patch)
tree0f550b2b051ca9deadce2d93c2bd028aeecb9bc5 /lib/libvgl/simple.c
parent2de5b9042014fd174cce0ef47d4c1cfee83fbf32 (diff)
downloadsrc-dac776fdbf62cb279966fc06c22e652fc4365343.tar.gz
src-dac776fdbf62cb279966fc06c22e652fc4365343.zip
Fix another type of buffer overrun for segmented modes. The buffer index
was not taken modulo the window size in VGLClear(). Segmented modes also need a kernel fix to almost work. The ioctl to set the window origin is broken. These bugs are rarely problems since non-VESA modes only need segmentation to support multiple pages but libvgl doesn't support multiple pages and treats these modes as non-segmented, and VESA modes are usually mapped linearly except on old hardware so they really are non-segmented.
Notes
Notes: svn path=/head/; revision=345496
Diffstat (limited to 'lib/libvgl/simple.c')
-rw-r--r--lib/libvgl/simple.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/libvgl/simple.c b/lib/libvgl/simple.c
index 0605bbadd2ba..070dad590edf 100644
--- a/lib/libvgl/simple.c
+++ b/lib/libvgl/simple.c
@@ -535,7 +535,8 @@ VGLClear(VGLBitmap *object, u_long color)
VGLSetSegment(offset);
len = min(total - offset, VGLAdpInfo.va_window_size);
for (i = 0; i < len; i += object->PixelBytes)
- bcopy(b, object->Bitmap + offset + i, object->PixelBytes);
+ bcopy(object->Bitmap + (offset + i) % VGLAdpInfo.va_window_size, b,
+ object->PixelBytes);
offset += len;
}
break;