Paul Chitescu : user32: Use a safer method of freeing user handles to prevent zeroing out a newly allocated handle .
Alexandre Julliard
julliard at winehq.org
Fri Jun 18 09:58:36 CDT 2010
Module: wine
Branch: master
Commit: bb6769f4754d5bc8961b62219e20674058546fb3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bb6769f4754d5bc8961b62219e20674058546fb3
Author: Paul Chitescu <paulc at voip.null.ro>
Date: Fri Jun 18 14:09:38 2010 +0300
user32: Use a safer method of freeing user handles to prevent zeroing out a newly allocated handle.
---
dlls/user32/win.c | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 4dd8962..cbc949c 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -107,7 +107,7 @@ HANDLE alloc_user_handle( struct user_object *ptr, enum user_obj_type type )
assert( index < NB_USER_HANDLES );
ptr->handle = handle;
ptr->type = type;
- user_handles[index] = ptr;
+ InterlockedExchangePointer( &user_handles[index], ptr );
}
return handle;
}
@@ -161,8 +161,8 @@ void *free_user_handle( HANDLE handle, enum user_obj_type type )
SERVER_START_REQ( free_user_handle )
{
req->handle = wine_server_user_handle( handle );
- if (!wine_server_call( req )) user_handles[index] = NULL;
- else ptr = NULL;
+ if (wine_server_call( req )) ptr = NULL;
+ else InterlockedCompareExchangePointer( &user_handles[index], NULL, ptr );
}
SERVER_END_REQ;
release_user_handle_ptr( ptr );
@@ -243,7 +243,6 @@ static WND *create_window_handle( HWND parent, HWND owner, LPCWSTR name,
index = USER_HANDLE_TO_INDEX(handle);
assert( index < NB_USER_HANDLES );
- user_handles[index] = win;
win->obj.handle = handle;
win->obj.type = USER_WINDOW;
win->parent = full_parent;
@@ -251,6 +250,7 @@ static WND *create_window_handle( HWND parent, HWND owner, LPCWSTR name,
win->class = class;
win->winproc = get_class_winproc( class );
win->cbWndExtra = extra_bytes;
+ InterlockedExchangePointer( &user_handles[index], win );
if (WINPROC_IsUnicode( win->winproc, unicode )) win->flags |= WIN_ISUNICODE;
return win;
}
@@ -271,8 +271,8 @@ static void free_window_handle( HWND hwnd )
SERVER_START_REQ( destroy_window )
{
req->handle = wine_server_user_handle( hwnd );
- if (!wine_server_call_err( req )) user_handles[index] = NULL;
- else ptr = NULL;
+ if (wine_server_call_err( req )) ptr = NULL;
+ else InterlockedCompareExchangePointer( &user_handles[index], NULL, ptr );
}
SERVER_END_REQ;
release_user_handle_ptr( ptr );
@@ -815,7 +815,7 @@ static void destroy_thread_window( HWND hwnd )
if ((wndPtr->dwStyle & (WS_CHILD | WS_POPUP)) != WS_CHILD) menu = (HMENU)wndPtr->wIDmenu;
sys_menu = wndPtr->hSysMenu;
free_dce( wndPtr->dce, hwnd );
- user_handles[index] = NULL;
+ InterlockedCompareExchangePointer( &user_handles[index], NULL, wndPtr );
}
USER_Unlock();
More information about the wine-cvs
mailing list