Rémi Bernon : win32u: Send the total number of registered devices to the server.

Alexandre Julliard julliard at winehq.org
Mon Aug 8 15:17:51 CDT 2022


Module: wine
Branch: master
Commit: 17bdb5060a6fe30d6aada2e63745f930acdc4f50
URL:    https://gitlab.winehq.org/wine/wine/-/commit/17bdb5060a6fe30d6aada2e63745f930acdc4f50

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Fri Aug  5 11:25:49 2022 +0200

win32u: Send the total number of registered devices to the server.

Instead of device_count which is the number of registration updates,
and execute the request within the rawinput_mutex to ensure atomicity
of the update and consistency between the client and the server state.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53468
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53487

---

 dlls/win32u/rawinput.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/dlls/win32u/rawinput.c b/dlls/win32u/rawinput.c
index 44951522442..2dc03e7fe2d 100644
--- a/dlls/win32u/rawinput.c
+++ b/dlls/win32u/rawinput.c
@@ -866,8 +866,15 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d
     registered_devices = realloc( registered_devices, size );
     if (registered_devices) for (i = 0; i < device_count; ++i) register_rawinput_device( devices + i );
 
-    server_devices = malloc( registered_device_count * sizeof(*server_devices) );
-    if (server_devices) for (i = 0; i < registered_device_count; ++i)
+    if (!(device_count = registered_device_count)) server_devices = NULL;
+    else if (!(server_devices = malloc( device_count * sizeof(*server_devices) )))
+    {
+        pthread_mutex_unlock( &rawinput_mutex );
+        SetLastError( ERROR_OUTOFMEMORY );
+        return FALSE;
+    }
+
+    for (i = 0; i < device_count; ++i)
     {
         server_devices[i].usage_page = registered_devices[i].usUsagePage;
         server_devices[i].usage = registered_devices[i].usUsage;
@@ -875,14 +882,6 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d
         server_devices[i].target = wine_server_user_handle( registered_devices[i].hwndTarget );
     }
 
-    pthread_mutex_unlock( &rawinput_mutex );
-
-    if (!registered_devices || !server_devices)
-    {
-        SetLastError( ERROR_OUTOFMEMORY );
-        return FALSE;
-    }
-
     SERVER_START_REQ( update_rawinput_devices )
     {
         wine_server_add_data( req, server_devices, device_count * sizeof(*server_devices) );
@@ -892,6 +891,14 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d
 
     free( server_devices );
 
+    pthread_mutex_unlock( &rawinput_mutex );
+
+    if (!registered_devices)
+    {
+        SetLastError( ERROR_OUTOFMEMORY );
+        return FALSE;
+    }
+
     return ret;
 }
 




More information about the wine-cvs mailing list