Skip to content

Commit f110853

Browse files
committed
[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
1 parent 71ac07f commit f110853

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

reactos/win32ss/gdi/eng/pdevobj.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,27 @@ PDEVOBJ_AllocPDEV()
6060

6161
RtlZeroMemory(ppdev, sizeof(PDEVOBJ));
6262

63+
ppdev->hsemDevLock = EngCreateSemaphore();
64+
if (ppdev->hsemDevLock == NULL)
65+
{
66+
ExFreePoolWithTag(ppdev, GDITAG_PDEV);
67+
return NULL;
68+
}
69+
6370
ppdev->cPdevRefs = 1;
6471

6572
return ppdev;
6673
}
6774

75+
static
76+
VOID
77+
PDEVOBJ_vDeletePDEV(
78+
PPDEVOBJ ppdev)
79+
{
80+
EngDeleteSemaphore(ppdev->hsemDevLock);
81+
ExFreePoolWithTag(ppdev, GDITAG_PDEV);
82+
}
83+
6884
VOID
6985
NTAPI
7086
PDEVOBJ_vRelease(PPDEVOBJ ppdev)
@@ -124,7 +140,7 @@ PDEVOBJ_vRelease(PPDEVOBJ ppdev)
124140
gppdevPrimary = NULL;
125141

126142
/* Free it */
127-
ExFreePoolWithTag(ppdev, GDITAG_PDEV );
143+
PDEVOBJ_vDeletePDEV(ppdev);
128144
}
129145

130146
/* Unlock loader */
@@ -323,7 +339,7 @@ EngpCreatePDEV(
323339
DPRINT1("Could not load display driver '%ls', '%ls'\n",
324340
pGraphicsDevice->pDiplayDrivers,
325341
pdm->dmDeviceName);
326-
ExFreePoolWithTag(ppdev, GDITAG_PDEV);
342+
PDEVOBJ_vRelease(ppdev);
327343
return NULL;
328344
}
329345

@@ -336,7 +352,6 @@ EngpCreatePDEV(
336352
ppdev->pfnMovePointer = EngMovePointer;
337353

338354
ppdev->pGraphicsDevice = pGraphicsDevice;
339-
ppdev->hsemDevLock = EngCreateSemaphore();
340355
// Should we change the ative mode of pGraphicsDevice ?
341356
ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ;
342357

0 commit comments

Comments
 (0)