Alexandre Julliard : server: Add a helper function to validate a window handle.
Alexandre Julliard
julliard at winehq.org
Tue Aug 30 10:30:46 CDT 2016
Module: wine
Branch: master
Commit: 70dd64cf9799c0dd5cae867250c8f7fb7a360ace
URL: http://source.winehq.org/git/wine.git/?a=commit;h=70dd64cf9799c0dd5cae867250c8f7fb7a360ace
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Aug 30 18:08:36 2016 +0900
server: Add a helper function to validate a window handle.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/clipboard.c | 42 +++++++++---------------------------------
server/queue.c | 6 ++----
server/user.h | 8 ++++++++
3 files changed, 19 insertions(+), 37 deletions(-)
diff --git a/server/clipboard.c b/server/clipboard.c
index f640b50..a9bbaec 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -258,15 +258,11 @@ static int get_seqno( struct clipboard *clipboard )
DECL_HANDLER(open_clipboard)
{
struct clipboard *clipboard = get_process_clipboard();
- user_handle_t win = req->window;
+ user_handle_t win = 0;
if (!clipboard) return;
+ if (req->window && !(win = get_valid_window_handle( req->window ))) return;
- if (win && !get_user_object_handle( &win, USER_WINDOW ))
- {
- set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
- return;
- }
if (clipboard->open_thread && clipboard->open_win != win)
{
set_error( STATUS_INVALID_LOCK_SEQUENCE );
@@ -363,21 +359,11 @@ DECL_HANDLER(get_clipboard_info)
DECL_HANDLER(set_clipboard_viewer)
{
struct clipboard *clipboard = get_process_clipboard();
- user_handle_t viewer = req->viewer;
- user_handle_t previous = req->previous;
+ user_handle_t viewer = 0, previous = 0;
if (!clipboard) return;
-
- if (viewer && !get_user_object_handle( &viewer, USER_WINDOW ))
- {
- set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
- return;
- }
- if (previous && !get_user_object_handle( &previous, USER_WINDOW ))
- {
- set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
- return;
- }
+ if (req->viewer && !(viewer = get_valid_window_handle( req->viewer ))) return;
+ if (req->previous && !(previous = get_valid_window_handle( req->previous ))) return;
reply->old_viewer = clipboard->viewer;
reply->owner = clipboard->owner_win;
@@ -393,15 +379,10 @@ DECL_HANDLER(set_clipboard_viewer)
DECL_HANDLER(add_clipboard_listener)
{
struct clipboard *clipboard = get_process_clipboard();
- user_handle_t win = req->window;
+ user_handle_t win;
if (!clipboard) return;
-
- if (!get_user_object_handle( &win, USER_WINDOW ))
- {
- set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
- return;
- }
+ if (!(win = get_valid_window_handle( req->window ))) return;
add_listener( clipboard, win );
}
@@ -411,15 +392,10 @@ DECL_HANDLER(add_clipboard_listener)
DECL_HANDLER(remove_clipboard_listener)
{
struct clipboard *clipboard = get_process_clipboard();
- user_handle_t win = req->window;
+ user_handle_t win;
if (!clipboard) return;
-
- if (!get_user_object_handle( &win, USER_WINDOW ))
- {
- set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
- return;
- }
+ if (!(win = get_valid_window_handle( req->window ))) return;
if (!remove_listener( clipboard, win )) set_error( STATUS_INVALID_PARAMETER );
}
diff --git a/server/queue.c b/server/queue.c
index 387c652..c479b38 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -2685,10 +2685,9 @@ DECL_HANDLER(register_hotkey)
if (win_handle)
{
- if (!get_user_object_handle( &win_handle, USER_WINDOW ))
+ if (!(win_handle = get_valid_window_handle( win_handle )))
{
release_object( desktop );
- set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
return;
}
@@ -2754,10 +2753,9 @@ DECL_HANDLER(unregister_hotkey)
if (win_handle)
{
- if (!get_user_object_handle( &win_handle, USER_WINDOW ))
+ if (!(win_handle = get_valid_window_handle( win_handle )))
{
release_object( desktop );
- set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
return;
}
diff --git a/server/user.h b/server/user.h
index ad62b7d..e7eecd4 100644
--- a/server/user.h
+++ b/server/user.h
@@ -207,4 +207,12 @@ static inline int intersect_rect( rectangle_t *dst, const rectangle_t *src1, con
return (dst->left < dst->right && dst->top < dst->bottom);
}
+/* validate a window handle and return the full handle */
+static inline user_handle_t get_valid_window_handle( user_handle_t win )
+{
+ if (get_user_object_handle( &win, USER_WINDOW )) return win;
+ set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
+ return 0;
+}
+
#endif /* __WINE_SERVER_USER_H */
More information about the wine-cvs
mailing list