[Pkg-xen-changes] r462 - in branches/etch/xen-3.0/debian: . patches

Bastian Blank waldi at alioth.debian.org
Thu Oct 4 07:02:42 UTC 2007


Author: waldi
Date: Thu Oct  4 07:02:42 2007
New Revision: 462

Log:
* debian/changelog, debian/patches/00list: Update.
* debian/patches/CVE-2007-1320.dpatch: Add.


Added:
   branches/etch/xen-3.0/debian/patches/CVE-2007-1320.dpatch   (contents, props changed)
Modified:
   branches/etch/xen-3.0/debian/changelog
   branches/etch/xen-3.0/debian/patches/00list

Modified: branches/etch/xen-3.0/debian/changelog
==============================================================================
--- branches/etch/xen-3.0/debian/changelog	(original)
+++ branches/etch/xen-3.0/debian/changelog	Thu Oct  4 07:02:42 2007
@@ -3,8 +3,11 @@
   * Use linux-support-2.6.18-5.
   * Don't use exec with untrusted values in pygrub. (closes: #444430)
     See CVE-2007-4993.
+  * Add bounds checks for cirrus bitblit memory accesses in qemu.
+    (closes: #444007)
+    See CVE-2007-1320.
 
- -- Bastian Blank <waldi at debian.org>  Thu, 04 Oct 2007 08:56:22 +0200
+ -- Bastian Blank <waldi at debian.org>  Thu, 04 Oct 2007 09:01:09 +0200
 
 xen-3.0 (3.0.3-0-2) unstable; urgency=medium
 

Modified: branches/etch/xen-3.0/debian/patches/00list
==============================================================================
--- branches/etch/xen-3.0/debian/patches/00list	(original)
+++ branches/etch/xen-3.0/debian/patches/00list	Thu Oct  4 07:02:42 2007
@@ -9,3 +9,4 @@
 path-relative
 not-reinvent-udev
 CVE-2007-4993
+CVE-2007-1320

Added: branches/etch/xen-3.0/debian/patches/CVE-2007-1320.dpatch
==============================================================================
--- (empty file)
+++ branches/etch/xen-3.0/debian/patches/CVE-2007-1320.dpatch	Thu Oct  4 07:02:42 2007
@@ -0,0 +1,365 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+
+ at DPATCH@
+diff -r a99093e602c6 -r 9e86260b95a4 tools/ioemu/hw/cirrus_vga.c
+--- a/tools/ioemu/hw/cirrus_vga.c	Tue Apr 24 16:52:15 2007 +0100
++++ b/tools/ioemu/hw/cirrus_vga.c	Tue Apr 24 17:02:07 2007 +0100
+@@ -601,7 +601,8 @@ static void cirrus_invalidate_region(Cir
+ 	off_cur_end = off_cur + bytesperline;
+ 	off_cur &= TARGET_PAGE_MASK;
+ 	while (off_cur < off_cur_end) {
+-	    cpu_physical_memory_set_dirty(s->vram_offset + off_cur);
++	    cpu_physical_memory_set_dirty(s->vram_offset +
++					  (off_cur & s->cirrus_addr_mask));
+ 	    off_cur += TARGET_PAGE_SIZE;
+ 	}
+ 	off_begin += off_pitch;
+diff -r a99093e602c6 -r 9e86260b95a4 tools/ioemu/hw/cirrus_vga_rop.h
+--- a/tools/ioemu/hw/cirrus_vga_rop.h	Tue Apr 24 16:52:15 2007 +0100
++++ b/tools/ioemu/hw/cirrus_vga_rop.h	Tue Apr 24 17:02:07 2007 +0100
+@@ -22,18 +22,36 @@
+  * THE SOFTWARE.
+  */
+ 
++#define get_base(p, s, b) do { \
++    if ((p) >= (s)->vram_ptr && (p) < (s)->vram_ptr + (s)->vram_size) \
++	(b) = (s)->vram_ptr; \
++    else if ((p) >= &(s)->cirrus_bltbuf[0] && \
++	     (p) < &(s)->cirrus_bltbuf[CIRRUS_BLTBUFSIZE]) \
++	(b) = &(s)->cirrus_bltbuf[0]; \
++    else \
++	return; \
++} while(0)
++
++#define m(x) ((x) & s->cirrus_addr_mask)
++
+ static void
+ glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(CirrusVGAState *s,
+-                             uint8_t *dst,const uint8_t *src,
++                             uint8_t *dst_,const uint8_t *src_,
+                              int dstpitch,int srcpitch,
+                              int bltwidth,int bltheight)
+ {
+     int x,y;
++    uint32_t dst, src;
++    uint8_t *dst_base, *src_base;
++    get_base(dst_, s, dst_base);
++    get_base(src_, s, src_base);
++    dst = dst_ - dst_base;
++    src = src_ - src_base;
+     dstpitch -= bltwidth;
+     srcpitch -= bltwidth;
+     for (y = 0; y < bltheight; y++) {
+         for (x = 0; x < bltwidth; x++) {
+-            ROP_OP(*dst, *src);
++            ROP_OP(*(dst_base + m(dst)), *(src_base + m(src)));
+             dst++;
+             src++;
+         }
+@@ -44,16 +62,22 @@ glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(C
+ 
+ static void
+ glue(cirrus_bitblt_rop_bkwd_, ROP_NAME)(CirrusVGAState *s,
+-                                        uint8_t *dst,const uint8_t *src,
++                                        uint8_t *dst_,const uint8_t *src_,
+                                         int dstpitch,int srcpitch,
+                                         int bltwidth,int bltheight)
+ {
+     int x,y;
++    uint32_t dst, src;
++    uint8_t *dst_base, *src_base;
++    get_base(dst_, s, dst_base);
++    get_base(src_, s, src_base);
++    dst = dst_ - dst_base;
++    src = src_ - src_base;
+     dstpitch += bltwidth;
+     srcpitch += bltwidth;
+     for (y = 0; y < bltheight; y++) {
+         for (x = 0; x < bltwidth; x++) {
+-            ROP_OP(*dst, *src);
++            ROP_OP(*(dst_base + m(dst)), *(src_base + m(src)));
+             dst--;
+             src--;
+         }
+@@ -76,3 +100,6 @@ glue(cirrus_bitblt_rop_bkwd_, ROP_NAME)(
+ 
+ #undef ROP_NAME
+ #undef ROP_OP
++
++#undef get_base
++#undef m
+diff -r a99093e602c6 -r 9e86260b95a4 tools/ioemu/hw/cirrus_vga_rop2.h
+--- a/tools/ioemu/hw/cirrus_vga_rop2.h	Tue Apr 24 16:52:15 2007 +0100
++++ b/tools/ioemu/hw/cirrus_vga_rop2.h	Tue Apr 24 17:02:07 2007 +0100
+@@ -23,36 +23,42 @@
+  */
+ 
+ #if DEPTH == 8
+-#define PUTPIXEL()    ROP_OP(d[0], col)
++#define PUTPIXEL()    ROP_OP((dst_base + m(d))[0], col)
+ #elif DEPTH == 16
+-#define PUTPIXEL()    ROP_OP(((uint16_t *)d)[0], col);
++#define PUTPIXEL()    ROP_OP(((uint16_t *)(dst_base + m(d)))[0], col);
+ #elif DEPTH == 24
+-#define PUTPIXEL()    ROP_OP(d[0], col); \
+-                      ROP_OP(d[1], (col >> 8)); \
+-                      ROP_OP(d[2], (col >> 16))
++#define PUTPIXEL()    ROP_OP((dst_base + m(d))[0], col); \
++                      ROP_OP((dst_base + m(d))[1], (col >> 8)); \
++                      ROP_OP((dst_base + m(d))[2], (col >> 16))
+ #elif DEPTH == 32
+-#define PUTPIXEL()    ROP_OP(((uint32_t *)d)[0], col)
++#define PUTPIXEL()    ROP_OP(((uint32_t *)(dst_base + m(d)))[0], col)
+ #else
+ #error unsupported DEPTH
+ #endif                
+ 
+ static void
+ glue(glue(glue(cirrus_patternfill_, ROP_NAME), _),DEPTH)
+-     (CirrusVGAState * s, uint8_t * dst,
+-      const uint8_t * src, 
+-      int dstpitch, int srcpitch, 
+-      int bltwidth, int bltheight)
+-{
+-    uint8_t *d;
++     (CirrusVGAState * s, uint8_t * dst_,
++      const uint8_t * src_, 
++      int dstpitch, int srcpitch, 
++      int bltwidth, int bltheight)
++{
++    uint8_t *dst_base, *src_base;
++    uint32_t src, dst;
++    uint32_t d;
+     int x, y, pattern_y, pattern_pitch, pattern_x;
+     unsigned int col;
+-    const uint8_t *src1;
++    uint32_t src1;
+ #if DEPTH == 24
+     int skipleft = s->gr[0x2f] & 0x1f;
+ #else
+     int skipleft = (s->gr[0x2f] & 0x07) * (DEPTH / 8);
+ #endif
+ 
++    get_base(dst_, s, dst_base);
++    get_base(src_, s, src_base);
++    dst = dst_ - dst_base;
++    src = src_ - src_base;
+ #if DEPTH == 8
+     pattern_pitch = 8;
+ #elif DEPTH == 16
+@@ -67,19 +73,19 @@ glue(glue(glue(cirrus_patternfill_, ROP_
+         src1 = src + pattern_y * pattern_pitch;
+         for (x = skipleft; x < bltwidth; x += (DEPTH / 8)) {
+ #if DEPTH == 8
+-            col = src1[pattern_x];
++            col = *(src_base + m(src1 + pattern_x));
+             pattern_x = (pattern_x + 1) & 7;
+ #elif DEPTH == 16
+-            col = ((uint16_t *)(src1 + pattern_x))[0];
++            col = *(uint16_t *)(src_base + m(src1 + pattern_x));
+             pattern_x = (pattern_x + 2) & 15;
+ #elif DEPTH == 24
+             {
+-                const uint8_t *src2 = src1 + pattern_x * 3;
++                const uint8_t *src2 = src_base + m(src1 + pattern_x * 3);
+                 col = src2[0] | (src2[1] << 8) | (src2[2] << 16);
+                 pattern_x = (pattern_x + 1) & 7;
+             }
+ #else
+-            col = ((uint32_t *)(src1 + pattern_x))[0];
++            col = *(uint32_t *)(src_base + m(src1 + pattern_x));
+             pattern_x = (pattern_x + 4) & 31;
+ #endif
+             PUTPIXEL();
+@@ -93,12 +99,14 @@ glue(glue(glue(cirrus_patternfill_, ROP_
+ /* NOTE: srcpitch is ignored */
+ static void
+ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH)
+-     (CirrusVGAState * s, uint8_t * dst,
+-      const uint8_t * src, 
+-      int dstpitch, int srcpitch, 
+-      int bltwidth, int bltheight)
+-{
+-    uint8_t *d;
++     (CirrusVGAState * s, uint8_t * dst_,
++      const uint8_t * src_, 
++      int dstpitch, int srcpitch, 
++      int bltwidth, int bltheight)
++{
++    uint8_t *dst_base, *src_base;
++    uint32_t src, dst;
++    uint32_t d;
+     int x, y;
+     unsigned bits, bits_xor;
+     unsigned int col;
+@@ -112,6 +120,10 @@ glue(glue(glue(cirrus_colorexpand_transp
+     int dstskipleft = srcskipleft * (DEPTH / 8);
+ #endif
+ 
++    get_base(dst_, s, dst_base);
++    get_base(src_, s, src_base);
++    dst = dst_ - dst_base;
++    src = src_ - src_base;
+     if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) {
+         bits_xor = 0xff;
+         col = s->cirrus_blt_bgcol;
+@@ -122,12 +134,12 @@ glue(glue(glue(cirrus_colorexpand_transp
+ 
+     for(y = 0; y < bltheight; y++) {
+         bitmask = 0x80 >> srcskipleft;
+-        bits = *src++ ^ bits_xor;
++        bits = *(src_base + m(src++)) ^ bits_xor;
+         d = dst + dstskipleft;
+         for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
+             if ((bitmask & 0xff) == 0) {
+                 bitmask = 0x80;
+-                bits = *src++ ^ bits_xor;
++                bits = *(src_base + m(src++)) ^ bits_xor;
+             }
+             index = (bits & bitmask);
+             if (index) {
+@@ -142,13 +154,15 @@ glue(glue(glue(cirrus_colorexpand_transp
+ 
+ static void
+ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH)
+-     (CirrusVGAState * s, uint8_t * dst,
+-      const uint8_t * src, 
+-      int dstpitch, int srcpitch, 
+-      int bltwidth, int bltheight)
+-{
++     (CirrusVGAState * s, uint8_t * dst_,
++      const uint8_t * src_, 
++      int dstpitch, int srcpitch, 
++      int bltwidth, int bltheight)
++{
++    uint8_t *dst_base, *src_base;
++    uint32_t src, dst;
+     uint32_t colors[2];
+-    uint8_t *d;
++    uint32_t d;
+     int x, y;
+     unsigned bits;
+     unsigned int col;
+@@ -156,16 +170,20 @@ glue(glue(glue(cirrus_colorexpand_, ROP_
+     int srcskipleft = s->gr[0x2f] & 0x07;
+     int dstskipleft = srcskipleft * (DEPTH / 8);
+ 
++    get_base(dst_, s, dst_base);
++    get_base(src_, s, src_base);
++    dst = dst_ - dst_base;
++    src = src_ - src_base;
+     colors[0] = s->cirrus_blt_bgcol;
+     colors[1] = s->cirrus_blt_fgcol;
+     for(y = 0; y < bltheight; y++) {
+         bitmask = 0x80 >> srcskipleft;
+-        bits = *src++;
++        bits = *(src_base + m(src++));
+         d = dst + dstskipleft;
+         for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
+             if ((bitmask & 0xff) == 0) {
+                 bitmask = 0x80;
+-                bits = *src++;
++                bits = *(src_base + m(src++));
+             }
+             col = colors[!!(bits & bitmask)];
+             PUTPIXEL();
+@@ -178,12 +196,14 @@ glue(glue(glue(cirrus_colorexpand_, ROP_
+ 
+ static void
+ glue(glue(glue(cirrus_colorexpand_pattern_transp_, ROP_NAME), _),DEPTH)
+-     (CirrusVGAState * s, uint8_t * dst,
+-      const uint8_t * src, 
+-      int dstpitch, int srcpitch, 
+-      int bltwidth, int bltheight)
+-{
+-    uint8_t *d;
++     (CirrusVGAState * s, uint8_t * dst_,
++      const uint8_t * src_, 
++      int dstpitch, int srcpitch, 
++      int bltwidth, int bltheight)
++{
++    uint8_t *dst_base, *src_base;
++    uint32_t src, dst;
++    uint32_t d;
+     int x, y, bitpos, pattern_y;
+     unsigned int bits, bits_xor;
+     unsigned int col;
+@@ -195,6 +215,10 @@ glue(glue(glue(cirrus_colorexpand_patter
+     int dstskipleft = srcskipleft * (DEPTH / 8);
+ #endif
+ 
++    get_base(dst_, s, dst_base);
++    get_base(src_, s, src_base);
++    dst = dst_ - dst_base;
++    src = src_ - src_base;
+     if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) {
+         bits_xor = 0xff;
+         col = s->cirrus_blt_bgcol;
+@@ -205,7 +229,7 @@ glue(glue(glue(cirrus_colorexpand_patter
+     pattern_y = s->cirrus_blt_srcaddr & 7;
+ 
+     for(y = 0; y < bltheight; y++) {
+-        bits = src[pattern_y] ^ bits_xor;
++        bits = *(src_base + m(src + pattern_y)) ^ bits_xor;
+         bitpos = 7 - srcskipleft;
+         d = dst + dstskipleft;
+         for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
+@@ -222,25 +246,31 @@ glue(glue(glue(cirrus_colorexpand_patter
+ 
+ static void
+ glue(glue(glue(cirrus_colorexpand_pattern_, ROP_NAME), _),DEPTH)
+-     (CirrusVGAState * s, uint8_t * dst,
+-      const uint8_t * src, 
+-      int dstpitch, int srcpitch, 
+-      int bltwidth, int bltheight)
+-{
++     (CirrusVGAState * s, uint8_t * dst_,
++      const uint8_t * src_, 
++      int dstpitch, int srcpitch, 
++      int bltwidth, int bltheight)
++{
++    uint8_t *dst_base, *src_base;
++    uint32_t src, dst;
+     uint32_t colors[2];
+-    uint8_t *d;
++    uint32_t d;
+     int x, y, bitpos, pattern_y;
+     unsigned int bits;
+     unsigned int col;
+     int srcskipleft = s->gr[0x2f] & 0x07;
+     int dstskipleft = srcskipleft * (DEPTH / 8);
+ 
++    get_base(dst_, s, dst_base);
++    get_base(src_, s, src_base);
++    dst = dst_ - dst_base;
++    src = src_ - src_base;
+     colors[0] = s->cirrus_blt_bgcol;
+     colors[1] = s->cirrus_blt_fgcol;
+     pattern_y = s->cirrus_blt_srcaddr & 7;
+ 
+     for(y = 0; y < bltheight; y++) {
+-        bits = src[pattern_y];
++        bits = *(src_base + m(src + pattern_y));
+         bitpos = 7 - srcskipleft;
+         d = dst + dstskipleft;
+         for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
+@@ -257,13 +287,17 @@ static void
+ static void 
+ glue(glue(glue(cirrus_fill_, ROP_NAME), _),DEPTH)
+      (CirrusVGAState *s,
+-      uint8_t *dst, int dst_pitch, 
++      uint8_t *dst_, int dst_pitch, 
+       int width, int height)
+ {
+-    uint8_t *d, *d1;
++    uint8_t *dst_base;
++    uint32_t dst;
++    uint32_t d, d1;
+     uint32_t col;
+     int x, y;
+ 
++    get_base(dst_, s, dst_base);
++    dst = dst_ - dst_base;
+     col = s->cirrus_blt_fgcol;
+ 
+     d1 = dst;



More information about the Pkg-xen-changes mailing list