[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xorg-server: Changes to 'ubuntu'



 debian/changelog                                       |   11 ++
 debian/patches/170_xorg-xserver-1.4-cve-2008-1377.diff |   88 +++++++++++++++++
 debian/patches/171_xorg-xserver-1.4-cve-2008-1379.diff |   24 ++++
 debian/patches/172_xorg-xserver-1.4-cve-2008-2360.diff |   32 ++++++
 debian/patches/173_xorg-xserver-1.4-cve-2008-2361.diff |   13 ++
 debian/patches/174_xorg-xserver-1.4-cve-2008-2362.diff |   63 ++++++++++++
 debian/patches/series                                  |    5 
 7 files changed, 236 insertions(+)

New commits:
commit 56e7f0a416b4bd2c16e5db7997a716fa495dd64a
Author: Bryce Harrington <bryce@bryceharrington.org>
Date:   Wed Jun 11 10:54:56 2008 -0700

    Security fixes

diff --git a/debian/changelog b/debian/changelog
index 2b44c46..66c8b20 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+xorg-server (2:1.4.1~git20080131-1ubuntu12) intrepid; urgency=low
+
+   * Fix multiple security issues:
+     + CVE-2008-2360 - RENDER Extension heap buffer overflow
+     + CVE-2008-2361 - RENDER Extension crash
+     + CVE-2008-2362 - RENDER Extension memory corruption
+     + CVE-2008-1379 - MIT-SHM arbitrary memory read
+     + CVE-2008-1377 - RECORD and Security extensions memory corruption
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Wed, 11 Jun 2008 10:54:15 -0700
+
 xorg-server (2:1.4.1~git20080131-1ubuntu11) intrepid; urgency=low
 
   * 169_xf86AutoConfig_choose_default_driver_if_no_pci.patch
diff --git a/debian/patches/170_xorg-xserver-1.4-cve-2008-1377.diff b/debian/patches/170_xorg-xserver-1.4-cve-2008-1377.diff
new file mode 100644
index 0000000..4eb7e1d
--- /dev/null
+++ b/debian/patches/170_xorg-xserver-1.4-cve-2008-1377.diff
@@ -0,0 +1,88 @@
+diff --git a/Xext/security.c b/Xext/security.c
+index ba057de..f34c463 100644
+--- a/Xext/security.c
++++ b/Xext/security.c
+@@ -651,15 +651,19 @@ SProcSecurityGenerateAuthorization(
+     register char 	n;
+     CARD32 *values;
+     unsigned long nvalues;
++    int values_offset;
+ 
+     swaps(&stuff->length, n);
+     REQUEST_AT_LEAST_SIZE(xSecurityGenerateAuthorizationReq);
+     swaps(&stuff->nbytesAuthProto, n);
+     swaps(&stuff->nbytesAuthData, n);
+     swapl(&stuff->valueMask, n);
+-    values = (CARD32 *)(&stuff[1]) +
+-	((stuff->nbytesAuthProto + (unsigned)3) >> 2) +
+-	((stuff->nbytesAuthData + (unsigned)3) >> 2);
++    values_offset = ((stuff->nbytesAuthProto + (unsigned)3) >> 2) +
++		    ((stuff->nbytesAuthData + (unsigned)3) >> 2);
++    if (values_offset > 
++	stuff->length - (sz_xSecurityGenerateAuthorizationReq >> 2))
++	return BadLength;
++    values = (CARD32 *)(&stuff[1]) + values_offset;
+     nvalues = (((CARD32 *)stuff) + stuff->length) - values;
+     SwapLongs(values, nvalues);
+     return ProcSecurityGenerateAuthorization(client);
+diff --git a/record/record.c b/record/record.c
+index 0ed8f84..9a166d6 100644
+--- a/record/record.c
++++ b/record/record.c
+@@ -2656,7 +2656,7 @@ SProcRecordQueryVersion(ClientPtr client)
+ } /* SProcRecordQueryVersion */
+ 
+ 
+-static void
++static int
+ SwapCreateRegister(xRecordRegisterClientsReq *stuff)
+ {
+     register char n;
+@@ -2667,11 +2667,17 @@ SwapCreateRegister(xRecordRegisterClientsReq *stuff)
+     swapl(&stuff->nClients, n);
+     swapl(&stuff->nRanges, n);
+     pClientID = (XID *)&stuff[1];
++    if (stuff->nClients > stuff->length - (sz_xRecordRegisterClientsReq >> 2))
++	return BadLength;
+     for (i = 0; i < stuff->nClients; i++, pClientID++)
+     {
+ 	swapl(pClientID, n);
+     }
++    if (stuff->nRanges > stuff->length - (sz_xRecordRegisterClientsReq >> 2)
++	- stuff->nClients)
++	return BadLength;
+     RecordSwapRanges((xRecordRange *)pClientID, stuff->nRanges);
++    return Success;
+ } /* SwapCreateRegister */
+ 
+ 
+@@ -2679,11 +2685,13 @@ static int
+ SProcRecordCreateContext(ClientPtr client)
+ {
+     REQUEST(xRecordCreateContextReq);
++    int			status;
+     register char 	n;
+ 
+     swaps(&stuff->length, n);
+     REQUEST_AT_LEAST_SIZE(xRecordCreateContextReq);
+-    SwapCreateRegister((pointer)stuff);
++    if ((status = SwapCreateRegister((pointer)stuff)) != Success)
++	return status;
+     return ProcRecordCreateContext(client);
+ } /* SProcRecordCreateContext */
+ 
+@@ -2692,11 +2700,13 @@ static int
+ SProcRecordRegisterClients(ClientPtr client)
+ {
+     REQUEST(xRecordRegisterClientsReq);
++    int			status;
+     register char 	n;
+ 
+     swaps(&stuff->length, n);
+     REQUEST_AT_LEAST_SIZE(xRecordRegisterClientsReq);
+-    SwapCreateRegister((pointer)stuff);
++    if ((status = SwapCreateRegister((pointer)stuff)) != Success)
++	return status;
+     return ProcRecordRegisterClients(client);
+ } /* SProcRecordRegisterClients */
+ 
diff --git a/debian/patches/171_xorg-xserver-1.4-cve-2008-1379.diff b/debian/patches/171_xorg-xserver-1.4-cve-2008-1379.diff
new file mode 100644
index 0000000..180d126
--- /dev/null
+++ b/debian/patches/171_xorg-xserver-1.4-cve-2008-1379.diff
@@ -0,0 +1,24 @@
+diff --git a/Xext/shm.c b/Xext/shm.c
+index ac587be..e08df36 100644
+--- a/Xext/shm.c
++++ b/Xext/shm.c
+@@ -831,8 +831,17 @@ ProcShmPutImage(client)
+         return BadValue;
+     }
+ 
+-    VERIFY_SHMSIZE(shmdesc, stuff->offset, length * stuff->totalHeight,
+-		   client);
++    /* 
++     * There's a potential integer overflow in this check:
++     * VERIFY_SHMSIZE(shmdesc, stuff->offset, length * stuff->totalHeight,
++     *                client);
++     * the version below ought to avoid it
++     */
++    if (stuff->totalHeight != 0 && 
++	length > (shmdesc->size - stuff->offset)/stuff->totalHeight) {
++	client->errorValue = stuff->totalWidth;
++	return BadValue;
++    }
+     if (stuff->srcX > stuff->totalWidth)
+     {
+ 	client->errorValue = stuff->srcX;
diff --git a/debian/patches/172_xorg-xserver-1.4-cve-2008-2360.diff b/debian/patches/172_xorg-xserver-1.4-cve-2008-2360.diff
new file mode 100644
index 0000000..f14afce
--- /dev/null
+++ b/debian/patches/172_xorg-xserver-1.4-cve-2008-2360.diff
@@ -0,0 +1,32 @@
+diff --git a/render/glyph.c b/render/glyph.c
+index 583a52b..42ae65d 100644
+--- a/render/glyph.c
++++ b/render/glyph.c
+@@ -42,6 +42,12 @@
+ #include "picturestr.h"
+ #include "glyphstr.h"
+ 
++#if HAVE_STDINT_H
++#include <stdint.h>
++#elif !defined(UINT32_MAX)
++#define UINT32_MAX 0xffffffffU
++#endif
++
+ /*
+  * From Knuth -- a good choice for hash/rehash values is p, p-2 where
+  * p and p-2 are both prime.  These tables are sized to have an extra 10%
+@@ -626,8 +632,12 @@ AllocateGlyph (xGlyphInfo *gi, int fdepth)
+     int		     size;
+     GlyphPtr	     glyph;
+     int		     i;
+-
+-    size = gi->height * PixmapBytePad (gi->width, glyphDepths[fdepth]);
++    size_t	     padded_width;
++    
++    padded_width = PixmapBytePad (gi->width, glyphDepths[fdepth]);
++    if (gi->height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi->height)
++	return 0;
++    size = gi->height * padded_width;
+     glyph = (GlyphPtr) xalloc (size + sizeof (GlyphRec));
+     if (!glyph)
+ 	return 0;
diff --git a/debian/patches/173_xorg-xserver-1.4-cve-2008-2361.diff b/debian/patches/173_xorg-xserver-1.4-cve-2008-2361.diff
new file mode 100644
index 0000000..0749331
--- /dev/null
+++ b/debian/patches/173_xorg-xserver-1.4-cve-2008-2361.diff
@@ -0,0 +1,13 @@
+diff --git a/render/render.c b/render/render.c
+index caaa278..b53e878 100644
+--- a/render/render.c
++++ b/render/render.c
+@@ -1504,6 +1504,8 @@ ProcRenderCreateCursor (ClientPtr client)
+     pScreen = pSrc->pDrawable->pScreen;
+     width = pSrc->pDrawable->width;
+     height = pSrc->pDrawable->height;
++    if (height && width > UINT32_MAX/(height*sizeof(CARD32)))
++	return BadAlloc;
+     if ( stuff->x > width 
+       || stuff->y > height )
+ 	return (BadMatch);
diff --git a/debian/patches/174_xorg-xserver-1.4-cve-2008-2362.diff b/debian/patches/174_xorg-xserver-1.4-cve-2008-2362.diff
new file mode 100644
index 0000000..a254d7a
--- /dev/null
+++ b/debian/patches/174_xorg-xserver-1.4-cve-2008-2362.diff
@@ -0,0 +1,63 @@
+diff --git a/render/render.c b/render/render.c
+index 74c5f63..b53e878 100644
+--- a/render/render.c
++++ b/render/render.c
+@@ -1920,6 +1920,8 @@ static int ProcRenderCreateLinearGradient (ClientPtr client)
+     LEGAL_NEW_RESOURCE(stuff->pid, client);
+ 
+     len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
++    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
++	return BadLength;
+     if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+         return BadLength;
+ 
+@@ -2493,18 +2495,18 @@ SProcRenderCreateSolidFill(ClientPtr client)
+     return (*ProcRenderVector[stuff->renderReqType]) (client);
+ }
+ 
+-static void swapStops(void *stuff, int n)
++static void swapStops(void *stuff, int num)
+ {
+-    int i;
++    int i, n;
+     CARD32 *stops;
+     CARD16 *colors;
+     stops = (CARD32 *)(stuff);
+-    for (i = 0; i < n; ++i) {
++    for (i = 0; i < num; ++i) {
+         swapl(stops, n);
+         ++stops;
+     }
+     colors = (CARD16 *)(stops);
+-    for (i = 0; i < 4*n; ++i) {
++    for (i = 0; i < 4*num; ++i) {
+         swaps(stops, n);
+         ++stops;
+     }
+@@ -2527,6 +2529,8 @@ SProcRenderCreateLinearGradient (ClientPtr client)
+     swapl(&stuff->nStops, n);
+ 
+     len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
++    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
++	return BadLength;
+     if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+         return BadLength;
+ 
+@@ -2554,6 +2558,8 @@ SProcRenderCreateRadialGradient (ClientPtr client)
+     swapl(&stuff->nStops, n);
+ 
+     len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
++    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
++	return BadLength;
+     if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+         return BadLength;
+ 
+@@ -2578,6 +2584,8 @@ SProcRenderCreateConicalGradient (ClientPtr client)
+     swapl(&stuff->nStops, n);
+ 
+     len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
++    if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
++	return BadLength;
+     if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
+         return BadLength;
+ 
diff --git a/debian/patches/series b/debian/patches/series
index 526af56..a2f333d 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -64,3 +64,8 @@
 167_xf86AutoConfig_geode_addition.diff -p0
 168_closedir.patch
 169_xf86AutoConfig_choose_default_driver_if_no_pci.patch
+170_xorg-xserver-1.4-cve-2008-1377.diff
+171_xorg-xserver-1.4-cve-2008-1379.diff
+172_xorg-xserver-1.4-cve-2008-2360.diff
+173_xorg-xserver-1.4-cve-2008-2361.diff
+174_xorg-xserver-1.4-cve-2008-2362.diff

commit 78aadba2598355047113b1b61d0779d96c003b31
Author: Bryce Harrington <bryce@bryceharrington.org>
Date:   Tue May 13 18:58:17 2008 -0700

    adding patch 169

diff --git a/debian/changelog b/debian/changelog
index 3d2624b..2b44c46 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+xorg-server (2:1.4.1~git20080131-1ubuntu11) intrepid; urgency=low
+
+  * 169_xf86AutoConfig_choose_default_driver_if_no_pci.patch
+    - Choose the default driver for the platform instead of the generic
+      default (vesa) if there is no PCI info.  Without this, on platforms
+      like PS3 where fbdev should be used rather than vesa, the system
+      will fail to start up.  (LP: #219424)
+
+ -- Bryce Harrington <bryce@ubuntu.com>  Tue, 13 May 2008 13:09:17 -0700
+  
+
 xorg-server (2:1.4.1~git20080131-1ubuntu10) intrepid; urgency=low
 
   [Timo Aaltonen]
diff --git a/debian/patches/series b/debian/patches/series
index 381b6dc..526af56 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -63,3 +63,4 @@
 166_fix_lpl_monitors.diff
 167_xf86AutoConfig_geode_addition.diff -p0
 168_closedir.patch
+169_xf86AutoConfig_choose_default_driver_if_no_pci.patch


Reply to: