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