[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