Author: khornicek
Date: Fri Mar 12 00:11:00 2010
New Revision: 46123
URL:
http://svn.reactos.org/svn/reactos?rev=46123&view=rev
Log:
[WIN32K]
Prevent a possible memory leak.
Use SURFACE_FreeSurfaceByHandle so we don't hit the "Object must not have a
handle!" assert in GDIOBJ_FreeObj.
Modified:
trunk/reactos/subsystems/win32/win32k/eng/surface.c
Modified: trunk/reactos/subsystems/win32/win32k/eng/surface.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/en…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/eng/surface.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/eng/surface.c [iso-8859-1] Fri Mar 12 00:11:00
2010
@@ -466,6 +466,7 @@
SURFOBJ *pso;
PSURFACE psurf;
SIZEL LocalSize;
+ BOOLEAN AllocatedLocally = FALSE;
/*
* First, check the format so we can get the aligned scanline width.
@@ -526,7 +527,7 @@
Size = BitmapInfo->Height * ScanLine;
}
- if (Size)
+ if (Size)
{
/* Check for allocation flag */
if (BitmapInfo->Flags & BMF_USERMEM)
@@ -541,7 +542,7 @@
Size,
TAG_DIB);
}
-
+ AllocatedLocally = TRUE;
/* Bail out if that failed */
if (!Bits) return NULL;
}
@@ -554,14 +555,24 @@
/* Allocate the actual surface object structure */
psurf = SURFACE_AllocSurfaceWithHandle();
- if (!psurf) return NULL;
-
+ if (!psurf)
+ {
+ if(Bits && AllocatedLocally)
+ {
+ if(BitmapInfo->Flags & BMF_USERMEM)
+ EngFreeUserMem(Bits);
+ else
+ EngFreeMem(Bits);
+ }
+ return NULL;
+ }
+
/* Lock down the surface */
if (!SURFACE_InitBitsLock(psurf))
{
/* Bail out if that failed */
SURFACE_UnlockSurface(psurf);
- SURFACE_FreeSurface(psurf);
+ SURFACE_FreeSurfaceByHandle(psurf->BaseObject.hHmgr);
return NULL;
}