kernelbase: Use the same HLOCAL entry pointer alignment as native.

This changes the GlobalUnlock todo_wine as we previously considered the
invalid mem handle as a valid pointer, and we now instead check handle
validity.

Returning TRUE in for an invalid handle doesn't seem very important, and
a corner case, and it breaks compatibility and imm32 tests.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2022-04-04 10:01:59 +02:00 committed by Alexandre Julliard
parent 55282e0d09
commit 2fcb072f03
3 changed files with 9 additions and 28 deletions

View file

@ -147,8 +147,6 @@ BOOL WINAPI HeapDestroy( HANDLE heap /* [in] Handle of heap */ )
* Global/local heap functions, keep in sync with kernelbase/memory.c
***********************************************************************/
#include "pshpack1.h"
struct mem_entry
{
union
@ -156,15 +154,15 @@ struct mem_entry
struct
{
WORD magic;
void *ptr;
BYTE flags;
BYTE lock;
};
void *next_free;
};
void *ptr;
};
#include "poppack.h"
C_ASSERT(sizeof(struct mem_entry) == 2 * sizeof(void *));
struct kernelbase_global_data *kernelbase_global_data;
@ -181,7 +179,7 @@ static inline struct mem_entry *unsafe_mem_from_HLOCAL( HLOCAL handle )
{
struct mem_entry *mem = CONTAINING_RECORD( handle, struct mem_entry, ptr );
struct kernelbase_global_data *data = kernelbase_global_data;
if (!((ULONG_PTR)handle & 2)) return NULL;
if (((UINT_PTR)handle & ((sizeof(void *) << 1) - 1)) != sizeof(void *)) return NULL;
if (mem < data->mem_entries || mem >= data->mem_entries_end) return NULL;
if (mem->magic != MAGIC_LOCAL_USED) return NULL;
return mem;
@ -189,7 +187,7 @@ static inline struct mem_entry *unsafe_mem_from_HLOCAL( HLOCAL handle )
static inline void *unsafe_ptr_from_HLOCAL( HLOCAL handle )
{
if ((ULONG_PTR)handle & 2) return NULL;
if (((UINT_PTR)handle & ((sizeof(void *) << 1) - 1))) return NULL;
return handle;
}

View file

@ -368,9 +368,7 @@ static void test_GlobalAlloc(void)
mem = GlobalAlloc( GMEM_MOVEABLE, alloc_size );
ok( !!mem, "GlobalAlloc failed, error %lu\n", GetLastError() );
todo_wine
ok( ((UINT_PTR)mem & sizeof(void *)), "got unexpected entry align\n" );
todo_wine
ok( !((UINT_PTR)mem & (sizeof(void *) - 1)), "got unexpected entry align\n" );
entry = mem_entry_from_HANDLE( mem );
@ -414,9 +412,7 @@ static void test_GlobalAlloc(void)
ok( !tmp_mem, "GlobalFree failed, error %lu\n", GetLastError() );
ok( !!entry->flags, "got unexpected flags %#Ix\n", entry->flags );
ok( !((UINT_PTR)entry->flags & sizeof(void *)), "got unexpected ptr align\n" );
todo_wine_if(sizeof(void *) == 4)
ok( !((UINT_PTR)entry->flags & (sizeof(void *) - 1)), "got unexpected ptr align\n" );
todo_wine
ok( !entry->ptr, "got unexpected ptr %p\n", entry->ptr );
mem = GlobalAlloc( GMEM_MOVEABLE | GMEM_DISCARDABLE, 0 );
@ -543,29 +539,24 @@ static void test_GlobalAlloc(void)
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
flags = GlobalFlags( invalid_mem );
todo_wine
ok( flags == GMEM_INVALID_HANDLE, "GlobalFlags succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
size = GlobalSize( invalid_mem );
ok( size == 0, "GlobalSize succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
ptr = GlobalLock( invalid_mem );
ok( !ptr, "GlobalLock succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
ret = GlobalUnlock( invalid_mem );
ok( ret, "GlobalUnlock failed, error %lu\n", GetLastError() );
todo_wine
ok( ret, "GlobalUnlock failed, error %lu\n", GetLastError() );
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
tmp_mem = GlobalReAlloc( invalid_mem, 0, GMEM_MOVEABLE );
ok( !tmp_mem, "GlobalReAlloc succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
/* invalid pointers are caught */
@ -889,29 +880,23 @@ static void test_LocalAlloc(void)
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
flags = LocalFlags( invalid_mem );
todo_wine
ok( flags == LMEM_INVALID_HANDLE, "LocalFlags succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
size = LocalSize( invalid_mem );
ok( size == 0, "LocalSize succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
ptr = LocalLock( invalid_mem );
ok( !ptr, "LocalLock succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
ret = LocalUnlock( invalid_mem );
ok( !ret, "LocalUnlock succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
tmp_mem = LocalReAlloc( invalid_mem, 0, LMEM_MOVEABLE );
ok( !tmp_mem, "LocalReAlloc succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError() );
/* invalid pointers are caught */

View file

@ -585,8 +585,6 @@ struct kernelbase_global_data
struct mem_entry *mem_entries_end;
};
#include "pshpack1.h"
struct mem_entry
{
union
@ -594,15 +592,15 @@ struct mem_entry
struct
{
WORD magic;
void *ptr;
BYTE flags;
BYTE lock;
};
void *next_free;
};
void *ptr;
};
#include "poppack.h"
C_ASSERT(sizeof(struct mem_entry) == 2 * sizeof(void *));
#define MAX_MEM_HANDLES 0x10000
static struct mem_entry mem_entries[MAX_MEM_HANDLES];
@ -626,7 +624,7 @@ static inline struct mem_entry *unsafe_mem_from_HLOCAL( HLOCAL handle )
{
struct mem_entry *mem = CONTAINING_RECORD( handle, struct mem_entry, ptr );
struct kernelbase_global_data *data = &kernelbase_global_data;
if (!((ULONG_PTR)handle & 2)) return NULL;
if (((UINT_PTR)handle & ((sizeof(void *) << 1) - 1)) != sizeof(void *)) return NULL;
if (mem < data->mem_entries || mem >= data->mem_entries_end) return NULL;
if (mem->magic != MAGIC_LOCAL_USED) return NULL;
return mem;
@ -639,7 +637,7 @@ static inline HLOCAL HLOCAL_from_mem( struct mem_entry *mem )
static inline void *unsafe_ptr_from_HLOCAL( HLOCAL handle )
{
if ((ULONG_PTR)handle & 2) return NULL;
if (((UINT_PTR)handle & ((sizeof(void *) << 1) - 1))) return NULL;
return handle;
}