Make sure a region is reasonably initialized, before potentially passing it to the cleanup function, when failing to create a handle.

svn path=/trunk/; revision=66614
This commit is contained in:
Timo Kreuzer 2015-03-08 23:36:14 +00:00
parent d09753a207
commit 6dcd051d62

View file

@ -2187,13 +2187,6 @@ REGION_AllocRgnWithHandle(
return NULL;
}
if (!GDIOBJ_hInsertObject(&pReg->BaseObject, GDI_OBJ_HMGR_POWNED))
{
DPRINT1("Could not insert palette into handle table.\n");
GDIOBJ_vFreeObject(&pReg->BaseObject);
return NULL;
}
//hReg = pReg->BaseObject.hHmgr;
if ((nReg == 0) || (nReg == 1))
@ -2221,6 +2214,19 @@ REGION_AllocRgnWithHandle(
pReg->rdh.nRgnSize = nReg * sizeof(RECT);
pReg->prgnattr = &pReg->rgnattr;
/* Initialize the region attribute */
pReg->rgnattr.AttrFlags = 0;
pReg->rgnattr.iComplexity = SIMPLEREGION;
pReg->rgnattr.Rect = pReg->rdh.rcBound;
/* Finally insert the region into the handle table */
if (!GDIOBJ_hInsertObject(&pReg->BaseObject, GDI_OBJ_HMGR_POWNED))
{
DPRINT1("Could not insert palette into handle table.\n");
GDIOBJ_vFreeObject(&pReg->BaseObject);
return NULL;
}
return pReg;
}
@ -2232,6 +2238,8 @@ REGION_bAllocRgnAttr(
PPROCESSINFO ppi;
PRGN_ATTR prgnattr;
NT_ASSERT(prgn->prgnattr == &prgn->rgnattr);
ppi = PsGetCurrentProcessWin32Process();
ASSERT(ppi);
@ -2242,6 +2250,9 @@ REGION_bAllocRgnAttr(
return FALSE;
}
/* Copy the current region attribute */
*prgnattr = prgn->rgnattr;
/* Set the object attribute in the handle table */
prgn->prgnattr = prgnattr;
GDIOBJ_vSetObjectAttr(&prgn->BaseObject, prgnattr);
@ -3928,105 +3939,112 @@ NtGdiGetRgnBox(
INT
APIENTRY
NtGdiOffsetRgn(
HRGN hRgn,
INT XOffset,
INT YOffset)
_In_ HRGN hrgn,
_In_ INT cx,
_In_ INT cy)
{
PREGION rgn;
INT ret;
PREGION prgn;
INT iResult;
DPRINT("NtGdiOffsetRgn: hRgn %p Xoffs %d Yoffs %d rgn %p\n", hRgn, XOffset, YOffset, rgn );
DPRINT("NtGdiOffsetRgn: hrgn %p cx %d cy %d\n", hrgn, cx, cy);
rgn = REGION_LockRgn(hRgn);
if (rgn == NULL)
/* Lock the region */
prgn = REGION_LockRgn(hrgn);
if (prgn == NULL)
{
DPRINT("NtGdiOffsetRgn: hRgn error\n");
DPRINT1("NtGdiOffsetRgn: failed to lock region %p\n", hrgn);
return ERROR;
}
if (!REGION_bOffsetRgn(rgn, XOffset, YOffset))
/* Call the internal function */
if (!REGION_bOffsetRgn(prgn, cx, cy))
{
ret = ERROR;
iResult = ERROR;
}
else
{
ret = REGION_Complexity(rgn);
iResult = REGION_Complexity(prgn);
}
REGION_UnlockRgn(rgn);
return ret;
/* Unlock and return the result */
REGION_UnlockRgn(prgn);
return iResult;
}
BOOL
APIENTRY
NtGdiPtInRegion(
HRGN hRgn,
INT X,
INT Y)
_In_ HRGN hrgn,
_In_ INT x,
_In_ INT y)
{
PREGION prgn;
BOOL ret;
BOOL bResult;
prgn = REGION_LockRgn(hRgn);
/* Lock the region */
prgn = REGION_LockRgn(hrgn);
if (prgn == NULL)
{
DPRINT1("NtGdiPtInRegion: hrgn error\n");
return FALSE;
}
ret = REGION_PtInRegion(prgn, X, Y);
/* Call the internal function */
bResult = REGION_PtInRegion(prgn, x, y);
/* Unlock and return the result */
REGION_UnlockRgn(prgn);
return ret;
return bResult;
}
BOOL
APIENTRY
NtGdiRectInRegion(
HRGN hRgn,
LPRECTL unsaferc)
_In_ HRGN hrgn,
_In_ LPRECT prclUnsafe)
{
RECTL rc = { 0 };
NTSTATUS Status = STATUS_SUCCESS;
RECTL rcTemp;
/* Probe and copy the rect */
_SEH2_TRY
{
ProbeForRead(unsaferc, sizeof(RECT), 1);
rc = *unsaferc;
ProbeForRead(prclUnsafe, sizeof(RECT), 1);
rcTemp = *prclUnsafe;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
DPRINT1("NtGdiRectInRegion: Exception accessing the rect\n");
return FALSE;
}
_SEH2_END;
if (!NT_SUCCESS(Status))
{
SetLastNtError(Status);
DPRINT1("NtGdiRectInRegion: Bogus rc\n");
return ERROR;
}
return IntRectInRegion(hRgn, &rc);
/* Call the internal function */
return IntRectInRegion(hrgn, &rcTemp);
}
BOOL
APIENTRY
NtGdiSetRectRgn(
HRGN hRgn,
INT LeftRect,
INT TopRect,
INT RightRect,
INT BottomRect)
_In_ HRGN hrgn,
_In_ INT xLeft,
_In_ INT yTop,
_In_ INT xRight,
_In_ INT yBottom)
{
PREGION rgn;
PREGION prgn;
rgn = REGION_LockRgn(hRgn);
if (rgn == NULL)
/* Lock the region */
prgn = REGION_LockRgn(hrgn);
if (prgn == NULL)
{
return 0; // Per documentation
return FALSE;
}
REGION_SetRectRgn(rgn, LeftRect, TopRect, RightRect, BottomRect);
/* Call the internal API */
REGION_SetRectRgn(prgn, xLeft, yTop, xRight, yBottom);
REGION_UnlockRgn(rgn);
/* Unlock the region and return success */
REGION_UnlockRgn(prgn);
return TRUE;
}