mirror of https://gitee.com/openkylin/qemu.git
Check for out of range update regions (original patch from Anthony Liguori).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4024 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
3016d80bff
commit
a8fbaf96e0
|
@ -291,12 +291,33 @@ static inline void vmsvga_update_rect(struct vmsvga_state_s *s,
|
|||
int x, int y, int w, int h)
|
||||
{
|
||||
#ifndef DIRECT_VRAM
|
||||
int line = h;
|
||||
int bypl = s->bypp * s->width;
|
||||
int width = s->bypp * w;
|
||||
int start = s->bypp * x + bypl * y;
|
||||
uint8_t *src = s->vram + start;
|
||||
uint8_t *dst = s->ds->data + start;
|
||||
int line;
|
||||
int bypl;
|
||||
int width;
|
||||
int start;
|
||||
uint8_t *src;
|
||||
uint8_t *dst;
|
||||
|
||||
if (x + w > s->width) {
|
||||
fprintf(stderr, "%s: update width too large x: %d, w: %d\n",
|
||||
__FUNCTION__, x, w);
|
||||
x = MIN(x, s->width);
|
||||
w = s->width - x;
|
||||
}
|
||||
|
||||
if (y + h > s->height) {
|
||||
fprintf(stderr, "%s: update height too large y: %d, h: %d\n",
|
||||
__FUNCTION__, y, h);
|
||||
y = MIN(y, s->height);
|
||||
h = s->height - y;
|
||||
}
|
||||
|
||||
line = h;
|
||||
bypl = s->bypp * s->width;
|
||||
width = s->bypp * w;
|
||||
start = s->bypp * x + bypl * y;
|
||||
src = s->vram + start;
|
||||
dst = s->ds->data + start;
|
||||
|
||||
for (; line > 0; line --, src += bypl, dst += bypl)
|
||||
memcpy(dst, src, width);
|
||||
|
|
Loading…
Reference in New Issue