On Thu, 8 Nov 2012, Gerd Hoffmann wrote:
I think this is fixing this at the wrong level. Either we
should require that drivers (in this case vmware_vga.c)
must not call dpy_gfx_update() with out of range values,
or we should do the clipping in the console.c layer, but
I don't think requiring every UI backend to clip is the
right thing. Anthony?

Agree.  IMHO vmware_vga.c is at fault here and should be fixed.  We can
add some asserts to console.[ch] to enforce this ...

Would the attached patch help?

Regards,
BALATON Zoltan
From e1ea12f3fa70298f630c0b829d0f304339ca9799 Mon Sep 17 00:00:00 2001
From: BALATON Zoltan <bala...@eik.bme.hu>
Date: Fri, 9 Nov 2012 00:44:29 +0100
Subject: [PATCH 2/2] vmware_vga: Clip updates with negative out of range
 rects to visible area

Added checks and clipping also for negative out of range values in
update rects which have been seen to happen at least with VNC under
Windows NT 4.0 when a window is outside the visible area.

Signed-off-by: BALATON Zoltan <bala...@eik.bme.hu>
---
 hw/vmware_vga.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c
index 834588d..e59ab3a 100644
--- a/hw/vmware_vga.c
+++ b/hw/vmware_vga.c
@@ -296,6 +296,14 @@ static inline void vmsvga_update_rect(struct 
vmsvga_state_s *s,
     uint8_t *src;
     uint8_t *dst;
 
+    if (x < 0 || x + w < 0) {
+        fprintf(stderr, "%s: update negative x position: %d, w: %d\n",
+                __func__, x, w);
+        w -= x;
+        x = MAX(x, 0);
+        y = MAX(w, 0);
+    }
+
     if (x + w > ds_get_width(s->vga.ds)) {
         fprintf(stderr, "%s: update width too large x: %d, w: %d\n",
                 __func__, x, w);
@@ -303,6 +311,14 @@ static inline void vmsvga_update_rect(struct 
vmsvga_state_s *s,
         w = ds_get_width(s->vga.ds) - x;
     }
 
+    if (y < 0 || y + h < 0) {
+        fprintf(stderr, "%s: update negative y position: %d, h: %d\n",
+                __func__, y, h);
+        h -= y;
+        y = MAX(y, 0);
+        h = MAX(h, 0);
+    }
+
     if (y + h > ds_get_height(s->vga.ds)) {
         fprintf(stderr, "%s: update height too large y: %d, h: %d\n",
                 __func__, y, h);
-- 
1.7.10

Reply via email to