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/eng... ============================================================================== --- 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; }