From nobody Mon Feb 9 08:57:38 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1486973973016867.417905683709; Mon, 13 Feb 2017 00:19:33 -0800 (PST) Received: from localhost ([::1]:55067 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdBr9-0005mZ-NK for importer@patchew.org; Mon, 13 Feb 2017 03:19:31 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54356) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdBpR-0004vd-Ea for qemu-devel@nongnu.org; Mon, 13 Feb 2017 03:17:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdBpN-0004br-MQ for qemu-devel@nongnu.org; Mon, 13 Feb 2017 03:17:44 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36030) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdBpN-0004ae-EL for qemu-devel@nongnu.org; Mon, 13 Feb 2017 03:17:41 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A373C4E4C7; Mon, 13 Feb 2017 08:17:41 +0000 (UTC) Received: from nilsson.home.kraxel.org (ovpn-116-154.ams2.redhat.com [10.36.116.154]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1D8He3w016605; Mon, 13 Feb 2017 03:17:40 -0500 Received: by nilsson.home.kraxel.org (Postfix, from userid 500) id 2623680FCB; Mon, 13 Feb 2017 09:17:37 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Mon, 13 Feb 2017 09:17:30 +0100 Message-Id: <1486973851-21645-6-git-send-email-kraxel@redhat.com> In-Reply-To: <1486973851-21645-1-git-send-email-kraxel@redhat.com> References: <1486973851-21645-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 13 Feb 2017 08:17:41 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 5/6] cirrus: fix patterncopy checks X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Wolfgang Bumiller , Gerd Hoffmann , "Dr. David Alan Gilbert" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The blit_region_is_unsafe checks don't work correctly for the patterncopy source. It's a fixed-sized region, which doesn't depend on cirrus_blt_{width,height}. So go do the check in cirrus_bitblt_common_patterncopy instead, then tell blit_is_unsafe that it doesn't need to verify the source. Also handle the case where we blit from cirrus_bitbuf correctly. This patch replaces 5858dd1801883309bdd208d72ddb81c4e9fee30c. Security impact: I think for the most part error on the safe side this time, refusing blits which should have been allowed. Only exception is placing the blit source at the end of the video ram, so cirrus_blt_srcaddr + 256 goes beyond the end of video memory. But even in that case I'm not fully sure this actually allows read access to host memory. To trick the commit 5858dd18 security checks one has to pick very small cirrus_blt_{width,height} values, which in turn implies only a fraction of the blit source will actually be used. Cc: Wolfgang Bumiller Cc: Dr. David Alan Gilbert Signed-off-by: Gerd Hoffmann Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Wolfgang Bumiller Reviewed-by: Laurent Vivier Message-id: 1486645341-5010-1-git-send-email-kraxel@redhat.com --- hw/display/cirrus_vga.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index b272a70..1bcf9a4 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -684,14 +684,39 @@ static void cirrus_invalidate_region(CirrusVGAState *= s, int off_begin, } } =20 -static int cirrus_bitblt_common_patterncopy(CirrusVGAState * s, - const uint8_t * src) +static int cirrus_bitblt_common_patterncopy(CirrusVGAState *s, bool videos= rc) { + uint32_t patternsize; uint8_t *dst; + uint8_t *src; =20 dst =3D s->vga.vram_ptr + s->cirrus_blt_dstaddr; =20 - if (blit_is_unsafe(s, false, true)) { + if (videosrc) { + switch (s->vga.get_bpp(&s->vga)) { + case 8: + patternsize =3D 64; + break; + case 15: + case 16: + patternsize =3D 128; + break; + case 24: + case 32: + default: + patternsize =3D 256; + break; + } + s->cirrus_blt_srcaddr &=3D ~(patternsize - 1); + if (s->cirrus_blt_srcaddr + patternsize > s->vga.vram_size) { + return 0; + } + src =3D s->vga.vram_ptr + s->cirrus_blt_srcaddr; + } else { + src =3D s->cirrus_bltbuf; + } + + if (blit_is_unsafe(s, true, true)) { return 0; } =20 @@ -732,8 +757,7 @@ static int cirrus_bitblt_solidfill(CirrusVGAState *s, i= nt blt_rop) =20 static int cirrus_bitblt_videotovideo_patterncopy(CirrusVGAState * s) { - return cirrus_bitblt_common_patterncopy(s, s->vga.vram_ptr + - (s->cirrus_blt_srcaddr & ~7)); + return cirrus_bitblt_common_patterncopy(s, true); } =20 static int cirrus_do_copy(CirrusVGAState *s, int dst, int src, int w, int = h) @@ -832,7 +856,7 @@ static void cirrus_bitblt_cputovideo_next(CirrusVGAStat= e * s) =20 if (s->cirrus_srccounter > 0) { if (s->cirrus_blt_mode & CIRRUS_BLTMODE_PATTERNCOPY) { - cirrus_bitblt_common_patterncopy(s, s->cirrus_bltbuf); + cirrus_bitblt_common_patterncopy(s, false); the_end: s->cirrus_srccounter =3D 0; cirrus_bitblt_reset(s); --=20 1.8.3.1