Hi, please consider the following changes to the intel driver for squeeze: | xserver-xorg-video-intel (2:2.13.0-6) stable; urgency=low | | * Cherry-pick from upstream: | - uxa: Fallback if the temporary is too large | * This fixes a null pointer dereference with some rendering operations | involving large pictures (Closes: #613830). Thanks, Enrico! | * Cherry-pick from upstream, thanks to Bjørn Mork: | - Don't replace the scanout bo through PutImage | - dri: Fix the use of the uninitialised bo for flink | * These should fix issues with SDL (Closes: #602207). | | -- Cyril Brulebois <kibi@debian.org> Fri, 18 Feb 2011 14:03:12 +0100 The first fix is quite trivial and also applied to current master until yesterday, it was cherry-picked for unstable as well. http://git.debian.org/?p=pkg-xorg/driver/xserver-xorg-video-intel.git;a=commitdiff;h=7d59555f72d059b75dde91db8047e6195d0d334a The second fix is (user-contributed) backports: http://git.debian.org/?p=pkg-xorg/driver/xserver-xorg-video-intel.git;a=commitdiff;h=91af3c5ead6157ed065ccd3e3cc413c945182488 http://git.debian.org/?p=pkg-xorg/driver/xserver-xorg-video-intel.git;a=commitdiff;h=bdca7df8d4238f0630aeda75ed02461d76a5ea05 I've reproduced both issues on my laptop, verified the fixes worked fine, and I haven't noticed any regression. The full source debdiff is attached. KiBi.
diff -u xserver-xorg-video-intel-2.13.0/debian/changelog xserver-xorg-video-intel-2.13.0/debian/changelog[0;0m
--- xserver-xorg-video-intel-2.13.0/debian/changelog[0;0m
+++ xserver-xorg-video-intel-2.13.0/debian/changelog[0;0m
@@ -1,3 +1,16 @@[0;0m
+xserver-xorg-video-intel (2:2.13.0-6) stable; urgency=low[0;0m
+[0;0m
+ * Cherry-pick from upstream:[0;0m
+ - uxa: Fallback if the temporary is too large[0;0m
+ * This fixes a null pointer dereference with some rendering operations[0;0m
+ involving large pictures (Closes: #613830). Thanks, Enrico![0;0m
+ * Cherry-pick from upstream, thanks to Bjørn Mork:[0;0m
+ - Don't replace the scanout bo through PutImage[0;0m
+ - dri: Fix the use of the uninitialised bo for flink[0;0m
+ * These should fix issues with SDL (Closes: #602207).[0;0m
+[0;0m
+ -- Cyril Brulebois <kibi@debian.org> Fri, 18 Feb 2011 14:03:12 +0100[0;0m
+[0;0m
xserver-xorg-video-intel (2:2.13.0-5) unstable; urgency=low[0;0m
[0;0m
[ Julien Cristau ][0;0m
only in patch2:[0;0m
unchanged:[0;0m
--- xserver-xorg-video-intel-2.13.0.orig/src/intel_dri.c[0;0m
+++ xserver-xorg-video-intel-2.13.0/src/intel_dri.c[0;0m
@@ -71,6 +71,21 @@[0;0m
unsigned int attachment;[0;0m
} I830DRI2BufferPrivateRec, *I830DRI2BufferPrivatePtr;[0;0m
[0;0m
+static uint32_t pixmap_flink(PixmapPtr pixmap)[0;0m
+{[0;0m
+ struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);[0;0m
+ uint32_t name;[0;0m
+[0;0m
+ if (priv == NULL || priv->bo == NULL)[0;0m
+ return 0;[0;0m
+[0;0m
+ if (dri_bo_flink(priv->bo, &name) != 0)[0;0m
+ return 0;[0;0m
+[0;0m
+ priv->pinned = 1;[0;0m
+ return name;[0;0m
+}[0;0m
+[0;0m
#if DRI2INFOREC_VERSION < 2[0;0m
[0;0m
static DRI2BufferPtr[0;0m
@@ -81,10 +96,9 @@[0;0m
ScrnInfoPtr scrn = xf86Screens[screen->myNum];[0;0m
intel_screen_private *intel = intel_get_screen_private(scrn);[0;0m
DRI2BufferPtr buffers;[0;0m
- dri_bo *bo;[0;0m
- int i;[0;0m
I830DRI2BufferPrivatePtr privates;[0;0m
PixmapPtr pixmap, pDepthPixmap;[0;0m
+ int i;[0;0m
[0;0m
buffers = calloc(count, sizeof *buffers);[0;0m
if (buffers == NULL)[0;0m
@@ -144,8 +158,7 @@[0;0m
privates[i].pixmap = pixmap;[0;0m
privates[i].attachment = attachments[i];[0;0m
[0;0m
- bo = intel_get_pixmap_bo(pixmap);[0;0m
- if (bo == NULL || dri_bo_flink(bo, &buffers[i].name) != 0) {[0;0m
+ if ((buffers[i].name = pixmap_flink(pixmap)) == 0) {[0;0m
/* failed to name buffer */[0;0m
screen->DestroyPixmap(pixmap);[0;0m
goto unwind;[0;0m
@@ -190,7 +203,6 @@[0;0m
ScrnInfoPtr scrn = xf86Screens[screen->myNum];[0;0m
intel_screen_private *intel = intel_get_screen_private(scrn);[0;0m
DRI2Buffer2Ptr buffer;[0;0m
- dri_bo *bo;[0;0m
I830DRI2BufferPrivatePtr privates;[0;0m
PixmapPtr pixmap;[0;0m
[0;0m
@@ -252,8 +264,7 @@[0;0m
privates->pixmap = pixmap;[0;0m
privates->attachment = attachment;[0;0m
[0;0m
- bo = intel_get_pixmap_bo(pixmap);[0;0m
- if (bo == NULL || dri_bo_flink(bo, &buffer->name) != 0) {[0;0m
+ if ((buffer->name = pixmap_flink(pixmap)) == 0) {[0;0m
/* failed to name buffer */[0;0m
screen->DestroyPixmap(pixmap);[0;0m
free(privates);[0;0m
only in patch2:[0;0m
unchanged:[0;0m
--- xserver-xorg-video-intel-2.13.0.orig/src/intel.h[0;0m
+++ xserver-xorg-video-intel-2.13.0/src/intel.h[0;0m
@@ -169,6 +169,7 @@[0;0m
uint8_t tiling;[0;0m
int8_t busy :2;[0;0m
int8_t batch_write :1;[0;0m
+ int8_t pinned :1;[0;0m
};[0;0m
[0;0m
#if HAS_DEVPRIVATEKEYREC[0;0m
only in patch2:[0;0m
unchanged:[0;0m
--- xserver-xorg-video-intel-2.13.0.orig/src/intel_uxa.c[0;0m
+++ xserver-xorg-video-intel-2.13.0/src/intel_uxa.c[0;0m
@@ -767,7 +767,8 @@[0;0m
} else {[0;0m
ScreenPtr screen = pixmap->drawable.pScreen;[0;0m
[0;0m
- if (x == 0 && y == 0 &&[0;0m
+ if (!priv->pinned &&[0;0m
+ x == 0 && y == 0 &&[0;0m
w == pixmap->drawable.width &&[0;0m
h == pixmap->drawable.height)[0;0m
{[0;0m
@@ -1263,7 +1264,7 @@[0;0m
if (bo != NULL) {[0;0m
PixmapPtr pixmap = screen->GetScreenPixmap(screen);[0;0m
intel_set_pixmap_bo(pixmap, bo);[0;0m
- intel_get_pixmap_private(pixmap)->busy = 1;[0;0m
+ intel_get_pixmap_private(pixmap)->pinned = 1;[0;0m
screen->ModifyPixmapHeader(pixmap,[0;0m
scrn->virtualX,[0;0m
scrn->virtualY,[0;0m
only in patch2:[0;0m
unchanged:[0;0m
--- xserver-xorg-video-intel-2.13.0.orig/uxa/uxa-render.c[0;0m
+++ xserver-xorg-video-intel-2.13.0/uxa/uxa-render.c[0;0m
@@ -460,12 +460,12 @@[0;0m
}[0;0m
[0;0m
static PicturePtr[0;0m
-uxa_picture_for_pixman_format(ScreenPtr pScreen,[0;0m
+uxa_picture_for_pixman_format(ScreenPtr screen,[0;0m
pixman_format_code_t format,[0;0m
int width, int height)[0;0m
{[0;0m
- PicturePtr pPicture;[0;0m
- PixmapPtr pPixmap;[0;0m
+ PicturePtr picture;[0;0m
+ PixmapPtr pixmap;[0;0m
int error;[0;0m
[0;0m
if (format == PIXMAN_a1)[0;0m
@@ -475,24 +475,29 @@[0;0m
if (PIXMAN_FORMAT_A(format) == 0)[0;0m
format = PIXMAN_a8r8g8b8;[0;0m
[0;0m
- pPixmap = (*pScreen->CreatePixmap)(pScreen, width, height,[0;0m
- PIXMAN_FORMAT_DEPTH(format),[0;0m
- UXA_CREATE_PIXMAP_FOR_MAP);[0;0m
- if (!pPixmap)[0;0m
+ pixmap = screen->CreatePixmap(screen, width, height,[0;0m
+ PIXMAN_FORMAT_DEPTH(format),[0;0m
+ UXA_CREATE_PIXMAP_FOR_MAP);[0;0m
+ if (!pixmap)[0;0m
return 0;[0;0m
[0;0m
- pPicture = CreatePicture(0, &pPixmap->drawable,[0;0m
- PictureMatchFormat(pScreen,[0;0m
- PIXMAN_FORMAT_DEPTH(format),[0;0m
- format),[0;0m
- 0, 0, serverClient, &error);[0;0m
- (*pScreen->DestroyPixmap) (pPixmap);[0;0m
- if (!pPicture)[0;0m
+ if (!uxa_pixmap_is_offscreen(pixmap)) {[0;0m
+ screen->DestroyPixmap(pixmap);[0;0m
return 0;[0;0m
+ }[0;0m
[0;0m
- ValidatePicture(pPicture);[0;0m
+ picture = CreatePicture(0, &pixmap->drawable,[0;0m
+ PictureMatchFormat(screen,[0;0m
+ PIXMAN_FORMAT_DEPTH(format),[0;0m
+ format),[0;0m
+ 0, 0, serverClient, &error);[0;0m
+ screen->DestroyPixmap(pixmap);[0;0m
+ if (!picture)[0;0m
+ return 0;[0;0m
+[0;0m
+ ValidatePicture(picture);[0;0m
[0;0m
- return pPicture;[0;0m
+ return picture;[0;0m
}[0;0m
[0;0m
static PicturePtr[0;0m
Attachment:
signature.asc
Description: Digital signature