Module: wine Branch: master Commit: 7d47feaebe2986b426adc21f0dd81e8bd0e86b33 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d47feaebe2986b426adc21f0d...
Author: Peter Hedlund peter@peterandlinda.com Date: Wed May 27 10:27:56 2009 -0700
kernel32: Mask out obsolete flags in GlobalAlloc.
---
dlls/kernel32/heap.c | 3 ++ dlls/kernel32/tests/heap.c | 49 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c index c08fb51..c78c762 100644 --- a/dlls/kernel32/heap.c +++ b/dlls/kernel32/heap.c @@ -375,6 +375,9 @@ HGLOBAL WINAPI GlobalAlloc( pintern = HeapAlloc(GetProcessHeap(), 0, sizeof(GLOBAL32_INTERN)); if (pintern) { + /* Mask out obsolete flags */ + flags &= ~(GMEM_LOWER | GMEM_NOCOMPACT | GMEM_NOT_BANKED | GMEM_NOTIFY); + pintern->Magic = MAGIC_GLOBAL_USED; pintern->Flags = flags >> 8; pintern->LockCount = 0; diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c index 39517cc..19b4106 100644 --- a/dlls/kernel32/tests/heap.c +++ b/dlls/kernel32/tests/heap.c @@ -362,9 +362,58 @@ static void test_heap(void) GlobalFree(gbl); }
+static void test_obsolete_flags(void) +{ + static struct { + UINT flags; + UINT globalflags; + } test_global_flags[] = { + {GMEM_FIXED | GMEM_NOTIFY, 0}, + {GMEM_FIXED | GMEM_DISCARDABLE, 0}, + {GMEM_MOVEABLE | GMEM_NOTIFY, 0}, + {GMEM_MOVEABLE | GMEM_DDESHARE, GMEM_DDESHARE}, + {GMEM_MOVEABLE | GMEM_NOT_BANKED, 0}, + {GMEM_MOVEABLE | GMEM_NODISCARD, 0}, + {GMEM_MOVEABLE | GMEM_DISCARDABLE, GMEM_DISCARDABLE}, + {GMEM_MOVEABLE | GMEM_DDESHARE | GMEM_DISCARDABLE | GMEM_LOWER | GMEM_NOCOMPACT | GMEM_NODISCARD | + GMEM_NOT_BANKED | GMEM_NOTIFY, GMEM_DDESHARE | GMEM_DISCARDABLE}, + }; + + unsigned int i; + HGLOBAL gbl; + UINT resultflags; + + UINT (WINAPI *pGlobalFlags)(HGLOBAL); + + pGlobalFlags = (void *) GetProcAddress(GetModuleHandleA("kernel32"), "GlobalFlags"); + + if (!pGlobalFlags) + { + win_skip("GlobalFlags is not available\n"); + return; + } + + for (i = 0; i < sizeof(test_global_flags)/sizeof(test_global_flags[0]); i++) + { + gbl = GlobalAlloc(test_global_flags[i].flags, 4); + ok(gbl != NULL, "GlobalAlloc failed\n"); + + SetLastError(MAGIC_DEAD); + resultflags = pGlobalFlags(gbl); + + ok( resultflags == test_global_flags[i].globalflags || + broken(resultflags == (test_global_flags[i].globalflags & ~GMEM_DDESHARE)), /* win9x */ + "%u: expected 0x%08x, but returned 0x%08x with %d\n", + i, test_global_flags[i].globalflags, resultflags, GetLastError() ); + + GlobalFree(gbl); + } +} + START_TEST(heap) { test_heap(); + test_obsolete_flags();
/* Test both short and very long blocks */ test_sized_HeapAlloc(1);