mirror of https://gitee.com/openkylin/qemu.git
cirrus: add blit_is_unsafe call to cirrus_bitblt_cputovideo (CVE-2017-2620)
CIRRUS_BLTMODE_MEMSYSSRC blits do NOT check blit destination and blit width, at all. Oops. Fix it. Security impact: high. The missing blit destination check allows to write to host memory. Basically same as CVE-2014-8106 for the other blit variants. Cc: qemu-stable@nongnu.org Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
10f25e4844
commit
92f2b88cea
|
@ -900,6 +900,10 @@ static int cirrus_bitblt_cputovideo(CirrusVGAState * s)
|
||||||
{
|
{
|
||||||
int w;
|
int w;
|
||||||
|
|
||||||
|
if (blit_is_unsafe(s, true)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
s->cirrus_blt_mode &= ~CIRRUS_BLTMODE_MEMSYSSRC;
|
s->cirrus_blt_mode &= ~CIRRUS_BLTMODE_MEMSYSSRC;
|
||||||
s->cirrus_srcptr = &s->cirrus_bltbuf[0];
|
s->cirrus_srcptr = &s->cirrus_bltbuf[0];
|
||||||
s->cirrus_srcptr_end = &s->cirrus_bltbuf[0];
|
s->cirrus_srcptr_end = &s->cirrus_bltbuf[0];
|
||||||
|
@ -925,6 +929,10 @@ static int cirrus_bitblt_cputovideo(CirrusVGAState * s)
|
||||||
}
|
}
|
||||||
s->cirrus_srccounter = s->cirrus_blt_srcpitch * s->cirrus_blt_height;
|
s->cirrus_srccounter = s->cirrus_blt_srcpitch * s->cirrus_blt_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* the blit_is_unsafe call above should catch this */
|
||||||
|
assert(s->cirrus_blt_srcpitch <= CIRRUS_BLTBUFSIZE);
|
||||||
|
|
||||||
s->cirrus_srcptr = s->cirrus_bltbuf;
|
s->cirrus_srcptr = s->cirrus_bltbuf;
|
||||||
s->cirrus_srcptr_end = s->cirrus_bltbuf + s->cirrus_blt_srcpitch;
|
s->cirrus_srcptr_end = s->cirrus_bltbuf + s->cirrus_blt_srcpitch;
|
||||||
cirrus_update_memory_access(s);
|
cirrus_update_memory_access(s);
|
||||||
|
|
Loading…
Reference in New Issue