legacy/i810: Reorder DRI teardown code to avoid potential NULL derefs

Reported-by: Zdenek Kabelac <zkabelac@redhat.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-06-04 12:04:30 +01:00
parent 7424ea7dd0
commit 880ec2c9a5
1 changed files with 25 additions and 24 deletions

View File

@ -898,30 +898,42 @@ I810DRICloseScreen(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
I810Ptr pI810 = I810PTR(pScrn);
I810DRIPtr pI810DRI = (I810DRIPtr) pI810->pDRIInfo->devPrivate;
if (pI810DRI->irq) {
drmCtlUninstHandler(pI810->drmSubFD);
pI810DRI->irq = 0;
if (pI810->pDRIInfo) {
I810DRIPtr pI810DRI = (I810DRIPtr) pI810->pDRIInfo->devPrivate;
if (pI810DRI) {
if (pI810DRI->irq) {
drmCtlUninstHandler(pI810->drmSubFD);
pI810DRI->irq = 0;
}
free(pI810->pDRIInfo->devPrivate);
pI810->pDRIInfo->devPrivate = NULL;
}
I810CleanupDma(pScrn);
DRICloseScreen(pScreen);
DRIDestroyInfoRec(pI810->pDRIInfo);
pI810->pDRIInfo = NULL;
}
I810CleanupDma(pScrn);
if (pI810->dcacheHandle!=DRM_AGP_NO_HANDLE)
drmAgpFree(pI810->drmSubFD, pI810->dcacheHandle);
drmAgpFree(pI810->drmSubFD, pI810->dcacheHandle);
if (pI810->backHandle!=DRM_AGP_NO_HANDLE)
drmAgpFree(pI810->drmSubFD, pI810->backHandle);
drmAgpFree(pI810->drmSubFD, pI810->backHandle);
if (pI810->zHandle!=DRM_AGP_NO_HANDLE)
drmAgpFree(pI810->drmSubFD, pI810->zHandle);
drmAgpFree(pI810->drmSubFD, pI810->zHandle);
if (pI810->cursorHandle!=DRM_AGP_NO_HANDLE)
drmAgpFree(pI810->drmSubFD, pI810->cursorHandle);
drmAgpFree(pI810->drmSubFD, pI810->cursorHandle);
if (pI810->xvmcHandle!=DRM_AGP_NO_HANDLE)
drmAgpFree(pI810->drmSubFD, pI810->xvmcHandle);
drmAgpFree(pI810->drmSubFD, pI810->xvmcHandle);
if (pI810->sysmemHandle!=DRM_AGP_NO_HANDLE)
drmAgpFree(pI810->drmSubFD, pI810->sysmemHandle);
drmAgpFree(pI810->drmSubFD, pI810->sysmemHandle);
if (pI810->agpAcquired == TRUE)
drmAgpRelease(pI810->drmSubFD);
drmAgpRelease(pI810->drmSubFD);
pI810->backHandle = DRM_AGP_NO_HANDLE;
pI810->zHandle = DRM_AGP_NO_HANDLE;
@ -930,17 +942,6 @@ I810DRICloseScreen(ScreenPtr pScreen)
pI810->sysmemHandle = DRM_AGP_NO_HANDLE;
pI810->agpAcquired = FALSE;
pI810->dcacheHandle = DRM_AGP_NO_HANDLE;
DRICloseScreen(pScreen);
if (pI810->pDRIInfo) {
if (pI810->pDRIInfo->devPrivate) {
free(pI810->pDRIInfo->devPrivate);
pI810->pDRIInfo->devPrivate = NULL;
}
DRIDestroyInfoRec(pI810->pDRIInfo);
pI810->pDRIInfo = NULL;
}
}
static Bool