EXA: Fix mixed pixmaps crash with missing / failing UploadToScreen hook.

For the recent mixed pixmaps changes, I failed to realize (or hit in my
testing) a problem which can occur if the driver doesn't provide an
UploadToScreen hook or provides one which can fail: There can be a crash
in exaMemcpyBox() because exaCopyDirtyToFb() passes pExaPixmap->fb_ptr to
exaCopyDirty(), but that's normally NULL with driver allocated pixmaps.

The solution is to make exaCopyDirty*() no longer rely on pExaPixmap->fb_ptr
but use pPixmap->devPrivate.ptr after PrepareAccess instead.

Fixes http://bugs.freedesktop.org/show_bug.cgi?id=24167 .
This commit is contained in:
Michel Dänzer 2009-09-27 02:08:10 +02:00
parent c9ec2bab2f
commit 73ae547d5e

View File

@ -104,9 +104,8 @@ exaPixmapShouldBeInFB (PixmapPtr pPix)
static void static void
exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc, exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc,
Bool (*transfer) (PixmapPtr pPix, int x, int y, int w, int h, Bool (*transfer) (PixmapPtr pPix, int x, int y, int w, int h,
char *sys, int sys_pitch), CARD8 *fallback_src, char *sys, int sys_pitch), int fallback_index,
CARD8 *fallback_dst, int fallback_srcpitch, int fallback_dstpitch, void (*sync) (ScreenPtr pScreen))
int fallback_index, void (*sync) (ScreenPtr pScreen))
{ {
PixmapPtr pPixmap = migrate->pPix; PixmapPtr pPixmap = migrate->pPix;
ExaPixmapPriv (pPixmap); ExaPixmapPriv (pPixmap);
@ -228,9 +227,15 @@ exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc,
ExaDoPrepareAccess(pPixmap, fallback_index); ExaDoPrepareAccess(pPixmap, fallback_index);
access_prepared = TRUE; access_prepared = TRUE;
} }
exaMemcpyBox (pPixmap, pBox, if (fallback_index == EXA_PREPARE_DEST) {
fallback_src, fallback_srcpitch, exaMemcpyBox (pPixmap, pBox,
fallback_dst, fallback_dstpitch); pExaPixmap->sys_ptr, pExaPixmap->sys_pitch,
pPixmap->devPrivate.ptr, pPixmap->devKind);
} else {
exaMemcpyBox (pPixmap, pBox,
pPixmap->devPrivate.ptr, pPixmap->devKind,
pExaPixmap->sys_ptr, pExaPixmap->sys_pitch);
}
} else } else
need_sync = TRUE; need_sync = TRUE;
@ -271,9 +276,8 @@ exaCopyDirtyToSys (ExaMigrationPtr migrate)
ExaPixmapPriv (pPixmap); ExaPixmapPriv (pPixmap);
exaCopyDirty(migrate, &pExaPixmap->validSys, &pExaPixmap->validFB, exaCopyDirty(migrate, &pExaPixmap->validSys, &pExaPixmap->validFB,
pExaScr->info->DownloadFromScreen, pExaPixmap->fb_ptr, pExaScr->info->DownloadFromScreen, EXA_PREPARE_SRC,
pExaPixmap->sys_ptr, pExaPixmap->fb_pitch, exaWaitSync);
pExaPixmap->sys_pitch, EXA_PREPARE_SRC, exaWaitSync);
} }
/** /**
@ -289,9 +293,7 @@ exaCopyDirtyToFb (ExaMigrationPtr migrate)
ExaPixmapPriv (pPixmap); ExaPixmapPriv (pPixmap);
exaCopyDirty(migrate, &pExaPixmap->validFB, &pExaPixmap->validSys, exaCopyDirty(migrate, &pExaPixmap->validFB, &pExaPixmap->validSys,
pExaScr->info->UploadToScreen, pExaPixmap->sys_ptr, pExaScr->info->UploadToScreen, EXA_PREPARE_DEST, NULL);
pExaPixmap->fb_ptr, pExaPixmap->sys_pitch,
pExaPixmap->fb_pitch, EXA_PREPARE_DEST, NULL);
} }
/** /**