Rémi Bernon : win32u: Avoid invalid access when registered device alloc failed. (Coverity).

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


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Sat Aug  6 10:16:58 2022 +0200

win32u: Avoid invalid access when registered device alloc failed. (Coverity).

---

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

diff --git a/dlls/win32u/rawinput.c b/dlls/win32u/rawinput.c
index 2dc03e7fe2d..cf150b60a8c 100644
--- a/dlls/win32u/rawinput.c
+++ b/dlls/win32u/rawinput.c
@@ -821,6 +821,7 @@ static void register_rawinput_device( const RAWINPUTDEVICE *device )
 BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT device_count, UINT device_size )
 {
     struct rawinput_device *server_devices;
+    RAWINPUTDEVICE *new_registered_devices;
     SIZE_T size;
     BOOL ret;
     UINT i;
@@ -863,8 +864,15 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d
     }
 
     size = (SIZE_T)device_size * (registered_device_count + device_count);
-    registered_devices = realloc( registered_devices, size );
-    if (registered_devices) for (i = 0; i < device_count; ++i) register_rawinput_device( devices + i );
+    if (!(new_registered_devices = realloc( registered_devices, size )))
+    {
+        pthread_mutex_unlock( &rawinput_mutex );
+        SetLastError( ERROR_OUTOFMEMORY );
+        return FALSE;
+    }
+
+    registered_devices = new_registered_devices;
+    for (i = 0; i < device_count; ++i) register_rawinput_device( devices + i );
 
     if (!(device_count = registered_device_count)) server_devices = NULL;
     else if (!(server_devices = malloc( device_count * sizeof(*server_devices) )))
@@ -893,12 +901,6 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d
 
     pthread_mutex_unlock( &rawinput_mutex );
 
-    if (!registered_devices)
-    {
-        SetLastError( ERROR_OUTOFMEMORY );
-        return FALSE;
-    }
-
     return ret;
 }
 




More information about the wine-cvs mailing list