Patch by Mark Tempel and Ge van Geldorp

Check RtlAllocateHeap() return value for 8-byte alignment.

svn path=/trunk/; revision=8249
This commit is contained in:
Gé van Geldorp 2004-02-18 23:20:14 +00:00
parent 0a2bff78f8
commit 0e77dd5903

View file

@ -1,4 +1,4 @@
/* $Id: global.c,v 1.20 2004/01/23 21:16:03 ekohl Exp $ /* $Id: global.c,v 1.21 2004/02/18 23:20:14 gvg Exp $
* *
* Win32 Global/Local heap functions (GlobalXXX, LocalXXX). * Win32 Global/Local heap functions (GlobalXXX, LocalXXX).
* These functions included in Win32 for compatibility with 16 bit Windows * These functions included in Win32 for compatibility with 16 bit Windows
@ -68,10 +68,6 @@ GlobalAlloc(UINT uFlags,
PGLOBAL_HANDLE phandle = 0; PGLOBAL_HANDLE phandle = 0;
PVOID palloc = 0; PVOID palloc = 0;
UINT heap_flags = 0; UINT heap_flags = 0;
/*Fixme: When we are sure all allocations are 8-byte aligned,
**we can remove this hack.
*/
PGLOBAL_HANDLE hack_fix = 0;
if (uFlags & GMEM_ZEROINIT) if (uFlags & GMEM_ZEROINIT)
{ {
@ -83,24 +79,20 @@ GlobalAlloc(UINT uFlags,
//Changed hProcessHeap to GetProcessHeap() //Changed hProcessHeap to GetProcessHeap()
if ((uFlags & GMEM_MOVEABLE)==0) /* POINTER */ if ((uFlags & GMEM_MOVEABLE)==0) /* POINTER */
{ {
return ((HGLOBAL)RtlAllocateHeap(GetProcessHeap(), heap_flags, dwBytes)); palloc = RtlAllocateHeap(GetProcessHeap(), heap_flags, dwBytes);
if (! ISPOINTER(palloc))
{
DPRINT1("GlobalAlloced pointer which is not 8-byte aligned\n");
RtlFreeHeap(GetProcessHeap(), 0, palloc);
return NULL;
}
return (HGLOBAL) palloc;
} }
else /* HANDLE */ else /* HANDLE */
{ {
HeapLock(hProcessHeap); HeapLock(hProcessHeap);
phandle = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(GLOBAL_HANDLE)); phandle = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(GLOBAL_HANDLE));
/* This little hack is to make sure that we get a pointer with 8-byte
** alignment.
** Fixme: When we are sure all allocations are 8-byte aligned,
** we can remove this hack.
*/
if (ISPOINTER(INTERN_TO_HANDLE(phandle)))
{
hack_fix = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(GLOBAL_HANDLE));
RtlFreeHeap(GetProcessHeap(), 0, phandle);
phandle = hack_fix;
}
if (phandle) if (phandle)
{ {
phandle->Magic = MAGIC_GLOBAL_USED; phandle->Magic = MAGIC_GLOBAL_USED;
@ -133,7 +125,16 @@ GlobalAlloc(UINT uFlags,
HeapUnlock(hProcessHeap); HeapUnlock(hProcessHeap);
if (phandle) if (phandle)
{
if (ISPOINTER(INTERN_TO_HANDLE(phandle)))
{
DPRINT1("GlobalAlloced handle which is 8-byte aligned but shouldn't be\n");
RtlFreeHeap(GetProcessHeap(), 0, palloc);
RtlFreeHeap(GetProcessHeap(), 0, phandle);
return NULL;
}
return INTERN_TO_HANDLE(phandle); return INTERN_TO_HANDLE(phandle);
}
else else
return (HGLOBAL)0; return (HGLOBAL)0;
} }