Revision: 4227
http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4227&view=rev
Author: ossman_
Date: 2010-12-21 15:53:42 +0000 (Tue, 21 Dec 2010)
Log Message:
-----------
Add extra check for bad copy rects and try to handle it gracefully instead of
just crashing.
Modified Paths:
--------------
trunk/common/rfb/PixelBuffer.cxx
Modified: trunk/common/rfb/PixelBuffer.cxx
===================================================================
--- trunk/common/rfb/PixelBuffer.cxx 2010-12-13 11:27:06 UTC (rev 4226)
+++ trunk/common/rfb/PixelBuffer.cxx 2010-12-21 15:53:42 UTC (rev 4227)
@@ -225,25 +225,48 @@
void FullFramePixelBuffer::copyRect(const Rect &rect, const Point
&move_by_delta) {
int stride;
- U8* data = getPixelsRW(getRect(), &stride);
- // We assume that the specified rectangle is pre-clipped to the buffer
+ U8* data;
unsigned int bytesPerPixel, bytesPerRow, bytesPerMemCpy;
- Rect srect = rect.translate(move_by_delta.negate());
+ Rect drect, srect = rect.translate(move_by_delta.negate());
+
+ drect = rect;
+ if (!drect.enclosed_by(getRect())) {
+ vlog.error("Destination rect %dx%d at %d,%d exceeds framebuffer %dx%d",
+ drect.width(), drect.height(), drect.tl.x, drect.tl.y, width_,
height_);
+ drect = drect.intersect(getRect());
+ }
+
+ if (drect.is_empty())
+ return;
+
+ srect = drect.translate(move_by_delta.negate());
+ if (!srect.enclosed_by(getRect())) {
+ vlog.error("Source rect %dx%d at %d,%d exceeds framebuffer %dx%d",
+ srect.width(), srect.height(), srect.tl.x, srect.tl.y, width_,
height_);
+ srect = srect.intersect(getRect());
+ // Need to readjust the destination now that the area has changed
+ drect = srect.translate(move_by_delta);
+ }
+
+ if (srect.is_empty())
+ return;
+
+ data = getPixelsRW(getRect(), &stride);
bytesPerPixel = getPF().bpp/8;
bytesPerRow = stride * bytesPerPixel;
- bytesPerMemCpy = rect.width() * bytesPerPixel;
+ bytesPerMemCpy = drect.width() * bytesPerPixel;
if (move_by_delta.y <= 0) {
- U8* dest = data + rect.tl.x*bytesPerPixel + rect.tl.y*bytesPerRow;
+ U8* dest = data + drect.tl.x*bytesPerPixel + drect.tl.y*bytesPerRow;
U8* src = data + srect.tl.x*bytesPerPixel + srect.tl.y*bytesPerRow;
- for (int i=rect.tl.y; i<rect.br.y; i++) {
+ for (int i=drect.tl.y; i<drect.br.y; i++) {
memmove(dest, src, bytesPerMemCpy);
dest += bytesPerRow;
src += bytesPerRow;
}
} else {
- U8* dest = data + rect.tl.x*bytesPerPixel + (rect.br.y-1)*bytesPerRow;
+ U8* dest = data + drect.tl.x*bytesPerPixel + (drect.br.y-1)*bytesPerRow;
U8* src = data + srect.tl.x*bytesPerPixel + (srect.br.y-1)*bytesPerRow;
- for (int i=rect.tl.y; i<rect.br.y; i++) {
+ for (int i=drect.tl.y; i<drect.br.y; i++) {
memmove(dest, src, bytesPerMemCpy);
dest -= bytesPerRow;
src -= bytesPerRow;
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Forrester recently released a report on the Return on Investment (ROI) of
Google Apps. They found a 300% ROI, 38%-56% cost savings, and break-even
within 7 months. Over 3 million businesses have gone Google with Google Apps:
an online email calendar, and document program that's accessible from your
browser. Read the Forrester report: http://p.sf.net/sfu/googleapps-sfnew
_______________________________________________
Tigervnc-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits