9ae3a8
From 8c2d53ffb72c574d0c81e2c86115a18598e66c65 Mon Sep 17 00:00:00 2001
9ae3a8
From: Gerd Hoffmann <kraxel@redhat.com>
9ae3a8
Date: Wed, 22 Feb 2017 12:36:26 +0100
9ae3a8
Subject: [PATCH 08/24] vnc: fix overflow in vnc_update_stats
9ae3a8
MIME-Version: 1.0
9ae3a8
Content-Type: text/plain; charset=UTF-8
9ae3a8
Content-Transfer-Encoding: 8bit
9ae3a8
9ae3a8
RH-Author: Gerd Hoffmann <kraxel@redhat.com>
9ae3a8
Message-id: <1487766986-6329-9-git-send-email-kraxel@redhat.com>
9ae3a8
Patchwork-id: 73975
9ae3a8
O-Subject: [RHEL-7.4 qemu-kvm PATCH 8/8] vnc: fix overflow in vnc_update_stats
9ae3a8
Bugzilla: 1377977
9ae3a8
RH-Acked-by: Thomas Huth <thuth@redhat.com>
9ae3a8
RH-Acked-by: Marc-André Lureau <mlureau@redhat.com>
9ae3a8
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
9ae3a8
9ae3a8
Commit "bea60dd ui/vnc: fix potential memory corruption issues" is
9ae3a8
incomplete.  vnc_update_stats must calculate width and height the same
9ae3a8
way vnc_refresh_server_surface does it, to make sure we don't use width
9ae3a8
and height values larger than the qemu vnc server can handle.
9ae3a8
9ae3a8
Commit "e22492d ui/vnc: disable adaptive update calculations if not
9ae3a8
needed" masks the issue in the default configuration.  It triggers only
9ae3a8
in case the "lossy" option is set to "on" (default is "off").
9ae3a8
9ae3a8
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
9ae3a8
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
9ae3a8
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
9ae3a8
Message-id: 1485248428-575-1-git-send-email-kraxel@redhat.com
9ae3a8
(cherry picked from commit eebe0b7905642a986cbce7406d6ab7bf78f3e210)
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 ui/vnc.c | 6 ++++--
9ae3a8
 1 file changed, 4 insertions(+), 2 deletions(-)
9ae3a8
9ae3a8
diff --git a/ui/vnc.c b/ui/vnc.c
9ae3a8
index d0ada7e..b68918e 100644
9ae3a8
--- a/ui/vnc.c
9ae3a8
+++ b/ui/vnc.c
9ae3a8
@@ -2581,8 +2581,10 @@ static int vnc_refresh_lossy_rect(VncDisplay *vd, int x, int y)
9ae3a8
 
9ae3a8
 static int vnc_update_stats(VncDisplay *vd,  struct timeval * tv)
9ae3a8
 {
9ae3a8
-    int width = pixman_image_get_width(vd->guest.fb);
9ae3a8
-    int height = pixman_image_get_height(vd->guest.fb);
9ae3a8
+    int width = MIN(pixman_image_get_width(vd->guest.fb),
9ae3a8
+                    pixman_image_get_width(vd->server));
9ae3a8
+    int height = MIN(pixman_image_get_height(vd->guest.fb),
9ae3a8
+                     pixman_image_get_height(vd->server));
9ae3a8
     int x, y;
9ae3a8
     struct timeval res;
9ae3a8
     int has_dirty = 0;
9ae3a8
-- 
9ae3a8
1.8.3.1
9ae3a8