aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorMichal Srb <michalsrb@gmail.com>2017-01-13 16:32:23 +0200
committerMichal Srb <michalsrb@gmail.com>2017-01-17 16:47:50 +0200
commit18c020124ff1b2441f714da2017f63dba50720ba (patch)
treed7dd2287a4d329b6a2ac2c9f22823520bac515d2 /common
parent0f626ad79a1259904db70f12ba1682910d9155c8 (diff)
downloadtigervnc-18c020124ff1b2441f714da2017f63dba50720ba.tar.gz
tigervnc-18c020124ff1b2441f714da2017f63dba50720ba.zip
Fix buffer overflow in ModifiablePixelBuffer::fillRect.
It can be triggered by RRE message with subrectangle out of framebuffer boundaries. It may prevent the same kind of issue caused by evil message from another encoding too.
Diffstat (limited to 'common')
-rw-r--r--common/rfb/PixelBuffer.cxx19
1 files changed, 15 insertions, 4 deletions
diff --git a/common/rfb/PixelBuffer.cxx b/common/rfb/PixelBuffer.cxx
index 89addabc..7f3df6cb 100644
--- a/common/rfb/PixelBuffer.cxx
+++ b/common/rfb/PixelBuffer.cxx
@@ -101,15 +101,26 @@ void ModifiablePixelBuffer::fillRect(const Rect& r, const void* pix)
int stride;
U8 *buf;
int w, h, b;
+ Rect drect;
- w = r.width();
- h = r.height();
+ drect = r;
+ 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;
+
+ w = drect.width();
+ h = drect.height();
b = format.bpp/8;
if (h == 0)
return;
- buf = getBufferRW(r, &stride);
+ buf = getBufferRW(drect, &stride);
if (b == 1) {
while (h--) {
@@ -136,7 +147,7 @@ void ModifiablePixelBuffer::fillRect(const Rect& r, const void* pix)
}
}
- commitBufferRW(r);
+ commitBufferRW(drect);
}
void ModifiablePixelBuffer::imageRect(const Rect& r,