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