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

Reply via email to