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