Peter Hedlund : kernel32: Mask out obsolete flags in GlobalAlloc.

Alexandre Julliard julliard at winehq.org
Thu May 28 09:39:44 CDT 2009


Module: wine
Branch: master
Commit: 7d47feaebe2986b426adc21f0dd81e8bd0e86b33
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7d47feaebe2986b426adc21f0dd81e8bd0e86b33

Author: Peter Hedlund <peter at 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);




More information about the wine-cvs mailing list