62 lines
2.0 KiB
Diff
62 lines
2.0 KiB
Diff
From: Gerd Hoffmann <kraxel@redhat.com>
|
|
Date: Wed, 29 Oct 2014 12:56:08 +0100
|
|
Subject: [PATCH] vmware-vga: use vmsvga_verify_rect in vmsvga_update_rect
|
|
|
|
Switch vmsvga_update_rect over to use vmsvga_verify_rect. Slight change
|
|
in behavior: We don't try to automatically fixup rectangles any more.
|
|
In case we find invalid update requests we'll do a full-screen update
|
|
instead.
|
|
|
|
Cc: qemu-stable@nongnu.org
|
|
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
Reviewed-by: Don Koch <dkoch@verizon.com>
|
|
---
|
|
hw/display/vmware_vga.c | 32 ++++----------------------------
|
|
1 file changed, 4 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
|
|
index 7fc2b30..19c9bd3 100644
|
|
--- a/hw/display/vmware_vga.c
|
|
+++ b/hw/display/vmware_vga.c
|
|
@@ -354,36 +354,12 @@ static inline void vmsvga_update_rect(struct vmsvga_state_s *s,
|
|
uint8_t *src;
|
|
uint8_t *dst;
|
|
|
|
- if (x < 0) {
|
|
- fprintf(stderr, "%s: update x was < 0 (%d)\n", __func__, x);
|
|
- w += x;
|
|
+ if (!vmsvga_verify_rect(surface, __func__, x, y, w, h)) {
|
|
+ /* go for a fullscreen update as fallback */
|
|
x = 0;
|
|
- }
|
|
- if (w < 0) {
|
|
- fprintf(stderr, "%s: update w was < 0 (%d)\n", __func__, w);
|
|
- w = 0;
|
|
- }
|
|
- if (x + w > surface_width(surface)) {
|
|
- fprintf(stderr, "%s: update width too large x: %d, w: %d\n",
|
|
- __func__, x, w);
|
|
- x = MIN(x, surface_width(surface));
|
|
- w = surface_width(surface) - x;
|
|
- }
|
|
-
|
|
- if (y < 0) {
|
|
- fprintf(stderr, "%s: update y was < 0 (%d)\n", __func__, y);
|
|
- h += y;
|
|
y = 0;
|
|
- }
|
|
- if (h < 0) {
|
|
- fprintf(stderr, "%s: update h was < 0 (%d)\n", __func__, h);
|
|
- h = 0;
|
|
- }
|
|
- if (y + h > surface_height(surface)) {
|
|
- fprintf(stderr, "%s: update height too large y: %d, h: %d\n",
|
|
- __func__, y, h);
|
|
- y = MIN(y, surface_height(surface));
|
|
- h = surface_height(surface) - y;
|
|
+ w = surface_width(surface);
|
|
+ h = surface_height(surface);
|
|
}
|
|
|
|
bypl = surface_stride(surface);
|