From f110853aaaec95899ef9161fd6840ff5192c42a9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 5 Apr 2015 12:45:01 +0000 Subject: [PATCH] [WIN32K] 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 --- reactos/win32ss/gdi/eng/pdevobj.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/reactos/win32ss/gdi/eng/pdevobj.c b/reactos/win32ss/gdi/eng/pdevobj.c index 39d8bf95c93..214537a780b 100644 --- a/reactos/win32ss/gdi/eng/pdevobj.c +++ b/reactos/win32ss/gdi/eng/pdevobj.c @@ -60,11 +60,27 @@ PDEVOBJ_AllocPDEV() RtlZeroMemory(ppdev, sizeof(PDEVOBJ)); + ppdev->hsemDevLock = EngCreateSemaphore(); + if (ppdev->hsemDevLock == NULL) + { + ExFreePoolWithTag(ppdev, GDITAG_PDEV); + return NULL; + } + ppdev->cPdevRefs = 1; return ppdev; } +static +VOID +PDEVOBJ_vDeletePDEV( + PPDEVOBJ ppdev) +{ + EngDeleteSemaphore(ppdev->hsemDevLock); + ExFreePoolWithTag(ppdev, GDITAG_PDEV); +} + VOID NTAPI PDEVOBJ_vRelease(PPDEVOBJ ppdev) @@ -124,7 +140,7 @@ PDEVOBJ_vRelease(PPDEVOBJ ppdev) gppdevPrimary = NULL; /* Free it */ - ExFreePoolWithTag(ppdev, GDITAG_PDEV ); + PDEVOBJ_vDeletePDEV(ppdev); } /* Unlock loader */ @@ -323,7 +339,7 @@ EngpCreatePDEV( DPRINT1("Could not load display driver '%ls', '%ls'\n", pGraphicsDevice->pDiplayDrivers, pdm->dmDeviceName); - ExFreePoolWithTag(ppdev, GDITAG_PDEV); + PDEVOBJ_vRelease(ppdev); return NULL; } @@ -336,7 +352,6 @@ EngpCreatePDEV( ppdev->pfnMovePointer = EngMovePointer; ppdev->pGraphicsDevice = pGraphicsDevice; - ppdev->hsemDevLock = EngCreateSemaphore(); // Should we change the ative mode of pGraphicsDevice ? ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ;