From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53474 --- dlls/kernel32/tests/heap.c | 31 ++----------------------------- dlls/kernelbase/memory.c | 13 ++++++------- 2 files changed, 8 insertions(+), 36 deletions(-)
diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c index e047ada185e..fb6e4aa56f8 100644 --- a/dlls/kernel32/tests/heap.c +++ b/dlls/kernel32/tests/heap.c @@ -1743,7 +1743,7 @@ static void test_GlobalAlloc(void) if (flags == GMEM_MOVEABLE) ok( size == 512, "GlobalSize returned %Iu\n", size ); else { - todo_wine_if(flags && (flags & GMEM_MOVEABLE) && !(flags & GMEM_MODIFY)) + todo_wine_if((flags & GMEM_DISCARDABLE) && !(flags & GMEM_MODIFY)) ok( size == 10, "GlobalSize returned %Iu\n", size ); }
@@ -1777,7 +1777,7 @@ static void test_GlobalAlloc(void) if (flags == GMEM_MOVEABLE) ok( size == 10, "GlobalSize returned %Iu\n", size ); else if (flags) { - todo_wine_if((flags & GMEM_MOVEABLE) && !(flags & GMEM_MODIFY)) + todo_wine_if((flags & GMEM_DISCARDABLE) && (flags & (GMEM_MODIFY | GMEM_MOVEABLE | GMEM_DISCARDABLE)) != (GMEM_MODIFY | GMEM_MOVEABLE | GMEM_DISCARDABLE)) ok( size == 12, "GlobalSize returned %Iu\n", size ); } else ok( size == 12 || broken( size == 10 ) /* w8 */, "GlobalSize returned %Iu\n", size ); @@ -1920,10 +1920,7 @@ static void test_GlobalAlloc(void) if (!(flags & GMEM_MODIFY) && (flags & GMEM_DISCARDABLE)) todo_wine ok( !tmp_mem, "GlobalReAlloc succeeded\n" ); else - { - todo_wine_if(flags && (!(flags & GMEM_MOVEABLE) || flags == (GMEM_MODIFY | GMEM_MOVEABLE))) ok( tmp_mem == mem, "GlobalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } entry = *mem_entry_from_HANDLE( mem ); if ((flags & GMEM_DISCARDABLE) && (flags & GMEM_MODIFY)) expect_entry.flags |= 4; if ((flags & GMEM_DISCARDABLE) || (flags & GMEM_MODIFY)) @@ -1950,10 +1947,7 @@ static void test_GlobalAlloc(void) if (!(flags & GMEM_MODIFY) && (flags & GMEM_DISCARDABLE)) todo_wine ok( !tmp_mem, "GlobalReAlloc succeeded\n" ); else - { - todo_wine_if(flags && (!(flags & GMEM_MOVEABLE) || flags == (GMEM_MODIFY | GMEM_MOVEABLE))) ok( tmp_mem == mem, "GlobalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } entry = *mem_entry_from_HANDLE( mem ); if ((flags & GMEM_DISCARDABLE) && (flags & GMEM_MODIFY)) expect_entry.flags |= 4; ok( entry.ptr == expect_entry.ptr, "got ptr %p was %p\n", entry.ptr, expect_entry.ptr ); @@ -1979,10 +1973,7 @@ static void test_GlobalAlloc(void) else if (!(flags & GMEM_MODIFY) && (flags & GMEM_DISCARDABLE)) todo_wine ok( !tmp_mem, "GlobalReAlloc succeeded\n" ); else - { - todo_wine_if(!(flags & GMEM_MOVEABLE) || flags == (GMEM_MODIFY | GMEM_MOVEABLE)) ok( tmp_mem == mem, "GlobalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } entry = *mem_entry_from_HANDLE( mem ); if (flags == GMEM_MOVEABLE) { @@ -2477,10 +2468,7 @@ static void test_LocalAlloc(void) if (!(flags & LMEM_MODIFY) && ((flags & LMEM_DISCARDABLE) || !(flags & LMEM_MOVEABLE))) todo_wine ok( !tmp_mem, "LocalReAlloc succeeded\n" ); else - { - todo_wine_if((!(flags & LMEM_MOVEABLE) || flags == (LMEM_MODIFY | LMEM_MOVEABLE))) ok( tmp_mem == mem, "LocalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } entry = *mem_entry_from_HANDLE( mem ); if ((flags & LMEM_DISCARDABLE) && (flags & LMEM_MODIFY)) expect_entry.flags |= 4; if (flags == LMEM_MOVEABLE) ok( entry.ptr != expect_entry.ptr, "got unexpected ptr %p\n", entry.ptr ); @@ -2507,10 +2495,7 @@ static void test_LocalAlloc(void) if (!(flags & LMEM_MODIFY) && (flags & LMEM_DISCARDABLE)) todo_wine ok( !tmp_mem, "LocalReAlloc succeeded\n" ); else - { - todo_wine_if(flags && (!(flags & LMEM_MOVEABLE) || flags == (LMEM_MODIFY | LMEM_MOVEABLE))) ok( tmp_mem == mem, "LocalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } entry = *mem_entry_from_HANDLE( mem ); if ((flags & LMEM_DISCARDABLE) && (flags & LMEM_MODIFY)) expect_entry.flags |= 4; ok( entry.ptr == expect_entry.ptr, "got ptr %p was %p\n", entry.ptr, expect_entry.ptr ); @@ -2536,10 +2521,7 @@ static void test_LocalAlloc(void)
tmp_mem = LocalReAlloc( mem, 0, flags ); if (flags & LMEM_MODIFY) - { - todo_wine_if(!(flags & LMEM_MOVEABLE) || (flags == (LMEM_MOVEABLE | LMEM_MODIFY))) ok( tmp_mem == mem, "LocalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } else todo_wine ok( !tmp_mem, "LocalReAlloc succeeded\n" ); entry = *mem_entry_from_HANDLE( mem ); @@ -2567,10 +2549,7 @@ static void test_LocalAlloc(void) if (!(flags & LMEM_MODIFY) && (flags & LMEM_DISCARDABLE)) todo_wine ok( !tmp_mem, "LocalReAlloc succeeded\n" ); else - { - todo_wine_if(flags && (!(flags & LMEM_MOVEABLE) || flags == (LMEM_MODIFY | LMEM_MOVEABLE))) ok( tmp_mem == mem, "LocalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } entry = *mem_entry_from_HANDLE( mem ); if ((flags & LMEM_DISCARDABLE) && (flags & LMEM_MODIFY)) expect_entry.flags |= 4; if ((flags & LMEM_DISCARDABLE) || (flags & LMEM_MODIFY)) @@ -2597,10 +2576,7 @@ static void test_LocalAlloc(void) if (!(flags & LMEM_MODIFY) && (flags & LMEM_DISCARDABLE)) todo_wine ok( !tmp_mem, "LocalReAlloc succeeded\n" ); else - { - todo_wine_if(flags && (!(flags & LMEM_MOVEABLE) || flags == (LMEM_MODIFY | LMEM_MOVEABLE))) ok( tmp_mem == mem, "LocalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } entry = *mem_entry_from_HANDLE( mem ); if ((flags & LMEM_DISCARDABLE) && (flags & LMEM_MODIFY)) expect_entry.flags |= 4; ok( entry.ptr == expect_entry.ptr, "got ptr %p was %p\n", entry.ptr, expect_entry.ptr ); @@ -2626,10 +2602,7 @@ static void test_LocalAlloc(void) else if (!(flags & LMEM_MODIFY) && (flags & LMEM_DISCARDABLE)) todo_wine ok( !tmp_mem, "LocalReAlloc succeeded\n" ); else - { - todo_wine_if(!(flags & LMEM_MOVEABLE) || flags == (LMEM_MODIFY | LMEM_MOVEABLE)) ok( tmp_mem == mem, "LocalReAlloc returned %p, error %lu\n", tmp_mem, GetLastError() ); - } entry = *mem_entry_from_HANDLE( mem ); if (flags == LMEM_MOVEABLE) { diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c index 5710ee3b082..324caf4b5b6 100644 --- a/dlls/kernelbase/memory.c +++ b/dlls/kernelbase/memory.c @@ -1000,7 +1000,12 @@ HLOCAL WINAPI DECLSPEC_HOTPATCH LocalReAlloc( HLOCAL handle, SIZE_T size, UINT f } else if ((mem = unsafe_mem_from_HLOCAL( handle ))) { - if (!(flags & LMEM_MODIFY)) + if (flags & LMEM_MODIFY) + { + if (flags & LMEM_DISCARDABLE) mem->flags |= MEM_FLAG_DISCARDABLE; + ret = handle; + } + else { if (size) { @@ -1025,12 +1030,6 @@ HLOCAL WINAPI DECLSPEC_HOTPATCH LocalReAlloc( HLOCAL handle, SIZE_T size, UINT f ret = handle; } } - else if (flags & LMEM_DISCARDABLE) - { - mem->flags |= MEM_FLAG_DISCARDABLE; - ret = handle; - } - else SetLastError( ERROR_INVALID_PARAMETER ); } else SetLastError( ERROR_INVALID_HANDLE ); RtlUnlockHeap( heap );