Allocate the device lock semaphore for a PDEVOBJ in PDEVOBJ_AllocPDEV and implement PDEVOBJ_vDeletePDEV. Fixes a PDEVOBJ leak, found by Thomas and Giannis.

svn path=/trunk/; revision=67060
This commit is contained in:
Timo Kreuzer 2015-04-05 12:45:01 +00:00
parent 71ac07fc36
commit f110853aaa

View file

@ -60,11 +60,27 @@ PDEVOBJ_AllocPDEV()
RtlZeroMemory(ppdev, sizeof(PDEVOBJ)); RtlZeroMemory(ppdev, sizeof(PDEVOBJ));
ppdev->hsemDevLock = EngCreateSemaphore();
if (ppdev->hsemDevLock == NULL)
{
ExFreePoolWithTag(ppdev, GDITAG_PDEV);
return NULL;
}
ppdev->cPdevRefs = 1; ppdev->cPdevRefs = 1;
return ppdev; return ppdev;
} }
static
VOID
PDEVOBJ_vDeletePDEV(
PPDEVOBJ ppdev)
{
EngDeleteSemaphore(ppdev->hsemDevLock);
ExFreePoolWithTag(ppdev, GDITAG_PDEV);
}
VOID VOID
NTAPI NTAPI
PDEVOBJ_vRelease(PPDEVOBJ ppdev) PDEVOBJ_vRelease(PPDEVOBJ ppdev)
@ -124,7 +140,7 @@ PDEVOBJ_vRelease(PPDEVOBJ ppdev)
gppdevPrimary = NULL; gppdevPrimary = NULL;
/* Free it */ /* Free it */
ExFreePoolWithTag(ppdev, GDITAG_PDEV ); PDEVOBJ_vDeletePDEV(ppdev);
} }
/* Unlock loader */ /* Unlock loader */
@ -323,7 +339,7 @@ EngpCreatePDEV(
DPRINT1("Could not load display driver '%ls', '%ls'\n", DPRINT1("Could not load display driver '%ls', '%ls'\n",
pGraphicsDevice->pDiplayDrivers, pGraphicsDevice->pDiplayDrivers,
pdm->dmDeviceName); pdm->dmDeviceName);
ExFreePoolWithTag(ppdev, GDITAG_PDEV); PDEVOBJ_vRelease(ppdev);
return NULL; return NULL;
} }
@ -336,7 +352,6 @@ EngpCreatePDEV(
ppdev->pfnMovePointer = EngMovePointer; ppdev->pfnMovePointer = EngMovePointer;
ppdev->pGraphicsDevice = pGraphicsDevice; ppdev->pGraphicsDevice = pGraphicsDevice;
ppdev->hsemDevLock = EngCreateSemaphore();
// Should we change the ative mode of pGraphicsDevice ? // Should we change the ative mode of pGraphicsDevice ?
ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ; ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ;